@nowramp/form 0.2.1-beta.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/hooks/useRamp.ts","../src/data/countries.ts","../src/utils/provider-filters.ts","../src/context/RampContext.tsx","../src/i18n/en.ts","../src/i18n/languages.ts","../src/i18n/context.tsx","../src/components/form/RedirectScreen.tsx","../src/components/ui/Spinner.tsx","../src/components/CheckoutStep.tsx","../src/components/ProcessingStep.tsx","../src/components/CompleteStep.tsx","../src/components/ErrorStep.tsx","../src/data/cryptoData.ts","../src/components/ConfirmStep.tsx","../src/components/ui/Modal.tsx","../src/components/ui/Skeleton.tsx","../src/components/ui/icons.tsx","../src/components/ui/Toast.tsx","../src/components/ui/NRLogo.tsx","../src/components/form/LoadingScreen.tsx","../src/components/ui/BottomSheet.tsx","../src/components/ui/CloseButton.tsx","../src/components/ui/SearchInput.tsx","../src/components/modals/FiatCurrencyModal.tsx","../src/components/modals/CryptoCurrencyModal.tsx","../src/components/PaymentMethodSelector.tsx","../src/components/modals/PaymentMethodModal.tsx","../src/components/ui/ToggleSwitch.tsx","../src/components/modals/SettingsScreen.tsx","../src/components/modals/CountryPickerModal.tsx","../src/components/modals/LanguagePickerModal.tsx","../src/components/form/HeaderBar.tsx","../src/components/form/SpendCard.tsx","../src/components/ui/AnimatedNumber.tsx","../src/components/form/ReceiveCard.tsx","../src/components/form/PaymentCard.tsx","../src/components/form/ProviderCard.tsx","../src/components/modals/ChooseRampModal.tsx","../src/components/form/WalletCard.tsx","../src/components/form/CtaButton.tsx","../src/components/form/Footer.tsx","../src/components/form/RateBreakdown.tsx","../src/components/RampForm.tsx","../src/components/CheckoutForm.tsx","../src/components/ui/SkinSwatch.tsx"],"sourcesContent":["/**\n * React hooks for NowRamp Onramp API\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n RampApi,\n type RampApiConfig,\n type OnrampSupported,\n type QuotesResponse,\n type GetQuotesParams,\n type GetSupportedParams,\n type CheckoutIntent,\n type CreateCheckoutIntentParams,\n type Transaction,\n type FlowType,\n} from '@nowramp/sdk';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseRampConfigResult {\n config: OnrampSupported | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseQuotesResult {\n quotes: QuotesResponse | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseCheckoutIntentResult {\n order: CheckoutIntent | null;\n loading: boolean;\n error: Error | null;\n createOrder: (params: CreateCheckoutIntentParams) => Promise<CheckoutIntent>;\n reset: () => void;\n}\n\nexport interface UseTransactionResult {\n status: Transaction | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\n/**\n * Hook to fetch onramp supported configuration\n * Returns gateways, currencies, and payment methods\n */\nexport function useRampConfig(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n orderType?: FlowType,\n country?: string\n): UseRampConfigResult {\n const [data, setData] = useState<OnrampSupported | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n // Memoize API instance\n if (!apiRef.current || apiRef.current !== config) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n }\n\n const fetchConfig = useCallback(async () => {\n if (!config.projectId) {\n setError(new Error('projectId is required'));\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const supportedParams: GetSupportedParams = {};\n if (orderType) supportedParams.orderType = orderType;\n if (country) supportedParams.country = country;\n const result = await apiRef.current!.getSupported(supportedParams);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch config'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, orderType, country]);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n return { config: data, loading, error, refetch: fetchConfig };\n}\n\n/**\n * Hook to fetch quotes from all gateways\n * Auto-refreshes when params change\n */\nexport function useQuotes(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n params: GetQuotesParams | null\n): UseQuotesResult {\n const [data, setData] = useState<QuotesResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const fetchIdRef = useRef(0);\n\n useEffect(() => {\n // Bump fetch ID on every param change to invalidate in-flight requests\n const id = ++fetchIdRef.current;\n\n if (!params || !config.projectId) {\n setData(null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n apiRef.current!.getQuotes(params).then(\n (result) => {\n if (fetchIdRef.current === id) {\n setData(result);\n setLoading(false);\n }\n },\n (err) => {\n if (fetchIdRef.current === id) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n setData(null);\n setLoading(false);\n }\n }\n );\n }, [config.projectId, params?.fiatCurrency, params?.fiatAmount, params?.cryptoAmount, params?.cryptoCurrency, params?.network, params?.paymentMethodId, params?.country, params?.orderType]);\n\n const refetch = useCallback(async () => {\n if (!params || !config.projectId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await apiRef.current!.getQuotes(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, params]);\n\n return { quotes: data, loading, error, refetch };\n}\n\n/**\n * Hook to create a checkout intent\n */\nexport function useCheckoutIntent(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>\n): UseCheckoutIntentResult {\n const [order, setOrder] = useState<CheckoutIntent | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const createOrder = useCallback(async (params: CreateCheckoutIntentParams): Promise<CheckoutIntent> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.createCheckoutIntent(params);\n setOrder(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create checkout intent');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n setOrder(null);\n setError(null);\n }, []);\n\n return { order, loading, error, createOrder, reset };\n}\n\n/**\n * Hook to poll transaction status\n */\nexport function useTransaction(\n config: Pick<RampApiConfig, 'apiUrl'>,\n transactionId: string | null,\n options?: { pollInterval?: number; initialDelay?: number }\n): UseTransactionResult {\n const [status, setStatus] = useState<Transaction | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n if (!apiRef.current) {\n apiRef.current = new RampApi({ apiKey: '', projectId: '', ...config });\n }\n\n const fetchStatus = useCallback(async () => {\n if (!transactionId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.getTransaction(transactionId);\n setStatus(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch status'));\n } finally {\n setLoading(false);\n }\n }, [transactionId]);\n\n // Initial fetch (with optional delay to let checkout iframe load first)\n useEffect(() => {\n if (!transactionId) return;\n\n const delay = options?.initialDelay ?? 0;\n if (delay > 0) {\n const timer = setTimeout(fetchStatus, delay);\n return () => clearTimeout(timer);\n }\n\n fetchStatus();\n }, [fetchStatus, transactionId, options?.initialDelay]);\n\n // Polling — only start after the initial (possibly delayed) fetch has\n // returned a status. Without the `!status` guard the setInterval would\n // bypass initialDelay entirely, firing its first callback at pollInterval\n // (e.g. 5 s) even though we asked for a 15 s delay.\n useEffect(() => {\n if (!transactionId || !options?.pollInterval) return;\n\n // Wait for the initial fetch to populate status before polling\n if (!status) return;\n\n // Stop polling if order is in terminal state\n const terminalStatuses = ['completed', 'failed', 'cancelled', 'expired', 'refunded'];\n if (terminalStatuses.includes(status.status)) {\n return;\n }\n\n const interval = setInterval(fetchStatus, options.pollInterval);\n return () => clearInterval(interval);\n }, [transactionId, options?.pollInterval, status?.status, fetchStatus]);\n\n return { status, loading, error, refetch: fetchStatus };\n}\n","/**\n * Country list with default fiat currency mapping\n * Used for geo-based fiat auto-selection\n */\n\nexport interface Country {\n /** ISO 3166-1 alpha-2 country code (lowercase) */\n code: string;\n /** Display name */\n name: string;\n /** Default fiat currency code for this country */\n defaultFiat: string;\n}\n\nexport const COUNTRIES: Country[] = [\n { code: 'ad', name: 'Andorra', defaultFiat: 'EUR' },\n { code: 'ae', name: 'United Arab Emirates', defaultFiat: 'AED' },\n { code: 'af', name: 'Afghanistan', defaultFiat: 'USD' },\n { code: 'ag', name: 'Antigua and Barbuda', defaultFiat: 'USD' },\n { code: 'al', name: 'Albania', defaultFiat: 'ALL' },\n { code: 'am', name: 'Armenia', defaultFiat: 'USD' },\n { code: 'ao', name: 'Angola', defaultFiat: 'USD' },\n { code: 'ar', name: 'Argentina', defaultFiat: 'ARS' },\n { code: 'at', name: 'Austria', defaultFiat: 'EUR' },\n { code: 'au', name: 'Australia', defaultFiat: 'AUD' },\n { code: 'az', name: 'Azerbaijan', defaultFiat: 'USD' },\n { code: 'ba', name: 'Bosnia and Herzegovina', defaultFiat: 'EUR' },\n { code: 'bb', name: 'Barbados', defaultFiat: 'USD' },\n { code: 'bd', name: 'Bangladesh', defaultFiat: 'USD' },\n { code: 'be', name: 'Belgium', defaultFiat: 'EUR' },\n { code: 'bf', name: 'Burkina Faso', defaultFiat: 'USD' },\n { code: 'bg', name: 'Bulgaria', defaultFiat: 'EUR' },\n { code: 'bh', name: 'Bahrain', defaultFiat: 'USD' },\n { code: 'bi', name: 'Burundi', defaultFiat: 'USD' },\n { code: 'bj', name: 'Benin', defaultFiat: 'USD' },\n { code: 'bn', name: 'Brunei', defaultFiat: 'USD' },\n { code: 'bo', name: 'Bolivia', defaultFiat: 'USD' },\n { code: 'br', name: 'Brazil', defaultFiat: 'BRL' },\n { code: 'bs', name: 'Bahamas', defaultFiat: 'USD' },\n { code: 'bt', name: 'Bhutan', defaultFiat: 'USD' },\n { code: 'bw', name: 'Botswana', defaultFiat: 'USD' },\n { code: 'by', name: 'Belarus', defaultFiat: 'USD' },\n { code: 'bz', name: 'Belize', defaultFiat: 'USD' },\n { code: 'ca', name: 'Canada', defaultFiat: 'CAD' },\n { code: 'cd', name: 'DR Congo', defaultFiat: 'USD' },\n { code: 'cf', name: 'Central African Republic', defaultFiat: 'USD' },\n { code: 'ch', name: 'Switzerland', defaultFiat: 'CHF' },\n { code: 'ci', name: \"Cote d'Ivoire\", defaultFiat: 'USD' },\n { code: 'cl', name: 'Chile', defaultFiat: 'CLP' },\n { code: 'cm', name: 'Cameroon', defaultFiat: 'USD' },\n { code: 'cn', name: 'China', defaultFiat: 'USD' },\n { code: 'co', name: 'Colombia', defaultFiat: 'USD' },\n { code: 'cr', name: 'Costa Rica', defaultFiat: 'USD' },\n { code: 'cu', name: 'Cuba', defaultFiat: 'USD' },\n { code: 'cv', name: 'Cape Verde', defaultFiat: 'USD' },\n { code: 'cy', name: 'Cyprus', defaultFiat: 'EUR' },\n { code: 'cz', name: 'Czech Republic', defaultFiat: 'CZK' },\n { code: 'de', name: 'Germany', defaultFiat: 'EUR' },\n { code: 'dj', name: 'Djibouti', defaultFiat: 'USD' },\n { code: 'dk', name: 'Denmark', defaultFiat: 'DKK' },\n { code: 'dm', name: 'Dominica', defaultFiat: 'USD' },\n { code: 'do', name: 'Dominican Republic', defaultFiat: 'USD' },\n { code: 'dz', name: 'Algeria', defaultFiat: 'USD' },\n { code: 'ec', name: 'Ecuador', defaultFiat: 'USD' },\n { code: 'ee', name: 'Estonia', defaultFiat: 'EUR' },\n { code: 'eg', name: 'Egypt', defaultFiat: 'USD' },\n { code: 'er', name: 'Eritrea', defaultFiat: 'USD' },\n { code: 'es', name: 'Spain', defaultFiat: 'EUR' },\n { code: 'et', name: 'Ethiopia', defaultFiat: 'USD' },\n { code: 'fi', name: 'Finland', defaultFiat: 'EUR' },\n { code: 'fj', name: 'Fiji', defaultFiat: 'USD' },\n { code: 'fr', name: 'France', defaultFiat: 'EUR' },\n { code: 'ga', name: 'Gabon', defaultFiat: 'USD' },\n { code: 'gb', name: 'United Kingdom', defaultFiat: 'GBP' },\n { code: 'gd', name: 'Grenada', defaultFiat: 'USD' },\n { code: 'ge', name: 'Georgia', defaultFiat: 'USD' },\n { code: 'gh', name: 'Ghana', defaultFiat: 'USD' },\n { code: 'gm', name: 'Gambia', defaultFiat: 'USD' },\n { code: 'gn', name: 'Guinea', defaultFiat: 'USD' },\n { code: 'gq', name: 'Equatorial Guinea', defaultFiat: 'USD' },\n { code: 'gr', name: 'Greece', defaultFiat: 'EUR' },\n { code: 'gt', name: 'Guatemala', defaultFiat: 'USD' },\n { code: 'gw', name: 'Guinea-Bissau', defaultFiat: 'USD' },\n { code: 'gy', name: 'Guyana', defaultFiat: 'USD' },\n { code: 'hk', name: 'Hong Kong', defaultFiat: 'HKD' },\n { code: 'hn', name: 'Honduras', defaultFiat: 'USD' },\n { code: 'hr', name: 'Croatia', defaultFiat: 'EUR' },\n { code: 'ht', name: 'Haiti', defaultFiat: 'USD' },\n { code: 'hu', name: 'Hungary', defaultFiat: 'EUR' },\n { code: 'id', name: 'Indonesia', defaultFiat: 'IDR' },\n { code: 'ie', name: 'Ireland', defaultFiat: 'EUR' },\n { code: 'il', name: 'Israel', defaultFiat: 'USD' },\n { code: 'in', name: 'India', defaultFiat: 'INR' },\n { code: 'iq', name: 'Iraq', defaultFiat: 'USD' },\n { code: 'ir', name: 'Iran', defaultFiat: 'USD' },\n { code: 'is', name: 'Iceland', defaultFiat: 'EUR' },\n { code: 'it', name: 'Italy', defaultFiat: 'EUR' },\n { code: 'jm', name: 'Jamaica', defaultFiat: 'USD' },\n { code: 'jo', name: 'Jordan', defaultFiat: 'USD' },\n { code: 'jp', name: 'Japan', defaultFiat: 'JPY' },\n { code: 'ke', name: 'Kenya', defaultFiat: 'USD' },\n { code: 'kg', name: 'Kyrgyzstan', defaultFiat: 'USD' },\n { code: 'kh', name: 'Cambodia', defaultFiat: 'USD' },\n { code: 'ki', name: 'Kiribati', defaultFiat: 'USD' },\n { code: 'km', name: 'Comoros', defaultFiat: 'USD' },\n { code: 'kn', name: 'Saint Kitts and Nevis', defaultFiat: 'USD' },\n { code: 'kr', name: 'South Korea', defaultFiat: 'KRW' },\n { code: 'kw', name: 'Kuwait', defaultFiat: 'USD' },\n { code: 'kz', name: 'Kazakhstan', defaultFiat: 'USD' },\n { code: 'la', name: 'Laos', defaultFiat: 'USD' },\n { code: 'lb', name: 'Lebanon', defaultFiat: 'USD' },\n { code: 'lc', name: 'Saint Lucia', defaultFiat: 'USD' },\n { code: 'li', name: 'Liechtenstein', defaultFiat: 'CHF' },\n { code: 'lk', name: 'Sri Lanka', defaultFiat: 'USD' },\n { code: 'lr', name: 'Liberia', defaultFiat: 'USD' },\n { code: 'ls', name: 'Lesotho', defaultFiat: 'ZAR' },\n { code: 'lt', name: 'Lithuania', defaultFiat: 'EUR' },\n { code: 'lu', name: 'Luxembourg', defaultFiat: 'EUR' },\n { code: 'lv', name: 'Latvia', defaultFiat: 'EUR' },\n { code: 'ly', name: 'Libya', defaultFiat: 'USD' },\n { code: 'ma', name: 'Morocco', defaultFiat: 'USD' },\n { code: 'mc', name: 'Monaco', defaultFiat: 'EUR' },\n { code: 'md', name: 'Moldova', defaultFiat: 'EUR' },\n { code: 'me', name: 'Montenegro', defaultFiat: 'EUR' },\n { code: 'mg', name: 'Madagascar', defaultFiat: 'USD' },\n { code: 'mk', name: 'North Macedonia', defaultFiat: 'EUR' },\n { code: 'ml', name: 'Mali', defaultFiat: 'USD' },\n { code: 'mm', name: 'Myanmar', defaultFiat: 'USD' },\n { code: 'mn', name: 'Mongolia', defaultFiat: 'USD' },\n { code: 'mr', name: 'Mauritania', defaultFiat: 'USD' },\n { code: 'mt', name: 'Malta', defaultFiat: 'EUR' },\n { code: 'mu', name: 'Mauritius', defaultFiat: 'USD' },\n { code: 'mv', name: 'Maldives', defaultFiat: 'USD' },\n { code: 'mw', name: 'Malawi', defaultFiat: 'USD' },\n { code: 'mx', name: 'Mexico', defaultFiat: 'MXN' },\n { code: 'my', name: 'Malaysia', defaultFiat: 'USD' },\n { code: 'mz', name: 'Mozambique', defaultFiat: 'USD' },\n { code: 'na', name: 'Namibia', defaultFiat: 'ZAR' },\n { code: 'ne', name: 'Niger', defaultFiat: 'USD' },\n { code: 'ng', name: 'Nigeria', defaultFiat: 'NGN' },\n { code: 'ni', name: 'Nicaragua', defaultFiat: 'USD' },\n { code: 'nl', name: 'Netherlands', defaultFiat: 'EUR' },\n { code: 'no', name: 'Norway', defaultFiat: 'NOK' },\n { code: 'np', name: 'Nepal', defaultFiat: 'USD' },\n { code: 'nr', name: 'Nauru', defaultFiat: 'AUD' },\n { code: 'nz', name: 'New Zealand', defaultFiat: 'NZD' },\n { code: 'om', name: 'Oman', defaultFiat: 'USD' },\n { code: 'pa', name: 'Panama', defaultFiat: 'USD' },\n { code: 'pe', name: 'Peru', defaultFiat: 'USD' },\n { code: 'pg', name: 'Papua New Guinea', defaultFiat: 'USD' },\n { code: 'ph', name: 'Philippines', defaultFiat: 'PHP' },\n { code: 'pk', name: 'Pakistan', defaultFiat: 'USD' },\n { code: 'pl', name: 'Poland', defaultFiat: 'PLN' },\n { code: 'pt', name: 'Portugal', defaultFiat: 'EUR' },\n { code: 'pw', name: 'Palau', defaultFiat: 'USD' },\n { code: 'py', name: 'Paraguay', defaultFiat: 'USD' },\n { code: 'qa', name: 'Qatar', defaultFiat: 'QAR' },\n { code: 'ro', name: 'Romania', defaultFiat: 'EUR' },\n { code: 'rs', name: 'Serbia', defaultFiat: 'EUR' },\n { code: 'ru', name: 'Russia', defaultFiat: 'USD' },\n { code: 'rw', name: 'Rwanda', defaultFiat: 'USD' },\n { code: 'sa', name: 'Saudi Arabia', defaultFiat: 'SAR' },\n { code: 'sb', name: 'Solomon Islands', defaultFiat: 'USD' },\n { code: 'sc', name: 'Seychelles', defaultFiat: 'USD' },\n { code: 'sd', name: 'Sudan', defaultFiat: 'USD' },\n { code: 'se', name: 'Sweden', defaultFiat: 'SEK' },\n { code: 'sg', name: 'Singapore', defaultFiat: 'SGD' },\n { code: 'si', name: 'Slovenia', defaultFiat: 'EUR' },\n { code: 'sk', name: 'Slovakia', defaultFiat: 'EUR' },\n { code: 'sl', name: 'Sierra Leone', defaultFiat: 'USD' },\n { code: 'sm', name: 'San Marino', defaultFiat: 'EUR' },\n { code: 'sn', name: 'Senegal', defaultFiat: 'USD' },\n { code: 'so', name: 'Somalia', defaultFiat: 'USD' },\n { code: 'sr', name: 'Suriname', defaultFiat: 'USD' },\n { code: 'ss', name: 'South Sudan', defaultFiat: 'USD' },\n { code: 'sv', name: 'El Salvador', defaultFiat: 'USD' },\n { code: 'sy', name: 'Syria', defaultFiat: 'USD' },\n { code: 'sz', name: 'Eswatini', defaultFiat: 'ZAR' },\n { code: 'td', name: 'Chad', defaultFiat: 'USD' },\n { code: 'tg', name: 'Togo', defaultFiat: 'USD' },\n { code: 'th', name: 'Thailand', defaultFiat: 'THB' },\n { code: 'tj', name: 'Tajikistan', defaultFiat: 'USD' },\n { code: 'tl', name: 'Timor-Leste', defaultFiat: 'USD' },\n { code: 'tm', name: 'Turkmenistan', defaultFiat: 'USD' },\n { code: 'tn', name: 'Tunisia', defaultFiat: 'USD' },\n { code: 'to', name: 'Tonga', defaultFiat: 'USD' },\n { code: 'tr', name: 'Turkey', defaultFiat: 'TRY' },\n { code: 'tt', name: 'Trinidad and Tobago', defaultFiat: 'USD' },\n { code: 'tv', name: 'Tuvalu', defaultFiat: 'AUD' },\n { code: 'tw', name: 'Taiwan', defaultFiat: 'TWD' },\n { code: 'tz', name: 'Tanzania', defaultFiat: 'USD' },\n { code: 'ua', name: 'Ukraine', defaultFiat: 'USD' },\n { code: 'ug', name: 'Uganda', defaultFiat: 'USD' },\n { code: 'us', name: 'United States', defaultFiat: 'USD' },\n { code: 'uy', name: 'Uruguay', defaultFiat: 'USD' },\n { code: 'uz', name: 'Uzbekistan', defaultFiat: 'USD' },\n { code: 'va', name: 'Vatican City', defaultFiat: 'EUR' },\n { code: 'vc', name: 'Saint Vincent and the Grenadines', defaultFiat: 'USD' },\n { code: 've', name: 'Venezuela', defaultFiat: 'USD' },\n { code: 'vn', name: 'Vietnam', defaultFiat: 'VND' },\n { code: 'vu', name: 'Vanuatu', defaultFiat: 'USD' },\n { code: 'ws', name: 'Samoa', defaultFiat: 'USD' },\n { code: 'ye', name: 'Yemen', defaultFiat: 'USD' },\n { code: 'za', name: 'South Africa', defaultFiat: 'ZAR' },\n { code: 'zm', name: 'Zambia', defaultFiat: 'USD' },\n { code: 'zw', name: 'Zimbabwe', defaultFiat: 'USD' },\n];\n\n/** Precomputed lookup by country code */\nexport const COUNTRY_MAP: Record<string, Country> = Object.fromEntries(\n COUNTRIES.map((c) => [c.code, c])\n);\n\n/**\n * Resolve the default fiat currency for a country.\n * Validates against available fiats, falls back to USD then first available.\n */\nexport function getDefaultFiatForCountry(\n countryCode: string | undefined | null,\n supportedFiats?: string[]\n): string {\n if (!countryCode) return 'USD';\n\n const country = COUNTRY_MAP[countryCode.toLowerCase()];\n const preferredFiat = country?.defaultFiat || 'USD';\n\n // If no supported fiats list, return the preferred fiat directly\n if (!supportedFiats || supportedFiats.length === 0) return preferredFiat;\n\n // Check if the country's default fiat is supported\n if (supportedFiats.includes(preferredFiat)) return preferredFiat;\n\n // Fall back to USD if supported\n if (supportedFiats.includes('USD')) return 'USD';\n\n // Last resort: first available fiat\n return supportedFiats[0] || 'USD';\n}\n","/**\n * Provider-aware cascading filters for currency/network/payment method selection.\n *\n * Pure functions with no React deps — testable independently.\n * Uses the `providers` arrays from the backend's AggregatedConfig to ensure\n * only provider-supported combinations are selectable in the form.\n */\n\nimport type {\n SupportedFiat,\n SupportedCrypto,\n SupportedPaymentMethod,\n} from '@nowramp/sdk';\n\n/**\n * Build-time compat flag. When true (default), undefined providers arrays\n * are treated as wildcards (match everything). Set to false and rebuild\n * once all providers are fully annotated to enable strict filtering.\n */\nexport const PROVIDERS_WILDCARD_COMPAT = true;\n\n/**\n * Returns true if two providers arrays share at least one common provider.\n *\n * Semantics:\n * undefined → wildcard when compat is true, else no match\n * [] → \"no providers support this\", always returns false\n */\nexport function providersOverlap(\n a?: string[],\n b?: string[],\n compat = PROVIDERS_WILDCARD_COMPAT,\n): boolean {\n if (a === undefined || b === undefined) return compat;\n if (a.length === 0 || b.length === 0) return false;\n return a.some((p) => b.includes(p));\n}\n\n/** Filter fiats by provider overlap with selected network. */\nexport function filterAvailableFiats(\n fiats: SupportedFiat[],\n networkProviders: string[] | undefined,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedFiat[] {\n return fiats.filter((f) => providersOverlap(f.providers, networkProviders, compat));\n}\n\n/**\n * Filter cryptos: keep only networks with provider overlap against fiat providers.\n * Drop cryptos with zero remaining networks.\n */\nexport function filterAvailableCryptos(\n cryptos: SupportedCrypto[],\n fiatProviders: string[] | undefined,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedCrypto[] {\n const result: SupportedCrypto[] = [];\n for (const crypto of cryptos) {\n const filteredNetworks = crypto.networks.filter((n) =>\n providersOverlap(n.providers, fiatProviders, compat),\n );\n if (filteredNetworks.length > 0) {\n result.push(\n filteredNetworks.length === crypto.networks.length\n ? crypto\n : { ...crypto, networks: filteredNetworks },\n );\n }\n }\n return result;\n}\n\n/** Filter payment methods by provider overlap with network AND supportedFiats. */\nexport function filterAvailablePaymentMethods(\n methods: SupportedPaymentMethod[],\n networkProviders: string[] | undefined,\n fiatCurrency: string,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedPaymentMethod[] {\n if (!fiatCurrency) return [];\n return methods.filter(\n (m) =>\n m.supportedFiats.includes(fiatCurrency) &&\n providersOverlap(m.providers, networkProviders, compat),\n );\n}\n\n// =============================================================================\n// Reconciliation\n// =============================================================================\n\nexport interface ReconciledSelections {\n cryptoCurrency?: string;\n network?: string;\n fiatCurrency?: string;\n paymentMethodId?: string;\n}\n\nexport interface LockFlags {\n cryptoLocked?: boolean;\n networkLocked?: boolean;\n fiatLocked?: boolean;\n}\n\n/**\n * Pure reconciliation: given current selections, filtered lists, and lock flags,\n * returns a plain object with corrected values (or null if no change needed).\n */\nexport function reconcileSelections(\n state: {\n cryptoCurrency: string;\n network: string;\n fiatCurrency: string;\n paymentMethodId: string;\n },\n filtered: {\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n },\n locks: LockFlags,\n): ReconciledSelections | null {\n const result: ReconciledSelections = {};\n let changed = false;\n\n // --- Crypto + Network ---\n if (!locks.cryptoLocked && !locks.networkLocked) {\n // Both unlocked: validate crypto+network pair, correct both if invalid\n const cryptoValid =\n state.cryptoCurrency &&\n filtered.availableCryptos.some(\n (c) =>\n c.code === state.cryptoCurrency &&\n c.networks.some((n) => n.id === state.network),\n );\n if (!cryptoValid && filtered.availableCryptos.length > 0) {\n // Prefer BTC on Bitcoin network as the default\n const btc = filtered.availableCryptos.find((c) => c.code === 'BTC');\n const first = btc || filtered.availableCryptos[0];\n const net =\n first.networks.find((n) => n.isDefault) || first.networks[0];\n if (first.code !== state.cryptoCurrency) {\n result.cryptoCurrency = first.code;\n changed = true;\n }\n if (net && net.id !== state.network) {\n result.network = net.id;\n changed = true;\n }\n }\n } else if (!locks.cryptoLocked && locks.networkLocked) {\n // Network locked, crypto unlocked: pick a crypto that supports the locked network\n const cryptoValid =\n state.cryptoCurrency &&\n filtered.availableCryptos.some(\n (c) =>\n c.code === state.cryptoCurrency &&\n c.networks.some((n) => n.id === state.network),\n );\n if (!cryptoValid) {\n const compatible = filtered.availableCryptos.find((c) =>\n c.networks.some((n) => n.id === state.network),\n );\n if (compatible && compatible.code !== state.cryptoCurrency) {\n result.cryptoCurrency = compatible.code;\n changed = true;\n }\n }\n } else if (locks.cryptoLocked && !locks.networkLocked) {\n // Crypto locked, network unlocked: correct network against locked crypto's available networks\n const lockedCrypto = filtered.availableCryptos.find(\n (c) => c.code === state.cryptoCurrency,\n );\n if (lockedCrypto) {\n const networkValid = lockedCrypto.networks.some(\n (n) => n.id === state.network,\n );\n if (!networkValid && lockedCrypto.networks.length > 0) {\n const net =\n lockedCrypto.networks.find((n) => n.isDefault) ||\n lockedCrypto.networks[0];\n if (net.id !== state.network) {\n result.network = net.id;\n changed = true;\n }\n }\n }\n }\n // Both locked: no corrections possible\n\n // --- Fiat (prefer USD, else first available) ---\n if (!locks.fiatLocked) {\n const fiatValid =\n state.fiatCurrency &&\n filtered.availableFiats.some((f) => f.code === state.fiatCurrency);\n if (!fiatValid && filtered.availableFiats.length > 0) {\n const usd = filtered.availableFiats.find((f) => f.code === 'USD');\n const target = usd || filtered.availableFiats[0];\n if (target.code !== state.fiatCurrency) {\n result.fiatCurrency = target.code;\n changed = true;\n }\n }\n }\n\n // --- Payment Method (prefer card/debit, else first) ---\n const methodValid =\n state.paymentMethodId &&\n filtered.availablePaymentMethods.some(\n (m) => m.id === state.paymentMethodId,\n );\n if (!methodValid && filtered.availablePaymentMethods.length > 0) {\n const card = filtered.availablePaymentMethods.find(\n (m) => m.id.includes('card') || m.id.includes('debit'),\n );\n const target = card || filtered.availablePaymentMethods[0];\n if (target.id !== state.paymentMethodId) {\n result.paymentMethodId = target.id;\n changed = true;\n }\n }\n\n return changed ? result : null;\n}\n\n// =============================================================================\n// Selection Unsupported Check\n// =============================================================================\n\n/**\n * Returns true when a locked selection has no provider support in the current flow.\n * Drives CTA disable + message in the form.\n */\nexport function isSelectionUnsupported(\n config: { cryptos?: SupportedCrypto[]; fiats?: SupportedFiat[] },\n state: { cryptoCurrency: string; network: string; fiatCurrency: string },\n locks: LockFlags,\n filtered: {\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n },\n): boolean {\n // A. Locked crypto+network\n if (locks.cryptoLocked) {\n const crypto = config.cryptos?.find(\n (c) => c.code === state.cryptoCurrency,\n );\n if (!crypto) return true;\n const network = crypto.networks?.find((n) => n.id === state.network);\n if (!network) return true;\n if (network.providers !== undefined && network.providers.length === 0)\n return true;\n // Has explicit providers but no fiats or payment methods overlap\n if (\n network.providers !== undefined &&\n (filtered.availableFiats.length === 0 ||\n filtered.availablePaymentMethods.length === 0)\n )\n return true;\n }\n\n // B. Locked network only (not crypto-locked)\n if (locks.networkLocked && !locks.cryptoLocked) {\n const hasNetworkSupport = filtered.availableCryptos.some((c) =>\n c.networks.some((n) => n.id === state.network),\n );\n if (!hasNetworkSupport) return true;\n }\n\n // C. Locked fiat\n if (locks.fiatLocked) {\n const fiat = config.fiats?.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return true;\n if (fiat.providers !== undefined && fiat.providers.length === 0)\n return true;\n if (\n fiat.providers !== undefined &&\n filtered.availableCryptos.length === 0\n )\n return true;\n }\n\n return false;\n}\n","/**\n * Ramp Context Provider\n * Provides configuration and state management for the ramp form\n */\n\nimport React, { createContext, useContext, useReducer, useCallback, useMemo, useRef } from 'react';\nimport type {\n RampApiConfig,\n OnrampSupported,\n QuotesResponse,\n Quote,\n CheckoutIntent,\n Transaction,\n FieldLocksConfig,\n FlowType,\n SupportedFiat,\n SupportedCrypto,\n SupportedPaymentMethod,\n UnavailableGateway,\n} from '@nowramp/sdk';\nimport {\n useRampConfig,\n useQuotes,\n useCheckoutIntent,\n useTransaction,\n} from '../hooks/useRamp';\nimport { getDefaultFiatForCountry } from '../data/countries';\nimport {\n filterAvailableFiats,\n filterAvailableCryptos,\n filterAvailablePaymentMethods,\n reconcileSelections,\n isSelectionUnsupported,\n} from '../utils/provider-filters';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RampStep =\n | 'confirm' // Confirm pre-filled order (session mode)\n | 'amount' // Select currency and amount\n | 'quotes' // View and compare quotes\n | 'wallet' // Enter wallet address\n | 'checkout' // Provider checkout (iframe/redirect)\n | 'processing' // Waiting for completion\n | 'complete' // Success\n | 'error'; // Error state\n\nexport interface RampFormState {\n step: RampStep;\n flowType: FlowType;\n fiatCurrency: string;\n fiatAmount: string;\n cryptoCurrency: string;\n cryptoAmount: string;\n network: string;\n paymentMethodId: string;\n walletAddress: string;\n walletError: string | null;\n selectedProvider: string | null;\n selectedQuote: Quote | null;\n customerId: string;\n email: string;\n country: string;\n /** How country was set: 'auto' (GeoIP), 'manual' (user pick), or '' (not set) */\n countrySource: 'auto' | 'manual' | '';\n errorMessage: string | null;\n}\n\n/** @internal exported for unit testing */\nexport type RampAction =\n | { type: 'SET_STEP'; step: RampStep }\n | { type: 'SET_FLOW_TYPE'; flowType: FlowType; fieldLocks?: FieldLocksConfig | null }\n | { type: 'SET_FIAT_CURRENCY'; currency: string }\n | { type: 'SET_FIAT_AMOUNT'; amount: string }\n | { type: 'SET_CRYPTO_CURRENCY'; currency: string }\n | { type: 'SET_CRYPTO_AMOUNT'; amount: string }\n | { type: 'SET_NETWORK'; network: string }\n | { type: 'SET_CRYPTO_CHAIN'; chain: string }\n | { type: 'SET_PAYMENT_METHOD'; methodId: string }\n | { type: 'SET_WALLET_ADDRESS'; address: string }\n | { type: 'SET_WALLET_ERROR'; message: string }\n | { type: 'SELECT_QUOTE'; quote: Quote }\n | { type: 'SET_CUSTOMER_ID'; customerId: string }\n | { type: 'SET_EMAIL'; email: string }\n | { type: 'SET_COUNTRY'; country: string }\n | { type: 'SET_COUNTRY_AUTO'; country: string }\n | { type: 'SET_ERROR'; message: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'RESET' };\n\nexport interface RampContextValue {\n // Configuration\n apiConfig: Pick<RampApiConfig, 'apiUrl' | 'projectId'>;\n /** Base URL for static assets (crypto icons, flags). Empty string = root-relative. */\n assetBaseUrl: string;\n config: OnrampSupported | null;\n configLoading: boolean;\n configError: Error | null;\n\n // Form state\n state: RampFormState;\n dispatch: React.Dispatch<RampAction>;\n\n // Quotes\n quotes: QuotesResponse | null;\n quotesLoading: boolean;\n quotesError: Error | null;\n fetchQuotes: () => void;\n\n // Order\n order: CheckoutIntent | null;\n orderLoading: boolean;\n orderError: Error | null;\n createOrder: () => Promise<void>;\n\n // Order status\n orderStatus: Transaction | null;\n orderStatusLoading: boolean;\n\n // Session-aware props\n fieldLocks: FieldLocksConfig | null;\n defaultGateway: string | null;\n\n // Filtered lists (provider-aware cascading filters)\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n selectionUnsupported: boolean;\n\n // Empty quotes feedback\n quotesEmpty: boolean;\n bestUnavailableReason: string | null;\n\n // Validation\n amountError: string | null;\n\n // Navigation helpers\n goToStep: (step: RampStep) => void;\n goBack: () => void;\n canProceed: boolean;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** Strip trailing zeros and limit decimal places (cleans backend values like \"33.00000000\") */\nfunction normalizeAmount(value: string, maxDecimals: number): string {\n if (!value) return value;\n const dotIndex = value.indexOf('.');\n if (dotIndex === -1) return value;\n let result = value;\n if (result.length - dotIndex - 1 > maxDecimals) {\n result = result.slice(0, dotIndex + maxDecimals + 1);\n }\n result = result.replace(/0+$/, '').replace(/\\.$/, '');\n return result;\n}\n\n/** @internal exported for unit testing */\nexport function isQuotesEmpty(\n quotesLoading: boolean,\n quotes: QuotesResponse | null,\n quoteParams: unknown | null,\n): boolean {\n return !quotesLoading && !!quotes && !quotes.bestQuote && !!quoteParams;\n}\n\n/**\n * Pick the most relevant unavailable-gateway reason to display.\n *\n * `defaultGateway` now receives the server-authoritative `preferredGatewayId`\n * when available, falling back to the frontend heuristic (prop or config\n * value) for older backends that don't return it.\n *\n * @internal exported for unit testing\n */\nexport function pickBestUnavailableReason(\n gateways: UnavailableGateway[],\n defaultGateway: string | null,\n): string | null {\n if (!gateways.length) return null;\n\n // If default/preferred gateway is unavailable, its reason is most relevant\n if (defaultGateway) {\n const match = gateways.find((g) => g.gatewayId === defaultGateway);\n if (match?.reason) return match.reason;\n }\n\n // Rank by reason specificity; explicit index tie-break for cross-engine safety\n const scored = gateways\n .map((g, idx) => ({ reason: g.reason, score: g.reason ? reasonScore(g.reason) : 99, idx }))\n .filter((g) => g.reason);\n\n if (!scored.length) return null;\n scored.sort((a, b) => a.score - b.score || a.idx - b.idx);\n return scored[0].reason;\n}\n\nfunction reasonScore(reason: string): number {\n const r = reason.toLowerCase();\n if (/amount|out of range for|minimum|maximum/.test(r)) return 1;\n if (/currency|pair|network|chain/.test(r)) return 2;\n if (/country|region|location/.test(r)) return 3;\n if (/does not support|unsupported/.test(r)) return 4;\n return 5;\n}\n\n/** Order statuses that represent a terminal (final) state */\nexport const TERMINAL_STATUSES = ['completed', 'failed', 'cancelled', 'expired', 'refunded'];\n\n/** @internal exported for unit testing */\nexport function isTerminalStatus(status: string): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n// =============================================================================\n// Initial State & Reducer\n// =============================================================================\n\n/** @internal exported for unit testing */\nexport const initialState: RampFormState = {\n step: 'amount',\n flowType: 'buy',\n fiatCurrency: 'USD',\n fiatAmount: '',\n cryptoCurrency: '',\n cryptoAmount: '',\n network: '',\n paymentMethodId: '',\n walletAddress: '',\n walletError: null,\n selectedProvider: null,\n selectedQuote: null,\n customerId: '',\n email: '',\n country: '',\n countrySource: '',\n errorMessage: null,\n};\n\n/** @internal exported for unit testing */\nexport function rampReducer(state: RampFormState, action: RampAction): RampFormState {\n switch (action.type) {\n case 'SET_STEP':\n return { ...state, step: action.step, errorMessage: null };\n case 'SET_FLOW_TYPE':\n return {\n ...state,\n flowType: action.flowType,\n fiatAmount: '',\n cryptoAmount: '',\n fiatCurrency: action.fieldLocks?.sourceCurrency?.locked ? state.fiatCurrency : '',\n cryptoCurrency: action.fieldLocks?.destinationCurrency?.locked ? state.cryptoCurrency : '',\n network: (action.fieldLocks?.network?.locked || action.fieldLocks?.destinationCurrency?.locked)\n ? state.network : '',\n paymentMethodId: '',\n selectedQuote: null,\n selectedProvider: null,\n errorMessage: null,\n };\n case 'SET_FIAT_CURRENCY':\n return { ...state, fiatCurrency: action.currency };\n case 'SET_FIAT_AMOUNT':\n return { ...state, fiatAmount: action.amount };\n case 'SET_CRYPTO_CURRENCY':\n return { ...state, cryptoCurrency: action.currency, network: '' };\n case 'SET_CRYPTO_AMOUNT':\n return { ...state, cryptoAmount: action.amount };\n case 'SET_NETWORK':\n return { ...state, network: action.network };\n case 'SET_CRYPTO_CHAIN':\n return { ...state, network: action.chain };\n case 'SET_PAYMENT_METHOD':\n return { ...state, paymentMethodId: action.methodId };\n case 'SET_WALLET_ADDRESS':\n return { ...state, walletAddress: action.address, walletError: null };\n case 'SET_WALLET_ERROR':\n return { ...state, walletError: action.message };\n case 'SELECT_QUOTE':\n return {\n ...state,\n selectedQuote: action.quote,\n selectedProvider: action.quote.gatewayId,\n };\n case 'SET_CUSTOMER_ID':\n return { ...state, customerId: action.customerId };\n case 'SET_EMAIL':\n return { ...state, email: action.email };\n case 'SET_COUNTRY':\n return { ...state, country: action.country, countrySource: 'manual' };\n case 'SET_COUNTRY_AUTO':\n return { ...state, country: action.country, countrySource: 'auto' };\n case 'SET_ERROR':\n return { ...state, step: 'error', errorMessage: action.message };\n case 'CLEAR_ERROR':\n return { ...state, errorMessage: null };\n case 'RESET':\n return initialState;\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst RampContext = createContext<RampContextValue | null>(null);\n\nexport interface RampProviderProps {\n /** Project ID (required) */\n projectId: string;\n /** API base URL (optional) */\n apiUrl?: string;\n /** Base URL for static assets (crypto icons, flags). Use CDN URL for standalone/IIFE deployments. */\n assetBaseUrl?: string;\n /** Flow type: 'buy' (onramp) or 'sell' (offramp) */\n flowType?: FlowType;\n /** External customer ID */\n customerId?: string;\n /** Brand identifier for metadata tracking (e.g., sub-brand name) */\n brandId?: string;\n /**\n * Initial fiat currency. When explicitly provided (including 'USD'),\n * GeoIP auto-detection and geo fallback will NOT override this value.\n * Manual country selection by the user WILL still update fiat unless\n * fieldLocks.sourceCurrency.locked is true.\n *\n * Passing `defaultFiatCurrency={undefined}` is equivalent to omitting\n * the prop — geo-detection will apply normally.\n *\n * @default 'USD'\n */\n defaultFiatCurrency?: string;\n /** Initial crypto currency */\n defaultCryptoCurrency?: string;\n /** Initial network */\n defaultNetwork?: string;\n /** Initial fiat amount */\n defaultFiatAmount?: string;\n /** Initial crypto amount (used for sell/offramp) */\n defaultCryptoAmount?: string;\n /** Initial wallet address */\n defaultWalletAddress?: string;\n /** Default gateway ID to pre-select. Falls back to project config if not set. */\n defaultGateway?: string;\n /** Default country code (ISO alpha-2). If set, skips GeoIP auto-detection. */\n defaultCountry?: string;\n /** Field locks from session */\n fieldLocks?: FieldLocksConfig;\n /** Partner metadata forwarded to order and webhook payloads (from session metadata) */\n partnerMetadata?: Record<string, unknown>;\n /** Poll interval for order status (ms) */\n statusPollInterval?: number;\n /** Callback when order completes */\n onComplete?: (status: Transaction) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n children: React.ReactNode;\n}\n\nexport function RampProvider(props: RampProviderProps) {\n // Detect if consumer explicitly passed defaultFiatCurrency (even USD)\n // props.defaultFiatCurrency !== undefined distinguishes:\n // <RampForm> → undefined → not protected\n // <RampForm defaultFiatCurrency=\"EUR\"> → 'EUR' → protected\n // <RampForm defaultFiatCurrency=\"USD\"> → 'USD' → protected\n // <RampForm defaultFiatCurrency={undefined}> → undefined → not protected\n const fiatProvidedRef = useRef(props.defaultFiatCurrency !== undefined);\n\n const {\n projectId,\n apiUrl = 'https://api.nowramp.com',\n assetBaseUrl = '',\n flowType = 'buy',\n customerId = '',\n brandId,\n defaultFiatCurrency = 'USD',\n defaultCryptoCurrency = 'BTC',\n defaultNetwork: defaultNetworkProp = '',\n defaultFiatAmount = '',\n defaultCryptoAmount = '',\n defaultWalletAddress = '',\n defaultGateway,\n defaultCountry,\n fieldLocks,\n partnerMetadata,\n statusPollInterval = 5000,\n onComplete,\n onError,\n children,\n } = props;\n\n const apiConfig = useMemo(() => ({ apiUrl, projectId }), [apiUrl, projectId]);\n\n // If no network specified but crypto is, derive a default network.\n // BTC → 'bitcoin' (canonical API ID); others → lowercase ticker (matches Banxa network IDs).\n const defaultNetwork = defaultNetworkProp || (\n defaultCryptoCurrency === 'BTC' ? 'bitcoin'\n : defaultCryptoCurrency ? defaultCryptoCurrency.toLowerCase()\n : ''\n );\n\n // Determine initial step: if all fields are pre-set with a gateway, go to confirm\n // For sell: wallet is optional, so don't require it\n const initialIsSell = flowType === 'sell';\n const hasAmount = initialIsSell ? !!defaultCryptoAmount : !!defaultFiatAmount;\n const hasAllFields = initialIsSell\n ? !!(hasAmount && defaultCryptoCurrency && defaultNetwork)\n : !!(hasAmount && defaultCryptoCurrency && defaultNetwork && defaultWalletAddress);\n const initialStep: RampStep = (hasAllFields && defaultGateway) ? 'confirm' : 'amount';\n\n // Initialize state with defaults\n // Use '250' as default fiat amount for buy if none provided\n const effectiveFiatAmount = defaultFiatAmount || (flowType === 'buy' ? '250' : '');\n const [state, dispatch] = useReducer(rampReducer, {\n ...initialState,\n step: initialStep,\n flowType,\n fiatCurrency: defaultFiatCurrency,\n cryptoCurrency: defaultCryptoCurrency,\n network: defaultNetwork,\n fiatAmount: normalizeAmount(effectiveFiatAmount, 2),\n cryptoAmount: normalizeAmount(defaultCryptoAmount, 6),\n walletAddress: defaultWalletAddress,\n customerId,\n // If defaultCountry is provided, set it immediately with 'manual' source to skip auto-detection\n ...(defaultCountry ? { country: defaultCountry.toLowerCase(), countrySource: 'manual' as const } : {}),\n });\n\n const isSell = state.flowType === 'sell';\n\n // Fetch supported config (pass orderType for sell to get sell-specific currencies/limits)\n // Pass country so backend filters results by region\n const {\n config,\n loading: configLoading,\n error: configError,\n } = useRampConfig(apiConfig, state.flowType, state.country || undefined);\n\n // GeoIP auto-detection: when config loads with detectedCountry and no country is set yet\n const geoAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoAppliedRef.current) return;\n if (!config?.detectedCountry) return;\n // Skip if country already set (defaultCountry prop or manual selection)\n if (state.country) return;\n\n geoAppliedRef.current = true;\n const detected = config.detectedCountry.toLowerCase();\n dispatch({ type: 'SET_COUNTRY_AUTO', country: detected });\n\n // Auto-set fiat currency based on detected country\n const supportedFiats = config.fiats?.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(detected, supportedFiats);\n if (fiat !== state.fiatCurrency && !fieldLocks?.sourceCurrency?.locked && !fiatProvidedRef.current) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [config, state.country, state.fiatCurrency, fieldLocks]);\n\n // When defaultCountry is set and config loads, auto-set fiat for that country\n const defaultCountryAppliedRef = useRef(false);\n React.useEffect(() => {\n if (defaultCountryAppliedRef.current) return;\n if (!defaultCountry || !config?.fiats?.length) return;\n\n defaultCountryAppliedRef.current = true;\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(defaultCountry, supportedFiats);\n if (fiat !== state.fiatCurrency && !fieldLocks?.sourceCurrency?.locked && !fiatProvidedRef.current) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [defaultCountry, config, state.fiatCurrency, fieldLocks]);\n\n // Reset geo-fallback guard when user manually changes country, so the\n // fallback can re-evaluate for the new geo-detected currency\n // Manual country change: auto-update fiat currency when user picks a new country\n const prevCountryRef = useRef(state.country);\n React.useEffect(() => {\n if (state.country === prevCountryRef.current) return;\n prevCountryRef.current = state.country;\n if (state.countrySource === 'manual') {\n geoFallbackAppliedRef.current = false;\n }\n\n // Only auto-switch fiat for manual selections (not initial auto-detection, which is handled above)\n if (state.countrySource !== 'manual') return;\n if (!config?.fiats?.length) return;\n\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(state.country, supportedFiats);\n if (fiat !== state.fiatCurrency && !fieldLocks?.sourceCurrency?.locked) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [state.country, state.countrySource, config, state.fiatCurrency, fieldLocks]);\n\n // When fiat currency changes, ensure the amount meets the new currency's minimum\n // This handles cases like geo-detection switching from USD (250 is fine) to TRY (250 is below min)\n const prevFiatRef = useRef(state.fiatCurrency);\n React.useEffect(() => {\n if (state.fiatCurrency === prevFiatRef.current) return;\n prevFiatRef.current = state.fiatCurrency;\n\n if (isSell || !config?.fiats?.length || !state.fiatAmount) return;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat?.minAmount) return;\n\n const currentAmount = parseFloat(state.fiatAmount);\n const minAmount = parseFloat(fiat.minAmount);\n if (!isNaN(currentAmount) && !isNaN(minAmount) && currentAmount < minAmount) {\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: String(Math.ceil(minAmount)) });\n }\n }, [state.fiatCurrency, state.fiatAmount, config, isSell]);\n\n // --- Cascading provider-aware filters ---\n const { availableFiats, availableCryptos, availablePaymentMethods } = useMemo(() => {\n if (!config) {\n return { availableFiats: [] as SupportedFiat[], availableCryptos: [] as SupportedCrypto[], availablePaymentMethods: [] as SupportedPaymentMethod[] };\n }\n\n // Resolve selected network's providers\n let networkProviders: string[] | undefined;\n if (state.cryptoCurrency && state.network) {\n const crypto = config.cryptos?.find((c) => c.code === state.cryptoCurrency);\n const network = crypto?.networks?.find((n) => n.id === state.network);\n if (!crypto || !network) {\n networkProviders = [];\n } else {\n networkProviders = network.providers;\n }\n }\n\n // Resolve selected fiat's providers\n let fiatProviders: string[] | undefined;\n if (state.fiatCurrency) {\n const fiat = config.fiats?.find((f) => f.code === state.fiatCurrency);\n if (!fiat) {\n fiatProviders = [];\n } else {\n fiatProviders = fiat.providers;\n }\n }\n\n return {\n availableFiats: filterAvailableFiats(config.fiats ?? [], networkProviders),\n availableCryptos: filterAvailableCryptos(config.cryptos ?? [], fiatProviders),\n availablePaymentMethods: filterAvailablePaymentMethods(\n config.paymentMethods ?? [], networkProviders, state.fiatCurrency\n ),\n };\n }, [config, state.cryptoCurrency, state.network, state.fiatCurrency]);\n\n // Derived flag: locked selection has no provider support\n const selectionUnsupported = useMemo(() => {\n if (configLoading || !config) return false;\n return isSelectionUnsupported(\n config,\n { cryptoCurrency: state.cryptoCurrency, network: state.network, fiatCurrency: state.fiatCurrency },\n {\n cryptoLocked: !!fieldLocks?.destinationCurrency?.locked,\n networkLocked: !!fieldLocks?.network?.locked,\n fiatLocked: !!fieldLocks?.sourceCurrency?.locked,\n },\n { availableFiats, availableCryptos, availablePaymentMethods }\n );\n }, [configLoading, config, fieldLocks, state.cryptoCurrency, state.network,\n state.fiatCurrency, availableFiats, availableCryptos, availablePaymentMethods]);\n\n // Reconcile selections when filtered lists change\n React.useEffect(() => {\n if (configLoading) return;\n if (availableFiats.length === 0 && availableCryptos.length === 0) return;\n\n const corrections = reconcileSelections(\n {\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n fiatCurrency: state.fiatCurrency,\n paymentMethodId: state.paymentMethodId,\n },\n { availableFiats, availableCryptos, availablePaymentMethods },\n {\n cryptoLocked: !!fieldLocks?.destinationCurrency?.locked,\n networkLocked: !!fieldLocks?.network?.locked,\n fiatLocked: !!fieldLocks?.sourceCurrency?.locked,\n }\n );\n\n if (!corrections) return;\n\n if (corrections.cryptoCurrency !== undefined) {\n dispatch({ type: 'SET_CRYPTO_CURRENCY', currency: corrections.cryptoCurrency });\n }\n if (corrections.network !== undefined) {\n dispatch({ type: 'SET_NETWORK', network: corrections.network });\n }\n if (corrections.fiatCurrency !== undefined) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: corrections.fiatCurrency });\n }\n if (corrections.paymentMethodId !== undefined) {\n dispatch({ type: 'SET_PAYMENT_METHOD', methodId: corrections.paymentMethodId });\n }\n }, [configLoading, availableFiats, availableCryptos, availablePaymentMethods,\n state.cryptoCurrency, state.network, state.fiatCurrency, state.paymentMethodId,\n fieldLocks, dispatch]);\n\n // Amount validation against min/max limits\n // Computed before quoteParams so invalid amounts never trigger a fetch\n // For sell, user enters crypto amount — skip fiat-based validation (backend validates)\n const amountError = useMemo(() => {\n if (isSell) {\n // For sell, basic presence check only — backend validates crypto amount limits\n if (!state.cryptoAmount) return null;\n const amount = parseFloat(state.cryptoAmount);\n if (isNaN(amount) || amount <= 0) return 'Enter a valid amount';\n return null;\n }\n\n if (!config || !state.fiatAmount) return null;\n\n const amount = parseFloat(state.fiatAmount);\n if (isNaN(amount)) return null;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return null;\n\n const min = parseFloat(fiat.minAmount);\n const max = parseFloat(fiat.maxAmount);\n\n if (!isNaN(min) && amount < min) {\n return `Minimum amount is ${fiat.minAmount} ${state.fiatCurrency}`;\n }\n if (!isNaN(max) && amount > max) {\n return `Maximum amount is ${fiat.maxAmount} ${state.fiatCurrency}`;\n }\n return null;\n }, [config, state.fiatAmount, state.fiatCurrency, state.cryptoAmount, isSell]);\n\n // Fetch quotes when form is filled, config loaded, and amount is valid\n // Wait for geo-detection to resolve before fetching (prevents wasted initial fetch\n // that gets cancelled when fiat currency changes from USD to the detected currency)\n const quoteParams = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n if (!config || !hasAmount || !state.fiatCurrency || !state.cryptoCurrency || !state.network) {\n return null;\n }\n if (amountError) {\n return null;\n }\n // If backend detected a country but geo-detection effect hasn't applied yet, wait\n if (config.detectedCountry && state.countrySource === '' && !defaultCountry) {\n return null;\n }\n return {\n fiatCurrency: state.fiatCurrency,\n ...(isSell ? { cryptoAmount: state.cryptoAmount } : { fiatAmount: state.fiatAmount }),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n paymentMethodId: state.paymentMethodId || undefined,\n country: state.country || undefined,\n orderType: state.flowType,\n };\n }, [config, state.fiatCurrency, state.fiatAmount, state.cryptoAmount, state.cryptoCurrency, state.network, state.paymentMethodId, state.country, state.countrySource, amountError, isSell, state.flowType, defaultCountry]);\n\n const {\n quotes,\n loading: quotesLoading,\n error: quotesError,\n refetch: fetchQuotes,\n } = useQuotes(apiConfig, quoteParams);\n\n const quotesEmpty = isQuotesEmpty(quotesLoading, quotes, quoteParams);\n\n // Fallback: if geo-detected fiat returns no quotes for the default crypto, fall back to USD\n // This handles cases where a local currency (e.g. NGN) has no provider pairs with BTC\n // Only triggers when quotes loaded successfully with zero results — never on API errors\n const geoFallbackAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoFallbackAppliedRef.current) return;\n // Only apply for auto-detected currencies, not manual selections\n if (state.countrySource !== 'auto') return;\n if (fieldLocks?.sourceCurrency?.locked || fiatProvidedRef.current) return;\n // Wait until quotes have actually loaded (not loading, not null params)\n if (quotesLoading || !quoteParams) return;\n // Skip fallback on API errors — only fall back when the response succeeded\n // but contained no quotes (i.e. quotes object exists with no bestQuote)\n if (quotesError || !quotes) return;\n // If we got quotes, no fallback needed\n if (quotes.bestQuote) return;\n // If the fiat is already USD, nothing to fall back to\n if (state.fiatCurrency === 'USD') return;\n\n geoFallbackAppliedRef.current = true;\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: 'USD' });\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: '250' });\n }, [quotes, quotesLoading, quotesError, quoteParams, state.countrySource, state.fiatCurrency]);\n\n // Order creation\n const {\n order,\n loading: orderLoading,\n error: orderError,\n createOrder: createOrderApi,\n } = useCheckoutIntent(apiConfig);\n\n // Order status polling — delay the initial fetch to give the checkout\n // iframe time to load before we start polling. Without this, the first\n // poll can return a 'processing' status from the provider and the\n // CheckoutStep immediately transitions to ProcessingStep before the\n // user even sees the iframe (race condition with iframe-based providers\n // like Banxa that move to 'processing' quickly).\n const CHECKOUT_POLL_INITIAL_DELAY = 15_000; // 15 seconds\n\n const {\n status: orderStatus,\n loading: orderStatusLoading,\n } = useTransaction(\n { apiUrl },\n order?.orderId ?? null,\n { pollInterval: statusPollInterval, initialDelay: CHECKOUT_POLL_INITIAL_DELAY }\n );\n\n // Handle order completion — fire once per order for all terminal statuses\n const terminalFiredForRef = useRef<string | null>(null);\n React.useEffect(() => {\n if (!orderStatus?.status || !onComplete) return;\n if (!TERMINAL_STATUSES.includes(orderStatus.status)) return;\n if (terminalFiredForRef.current === orderStatus.orderId) return;\n terminalFiredForRef.current = orderStatus.orderId;\n onComplete(orderStatus);\n }, [orderStatus?.status, orderStatus?.orderId, onComplete]);\n\n // Handle errors — only propagate config and order errors as fatal.\n // Quote errors are non-fatal (validation rejections, transient failures)\n // and are already surfaced via quotesError in the UI.\n React.useEffect(() => {\n const error = configError || orderError;\n if (error && onError) {\n onError(error);\n }\n }, [configError, orderError, onError]);\n\n // Resolve effective default gateway: explicit prop > project config\n const effectiveDefaultGateway = defaultGateway || config?.defaultGateway || null;\n\n const bestUnavailableReason = useMemo(() => {\n if (!quotesEmpty || !quotes?.unavailableGateways) return null;\n // Prefer server-resolved preferred gateway; fall back to frontend heuristic\n const preferred = quotes.preferredGatewayId || effectiveDefaultGateway;\n return pickBestUnavailableReason(quotes.unavailableGateways, preferred);\n }, [quotesEmpty, quotes, effectiveDefaultGateway]);\n\n // Use refs to avoid stale closures — async data loads mean callbacks may\n // capture earlier null values even with useCallback deps.\n const gatewayRef = useRef(effectiveDefaultGateway);\n gatewayRef.current = effectiveDefaultGateway;\n\n const quotesRef = useRef(quotes);\n quotesRef.current = quotes;\n\n const brandIdRef = useRef(brandId);\n brandIdRef.current = brandId;\n\n // Create order handler\n const createOrder = useCallback(async () => {\n const gateway = state.selectedQuote?.gatewayId || quotesRef.current?.bestQuote?.gatewayId || gatewayRef.current;\n if (!gateway || !state.walletAddress) {\n const missing = [!gateway && 'gateway', !state.walletAddress && 'walletAddress'].filter(Boolean).join(', ');\n dispatch({ type: 'SET_ERROR', message: `Missing required fields: ${missing}` });\n return;\n }\n\n try {\n await createOrderApi({\n gateway,\n customerId: state.customerId || undefined,\n fiatCurrency: state.fiatCurrency,\n ...(isSell\n ? { cryptoAmount: state.cryptoAmount }\n : { fiatAmount: state.fiatAmount }\n ),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n walletAddress: state.walletAddress,\n paymentMethodId: state.paymentMethodId || undefined,\n email: state.email || undefined,\n orderType: state.flowType,\n ...(brandIdRef.current ? { metadata: { brand: brandIdRef.current } } : {}),\n ...(partnerMetadata && Object.keys(partnerMetadata).length > 0 ? { partnerMetadata } : {}),\n });\n\n // Move to checkout step\n dispatch({ type: 'SET_STEP', step: 'checkout' });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create order';\n // Wallet address validation errors stay inline instead of going to error screen\n if (/wallet|address/i.test(message)) {\n dispatch({ type: 'SET_WALLET_ERROR', message: message.replace(/^Failed to create checkout intent:\\s*/i, '') });\n } else {\n dispatch({ type: 'SET_ERROR', message });\n }\n }\n }, [state, createOrderApi, isSell, partnerMetadata]);\n\n // Navigation helpers\n const goToStep = useCallback((step: RampStep) => {\n dispatch({ type: 'SET_STEP', step });\n }, []);\n\n const goBack = useCallback(() => {\n const stepOrder: RampStep[] = ['confirm', 'amount', 'quotes', 'wallet', 'checkout', 'processing', 'complete'];\n const currentIndex = stepOrder.indexOf(state.step);\n if (currentIndex > 0) {\n dispatch({ type: 'SET_STEP', step: stepOrder[currentIndex - 1] });\n }\n }, [state.step, isSell]);\n\n // Check if user can proceed to next step\n const canProceed = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n switch (state.step) {\n case 'confirm':\n return !!(hasAmount && state.cryptoCurrency && state.network && state.walletAddress && !amountError);\n case 'amount':\n return !!(hasAmount && state.cryptoCurrency && state.network && !amountError);\n case 'quotes':\n return !!state.selectedQuote;\n case 'wallet':\n return !!state.walletAddress;\n default:\n return false;\n }\n }, [state, amountError, isSell]);\n\n const value: RampContextValue = {\n apiConfig,\n assetBaseUrl,\n config,\n configLoading,\n configError,\n state,\n dispatch,\n quotes,\n quotesLoading,\n quotesError,\n fetchQuotes,\n order,\n orderLoading,\n orderError,\n createOrder,\n orderStatus,\n orderStatusLoading,\n fieldLocks: fieldLocks || null,\n defaultGateway: effectiveDefaultGateway,\n availableFiats,\n availableCryptos,\n availablePaymentMethods,\n selectionUnsupported,\n quotesEmpty,\n bestUnavailableReason,\n amountError,\n goToStep,\n goBack,\n canProceed,\n };\n\n return (\n <RampContext.Provider value={value}>\n {children}\n </RampContext.Provider>\n );\n}\n\n/**\n * Hook to access ramp context\n */\nexport function useRamp(): RampContextValue {\n const context = useContext(RampContext);\n if (!context) {\n throw new Error('useRamp must be used within a RampProvider');\n }\n return context;\n}\n","/**\n * English (base) translation dictionary.\n * All keys referenced by form components live here.\n * Use {variable} for interpolation placeholders.\n */\nconst en = {\n // ─── Header ───\n 'header.buy': 'Buy',\n 'header.sell': 'Sell',\n\n // ─── SpendCard ───\n 'spend.label': 'You spend',\n 'spend.placeholderFiat': '250',\n 'spend.placeholderCrypto': '0.01',\n\n // ─── ReceiveCard ───\n 'receive.label': 'You get',\n 'receive.fetchingRate': 'Fetching best rate...',\n\n // ─── PaymentCard ───\n 'payment.label': 'Payment method',\n 'payment.select': 'Select',\n 'payment.noneAvailable': 'No payment methods for this pair',\n\n // ─── ProviderCard ───\n 'provider.label': 'By',\n 'provider.select': 'Select',\n\n // ─── WalletCard ───\n 'wallet.label': 'Receiving wallet address',\n 'wallet.placeholderBuy': 'Enter your receiving address',\n 'wallet.placeholderSell': 'Enter your sending address',\n 'wallet.validating': 'Validating address...',\n 'wallet.invalid': 'Enter a valid wallet address',\n 'wallet.invalidServer': 'Invalid wallet address',\n\n // ─── CtaButton ───\n 'cta.buy': 'Buy {crypto}',\n 'cta.sell': 'Sell {crypto}',\n 'cta.gettingPrice': 'Getting best price...',\n 'cta.processing': 'Processing...',\n\n // ─── Footer ───\n 'footer.poweredBy': 'Powered by ',\n 'footer.brand': 'NowRamp',\n\n // ─── Rate Breakdown ───\n 'rate.title': 'Rate breakdown',\n 'rate.close': 'Close',\n 'rate.updatesIn': 'Rate updates in 00:{seconds}',\n 'rate.noQuote': 'No quote available',\n 'rate.exchangeRate': 'Exchange rate',\n 'rate.processingFee': 'Processing fee',\n 'rate.networkFee': 'Network fee',\n 'rate.provider': 'Provider',\n 'rate.updatesInLabel': 'Rate updates in',\n 'rate.networkFeeIncl': 'Network fee incl.',\n 'rate.rateTooltip': 'As the market is highly volatile, we can fix the exchange rate for no longer than 30 seconds.',\n 'rate.networkFeeTooltip': 'Includes a fee charged by blockchain to execute the transaction.',\n 'rate.feeIncluded': '{percentage}% incl.',\n\n // ─── Toast ───\n 'toast.orderCreated': 'Order created',\n 'toast.redirecting': 'Redirecting to checkout...',\n 'toast.orderFailed': 'Order failed',\n 'toast.couldNotCreate': 'Could not create order',\n 'toast.quoteError': 'Quote error',\n 'toast.noProviders': 'No providers',\n 'toast.somethingWrong': 'Something went wrong',\n\n // ─── Form errors ───\n 'error.amountZero': 'Amount should be more than 0',\n 'error.minAmountFiat': 'Minimum amount is {min} {currency}',\n 'error.minAmountCrypto': 'Minimum amount is {min} {currency}',\n 'error.noProviders': 'No providers available for this combination',\n 'error.currencyUnavailableBuy': 'This currency is not available for buy orders',\n 'error.currencyUnavailableSell': 'This currency is not available for sell orders',\n\n // ─── Parity banner ───\n 'parity.info': 'You will be charged for {receiveAmount} {crypto}, the rest up to {spendAmount} {fiat} will be credited to your {partner} account',\n\n // ─── Redirect Screen ───\n 'redirect.secureBadge': 'Secure payment',\n 'redirect.title': 'Continue Payment',\n 'redirect.description': \"You'll be redirected to {gateway} to complete your payment.\",\n 'redirect.countdown': 'Redirecting in {seconds}...',\n 'redirect.openTab': 'Open ACH in new tab',\n 'redirect.cancel': 'Cancel',\n 'redirect.tabHelper': 'If the new tab has not opened, click the button above.',\n\n // ─── Checkout Step ───\n 'checkout.noOrder': 'No order found',\n 'checkout.goBack': 'Go Back',\n 'checkout.expired': 'Checkout expired',\n 'checkout.expiredDesc': 'The session has expired. Please try again.',\n 'checkout.startOver': 'Start over',\n 'checkout.cancel': 'Cancel',\n 'checkout.loading': 'Loading checkout...',\n 'checkout.iframeTitle': 'Provider Checkout',\n 'checkout.widgetTitle': 'Payment Checkout',\n 'checkout.unknownMethod': 'Unknown checkout method',\n\n // ─── Processing Step ───\n 'processing.default': 'Processing your order...',\n 'processing.pending': 'Waiting for payment confirmation...',\n 'processing.active': 'Processing your transaction...',\n 'processing.generic': 'Processing...',\n 'processing.checkingStatus': 'Checking status...',\n 'processing.orderId': 'Order ID',\n 'processing.provider': 'Provider',\n 'processing.amount': 'Amount',\n 'processing.receiving': 'Receiving',\n 'processing.network': 'Network',\n 'processing.toAddress': 'To Address',\n 'processing.usuallyMinutes': 'This usually takes a few minutes.',\n 'processing.safeToClose': \"You can safely close this page - we'll send you an email when complete.\",\n\n // ─── Complete Step ───\n 'complete.buyTitle': 'Purchase Complete!',\n 'complete.sellTitle': 'Sale Complete!',\n 'complete.buyDesc': 'Your {crypto} has been sent to your wallet.',\n 'complete.sellDesc': 'Your {fiat} payout is being processed.',\n 'complete.amountBuy': 'Amount Received',\n 'complete.amountSell': 'Amount Sold',\n 'complete.paidBuy': 'Amount Paid',\n 'complete.paidSell': 'Payout Amount',\n 'complete.network': 'Network',\n 'complete.wallet': 'Wallet',\n 'complete.transaction': 'Transaction',\n 'complete.provider': 'Provider',\n 'complete.orderId': 'Order ID',\n 'complete.completed': 'Completed',\n 'complete.viewExplorer': 'View on Explorer',\n 'complete.done': 'Done',\n\n // ─── Error Step ───\n 'errorStep.failed': 'Payment Failed',\n 'errorStep.cancelled': 'Order Cancelled',\n 'errorStep.expired': 'Order Expired',\n 'errorStep.refunded': 'Order Refunded',\n 'errorStep.unknown': 'Something Went Wrong',\n 'errorStep.failedBuy': 'Your payment could not be processed. Please try again or use a different payment method.',\n 'errorStep.failedSell': 'Your sale could not be processed. Please try again.',\n 'errorStep.cancelledBuy': 'Your order was cancelled. No payment was processed.',\n 'errorStep.cancelledSell': 'Your sale was cancelled. No crypto was transferred.',\n 'errorStep.expiredBuy': 'Your order has expired. Please start a new purchase.',\n 'errorStep.expiredSell': 'Your order has expired. Please start a new sale.',\n 'errorStep.refundedBuy': 'Your payment has been refunded. The funds should appear in your account within 5-10 business days.',\n 'errorStep.refundedSell': 'Your crypto has been returned. The funds should appear in your wallet shortly.',\n 'errorStep.genericDesc': 'An unexpected error occurred. Please try again.',\n 'errorStep.orderId': 'Order ID',\n 'errorStep.tryAgain': 'Try Again',\n 'errorStep.startOver': 'Start Over',\n 'errorStep.return': 'Return',\n 'errorStep.needHelp': 'Need help? Contact ',\n 'errorStep.reference': 'Reference: {orderId}',\n\n // ─── Confirm Step ───\n 'confirm.buyTitle': 'Confirm Purchase',\n 'confirm.sellTitle': 'Confirm Sale',\n 'confirm.loading': 'Loading...',\n 'confirm.provider': 'Provider',\n 'confirm.youPay': 'You pay',\n 'confirm.youSell': 'You sell',\n 'confirm.youReceive': 'You receive',\n 'confirm.wallet': 'Wallet',\n 'confirm.network': 'Network',\n 'confirm.refundAddress': 'Refund address',\n 'confirm.parityNote': 'Charged amount from provider may differ. The rest up to {amount} {crypto} will be credited to your {partner} account.',\n 'confirm.processing': 'Processing...',\n 'confirm.confirmPay': 'Confirm & Pay',\n 'confirm.confirmSell': 'Confirm & Sell',\n 'confirm.payout': '{currency} payout',\n 'confirm.cryptoOnNetwork': '{crypto} on {network}',\n\n // ─── Payment method short names ───\n 'payment.name.card': 'Card',\n 'payment.name.bankTransfer': 'Bank Transfer',\n 'payment.name.ach': 'ACH',\n\n // ─── Modals ───\n 'modal.selectFiat': 'Select fiat currency',\n 'modal.selectCrypto': 'Select crypto currency',\n 'modal.choosePayment': 'Choose payment method',\n 'modal.selectCountry': 'Select your country',\n 'modal.selectLanguage': 'Select language',\n 'modal.popular': 'Popular',\n 'modal.recommended': 'Recommended',\n 'modal.noCurrencies': 'No currencies found',\n 'modal.noPaymentMethods': 'No payment methods found',\n 'modal.noCountries': 'No countries found',\n 'modal.noLanguages': 'No languages found',\n\n // ─── ChooseRampModal ───\n 'modal.chooseRamp': 'Choose Ramp',\n 'modal.bestPrice': 'Best price',\n 'modal.noQuotes': 'No quotes available for this request',\n 'modal.noProvidersFound': 'No providers found',\n\n // ─── PaymentMethodSelector (legacy) ───\n 'payment.unavailableFor': 'No payment methods available for {currency}',\n\n // ─── Skeleton ───\n 'skeleton.poweredBy': 'Powered by NowRamp',\n\n // ─── ConfirmStep (catch fallback) ───\n 'error.createOrderFailed': 'Failed to create order',\n\n // ─── ErrorStep aria-label fallback ───\n 'errorStep.returnToMerchant': 'Return to merchant',\n\n // ─── Settings ───\n 'settings.location': 'Location',\n 'settings.darkMode': 'Dark Mode',\n 'settings.privacy': 'Privacy policy',\n 'settings.terms': 'Terms of use',\n 'settings.language': 'Language',\n} as const;\n\nexport type TranslationKey = keyof typeof en;\nexport type TranslationDict = Record<TranslationKey, string>;\nexport default en;\n","/** Supported language codes */\nexport type LanguageCode =\n | 'en' | 'es' | 'fr' | 'de' | 'pt' | 'it' | 'nl'\n | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'tr'\n | 'pl' | 'vi' | 'th' | 'id' | 'uk' | 'cs'\n | 'bg' | 'hr' | 'da' | 'et' | 'fi' | 'el'\n | 'hu' | 'ga' | 'lv' | 'lt' | 'mt' | 'ro'\n | 'sk' | 'sl' | 'sv'\n | 'ur' | 'fa'\n | 'bn' | 'ta' | 'te' | 'mr' | 'gu' | 'kn' | 'ml';\n\nexport interface LanguageInfo {\n code: LanguageCode;\n /** Native name displayed in language picker */\n name: string;\n /** English name for accessibility */\n english: string;\n}\n\nexport const LANGUAGES: LanguageInfo[] = [\n { code: 'en', name: 'English', english: 'English' },\n { code: 'es', name: 'Español', english: 'Spanish' },\n { code: 'fr', name: 'Français', english: 'French' },\n { code: 'de', name: 'Deutsch', english: 'German' },\n { code: 'pt', name: 'Português', english: 'Portuguese' },\n { code: 'it', name: 'Italiano', english: 'Italian' },\n { code: 'nl', name: 'Nederlands', english: 'Dutch' },\n { code: 'ru', name: 'Русский', english: 'Russian' },\n { code: 'zh', name: '中文', english: 'Chinese' },\n { code: 'ja', name: '日本語', english: 'Japanese' },\n { code: 'ko', name: '한국어', english: 'Korean' },\n { code: 'ar', name: 'العربية', english: 'Arabic' },\n { code: 'hi', name: 'हिन्दी', english: 'Hindi' },\n { code: 'tr', name: 'Türkçe', english: 'Turkish' },\n { code: 'pl', name: 'Polski', english: 'Polish' },\n { code: 'vi', name: 'Tiếng Việt', english: 'Vietnamese' },\n { code: 'th', name: 'ไทย', english: 'Thai' },\n { code: 'id', name: 'Bahasa Indonesia', english: 'Indonesian' },\n { code: 'uk', name: 'Українська', english: 'Ukrainian' },\n { code: 'cs', name: 'Čeština', english: 'Czech' },\n { code: 'bg', name: 'Български', english: 'Bulgarian' },\n { code: 'hr', name: 'Hrvatski', english: 'Croatian' },\n { code: 'da', name: 'Dansk', english: 'Danish' },\n { code: 'et', name: 'Eesti', english: 'Estonian' },\n { code: 'fi', name: 'Suomi', english: 'Finnish' },\n { code: 'el', name: 'Ελληνικά', english: 'Greek' },\n { code: 'hu', name: 'Magyar', english: 'Hungarian' },\n { code: 'ga', name: 'Gaeilge', english: 'Irish' },\n { code: 'lv', name: 'Latviešu', english: 'Latvian' },\n { code: 'lt', name: 'Lietuvių', english: 'Lithuanian' },\n { code: 'mt', name: 'Malti', english: 'Maltese' },\n { code: 'ro', name: 'Română', english: 'Romanian' },\n { code: 'sk', name: 'Slovenčina', english: 'Slovak' },\n { code: 'sl', name: 'Slovenščina', english: 'Slovenian' },\n { code: 'sv', name: 'Svenska', english: 'Swedish' },\n { code: 'ur', name: 'اردو', english: 'Urdu' },\n { code: 'fa', name: 'فارسی', english: 'Persian' },\n { code: 'bn', name: 'বাংলা', english: 'Bengali' },\n { code: 'ta', name: 'தமிழ்', english: 'Tamil' },\n { code: 'te', name: 'తెలుగు', english: 'Telugu' },\n { code: 'mr', name: 'मराठी', english: 'Marathi' },\n { code: 'gu', name: 'ગુજરાતી', english: 'Gujarati' },\n { code: 'kn', name: 'ಕನ್ನಡ', english: 'Kannada' },\n { code: 'ml', name: 'മലയാളം', english: 'Malayalam' },\n];\n","/**\n * i18n Context\n * Provides translation function and language switching.\n */\nimport { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TranslationKey, TranslationDict } from './en';\nimport en from './en';\nimport { LANGUAGES, type LanguageCode } from './languages';\n\ninterface I18nContextValue {\n /** Current language code */\n locale: LanguageCode;\n /** Set the active language */\n setLocale: (code: LanguageCode) => void;\n /** Translate a key, with optional interpolation variables */\n t: (key: TranslationKey, vars?: Record<string, string | number>) => string;\n /** List of available languages */\n languages: typeof LANGUAGES;\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\n// Lazy-load translation modules (only English is bundled eagerly)\nconst loaders: Record<LanguageCode, () => Promise<{ default: TranslationDict }>> = {\n en: () => Promise.resolve({ default: en }),\n es: () => import('./translations/es'),\n fr: () => import('./translations/fr'),\n de: () => import('./translations/de'),\n pt: () => import('./translations/pt'),\n it: () => import('./translations/it'),\n nl: () => import('./translations/nl'),\n ru: () => import('./translations/ru'),\n zh: () => import('./translations/zh'),\n ja: () => import('./translations/ja'),\n ko: () => import('./translations/ko'),\n ar: () => import('./translations/ar'),\n hi: () => import('./translations/hi'),\n tr: () => import('./translations/tr'),\n pl: () => import('./translations/pl'),\n vi: () => import('./translations/vi'),\n th: () => import('./translations/th'),\n id: () => import('./translations/id'),\n uk: () => import('./translations/uk'),\n cs: () => import('./translations/cs'),\n bg: () => import('./translations/bg'),\n hr: () => import('./translations/hr'),\n da: () => import('./translations/da'),\n et: () => import('./translations/et'),\n fi: () => import('./translations/fi'),\n el: () => import('./translations/el'),\n hu: () => import('./translations/hu'),\n ga: () => import('./translations/ga'),\n lv: () => import('./translations/lv'),\n lt: () => import('./translations/lt'),\n mt: () => import('./translations/mt'),\n ro: () => import('./translations/ro'),\n sk: () => import('./translations/sk'),\n sl: () => import('./translations/sl'),\n sv: () => import('./translations/sv'),\n ur: () => import('./translations/ur'),\n fa: () => import('./translations/fa'),\n bn: () => import('./translations/bn'),\n ta: () => import('./translations/ta'),\n te: () => import('./translations/te'),\n mr: () => import('./translations/mr'),\n gu: () => import('./translations/gu'),\n kn: () => import('./translations/kn'),\n ml: () => import('./translations/ml'),\n};\n\n// Cache loaded dictionaries\nconst cache: Partial<Record<LanguageCode, TranslationDict>> = { en };\n\nfunction interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const val = vars[key];\n return val !== undefined ? String(val) : `{${key}}`;\n });\n}\n\nexport function I18nProvider({\n defaultLocale = 'en',\n children,\n}: {\n defaultLocale?: LanguageCode;\n children: React.ReactNode;\n}) {\n const [locale, setLocaleState] = useState<LanguageCode>(defaultLocale);\n const [dict, setDict] = useState<TranslationDict>(cache[defaultLocale] || en);\n\n // Sync when defaultLocale prop changes after mount\n useEffect(() => {\n setLocaleState(defaultLocale);\n if (cache[defaultLocale]) {\n setDict(cache[defaultLocale]);\n } else {\n const loader = loaders[defaultLocale];\n if (loader) {\n loader().then((mod) => {\n cache[defaultLocale] = mod.default;\n setDict(mod.default);\n });\n }\n }\n }, [defaultLocale]);\n\n const setLocale = useCallback((code: LanguageCode) => {\n setLocaleState(code);\n if (cache[code]) {\n setDict(cache[code]);\n return;\n }\n const loader = loaders[code];\n if (loader) {\n loader().then((mod) => {\n cache[code] = mod.default;\n setDict(mod.default);\n });\n }\n }, []);\n\n const t = useCallback(\n (key: TranslationKey, vars?: Record<string, string | number>) => {\n const template = dict[key] || en[key] || key;\n return interpolate(template, vars);\n },\n [dict],\n );\n\n const value = useMemo(\n () => ({ locale, setLocale, t, languages: LANGUAGES }),\n [locale, setLocale, t],\n );\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\n/** Hook to access translation function and locale controls */\nexport function useI18n() {\n const ctx = useContext(I18nContext);\n if (!ctx) {\n // Fallback for components used outside provider — returns English\n return {\n locale: 'en' as LanguageCode,\n setLocale: () => {},\n t: (key: TranslationKey, vars?: Record<string, string | number>) =>\n interpolate(en[key] || key, vars),\n languages: LANGUAGES,\n };\n }\n return ctx;\n}\n\n/** Shorthand hook — returns just the `t` function */\nexport function useT() {\n return useI18n().t;\n}\n","import { useT } from '../../i18n';\n\nexport interface RedirectScreenProps {\n gatewayName: string;\n checkoutUrl: string;\n onCancel: () => void;\n redirectCountdown: number | null;\n}\n\nexport function RedirectScreen({\n gatewayName,\n checkoutUrl,\n onCancel,\n redirectCountdown,\n}: RedirectScreenProps) {\n const t = useT();\n return (\n <div\n className=\"flex flex-col items-center justify-center px-8 py-12 text-center flex-1\"\n style={{ background: 'var(--t-redirect-bg)', color: '#ffffff' }}\n >\n {/* Security badge */}\n <div\n className=\"flex items-center gap-1.5 px-3 py-1.5 mb-6\"\n style={{ background: 'rgba(255,255,255,0.2)', borderRadius: 'var(--t-pill-radius)' }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 1L2 3v3c0 2.5 1.7 4.8 4 5.5 2.3-.7 4-3 4-5.5V3L6 1z\" fill=\"#22c55e\" />\n <path d=\"M5 6.5l1 1 2-2.5\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"text-[11px] font-medium\">{t('redirect.secureBadge')}</span>\n </div>\n\n <h3 className=\"text-[20px] font-semibold mb-2\">{t('redirect.title')}</h3>\n <p className=\"text-[14px] mb-2 opacity-90\">\n {t('redirect.description', { gateway: gatewayName })}\n </p>\n {redirectCountdown !== null && (\n <p className=\"text-[13px] mb-6 opacity-70\">\n {t('redirect.countdown', { seconds: String(redirectCountdown) })}\n </p>\n )}\n\n <a\n href={checkoutUrl}\n className=\"w-full font-medium text-[16px] flex items-center justify-center gap-2 transition-all\"\n style={{\n height: 52,\n borderRadius: 'var(--t-cta-radius)',\n background: '#ffffff',\n color: '#000000',\n textDecoration: 'none',\n }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t('redirect.openTab')}\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 1.5h8.5V10M12 2L2 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </a>\n\n <p className=\"text-[11px] mt-2 opacity-60\">\n {t('redirect.tabHelper')}\n </p>\n\n <button\n className=\"w-full font-medium text-[14px] mt-2 transition-all\"\n style={{\n height: 48,\n borderRadius: 'var(--t-cta-radius)',\n background: 'rgba(255,255,255,0.2)',\n color: '#ffffff',\n }}\n onClick={onCancel}\n >\n {t('redirect.cancel')}\n </button>\n </div>\n );\n}\n","export function Spinner({ size = 48 }: { size?: number }) {\n const borderWidth = size <= 14 ? 1.5 : size <= 20 ? 2 : 3;\n return (\n <div\n className=\"shrink-0\"\n style={{\n width: size,\n height: size,\n border: `${borderWidth}px solid var(--t-border)`,\n borderTopColor: 'var(--t-text)',\n borderRadius: '50%',\n animation: 'nramp-spin 0.8s linear infinite',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n );\n}\n","/**\n * Checkout Step Component\n * Displays provider checkout iframe or redirect button.\n * Iframe/widget checkouts render in a full-screen portal overlay.\n */\n\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useRamp } from '../context/RampContext';\nimport { RedirectScreen } from './form/RedirectScreen';\nimport { Spinner } from './ui/Spinner';\nimport { useT } from '../i18n';\n\nexport interface CheckoutStepProps {\n\tclassName?: string;\n\tautoRedirect?: boolean;\n\tredirectDelay?: number;\n}\n\nexport function CheckoutStep({\n\tclassName = '',\n\tautoRedirect = false,\n\tredirectDelay = 3000,\n}: CheckoutStepProps) {\n\tconst { order, orderStatus, goToStep, goBack } = useRamp();\n\tconst t = useT();\n\tconst [iframeLoaded, setIframeLoaded] = useState(false);\n\tconst [redirectCountdown, setRedirectCountdown] = useState<number | null>(null);\n\n\tconst isExpired = order?.checkout.expiresAt ? Date.now() > order.checkout.expiresAt : false;\n\n\t// Handle auto-redirect\n\tuseEffect(() => {\n\t\tif (order?.checkout.method === 'redirect' && autoRedirect && !isExpired) {\n\t\t\tsetRedirectCountdown(Math.ceil(redirectDelay / 1000));\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\twindow.location.href = order.checkout.url;\n\t\t\t}, redirectDelay);\n\n\t\t\tconst countdownInterval = setInterval(() => {\n\t\t\t\tsetRedirectCountdown((prev) => (prev && prev > 1 ? prev - 1 : null));\n\t\t\t}, 1000);\n\n\t\t\treturn () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclearInterval(countdownInterval);\n\t\t\t};\n\t\t}\n\t}, [order, autoRedirect, redirectDelay, isExpired]);\n\n\t// Navigate on terminal statuses\n\tuseEffect(() => {\n\t\tif (!orderStatus) return;\n\t\tif (orderStatus.status === 'completed') {\n\t\t\tgoToStep('complete');\n\t\t} else if (['failed', 'cancelled', 'expired'].includes(orderStatus.status)) {\n\t\t\tgoToStep('error');\n\t\t}\n\t}, [orderStatus?.status, goToStep]);\n\n\tif (!order) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t<p className=\"text-[15px] mb-4\">{t('checkout.noOrder')}</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tborderRadius: 'var(--t-cta-radius, 100px)',\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\t{t('checkout.goBack')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isExpired) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 text-center ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t{/* <div className=\"text-[48px] mb-4\">&#9200;</div> */}\n\t\t\t\t<h3 className=\"text-[18px] font-semibold mb-2\">{t('checkout.expired')}</h3>\n\t\t\t\t<p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t{t('checkout.expiredDesc')}\n\t\t\t\t</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\tborderRadius: 'var(--t-cta-radius, 100px)',\n\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\t{t('checkout.startOver')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Iframe checkout — full-screen portal overlay\n\tif (order.checkout.method === 'iframe') {\n\t\tconst iframeSrc = order.checkout.url;\n\t\tconst allowAttr =\n\t\t\torder.checkout.allowedFeatures?.join('; ') ||\n\t\t\t'payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share';\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t{t('checkout.cancel')}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Spinner size={32} />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\t{t('checkout.loading')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={iframeSrc}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow={allowAttr}\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle={t('checkout.iframeTitle')}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\t// Redirect checkout\n\tif (order.checkout.method === 'redirect') {\n\t\treturn (\n\t\t\t<RedirectScreen\n\t\t\t\tgatewayName={order.gateway}\n\t\t\t\tcheckoutUrl={order.checkout.url}\n\t\t\t\tonCancel={goBack}\n\t\t\t\tredirectCountdown={redirectCountdown}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Widget checkout — full-screen portal overlay\n\tif (order.checkout.method === 'widget' && order.widgetConfig) {\n\t\tconst widgetUrl = buildWidgetUrl(order.checkout.url, order.widgetConfig);\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t{t('checkout.cancel')}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Spinner size={32} />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\t{t('checkout.loading')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={widgetUrl}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow=\"payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share\"\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle={t('checkout.widgetTitle')}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t>\n\t\t\t<p className=\"text-[15px] mb-4\">{t('checkout.unknownMethod')}</p>\n\t\t\t<button\n\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\tstyle={{\n\t\t\t\t\theight: 48,\n\t\t\t\t\tborderRadius: 'var(--t-cta-radius, 100px)',\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t}}\n\t\t\t\tonClick={goBack}\n\t\t\t>\n\t\t\t\t{t('checkout.goBack')}\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction buildWidgetUrl(baseUrl: string, config: Record<string, unknown>): string {\n\tconst url = new URL('/en/partner/widget', baseUrl);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value != null && value !== '') {\n\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\t}\n\treturn url.toString();\n}\n","/**\n * Processing Step Component\n * Shows order processing status with live updates.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useEffect } from 'react';\nimport { useRamp } from '../context/RampContext';\nimport { Spinner } from './ui/Spinner';\nimport { useT } from '../i18n';\n\nexport interface ProcessingStepProps {\n className?: string;\n}\n\nexport function ProcessingStep({ className = '' }: ProcessingStepProps) {\n const { orderStatus, orderStatusLoading, goToStep } = useRamp();\n const t = useT();\n\n useEffect(() => {\n if (!orderStatus) return;\n if (orderStatus.status === 'completed') {\n goToStep('complete');\n } else if (['failed', 'cancelled', 'expired', 'refunded'].includes(orderStatus.status)) {\n goToStep('error');\n }\n }, [orderStatus?.status, goToStep]);\n\n const getStatusMessage = () => {\n if (!orderStatus) return t('processing.default');\n switch (orderStatus.status) {\n case 'pending':\n return t('processing.pending');\n case 'processing':\n return t('processing.active');\n default:\n return t('processing.generic');\n }\n };\n\n return (\n <div className={`flex flex-col items-center justify-center px-8 py-12 text-center ${className}`}>\n <div className=\"mb-6\" style={{ animation: 'processingPulse 1500ms ease-in-out infinite' }}>\n <Spinner size={64} />\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-3\" style={{ color: 'var(--t-text)' }}>\n {getStatusMessage()}\n </h2>\n\n {orderStatusLoading && (\n <p className=\"text-[13px] mb-4\" style={{ color: 'var(--t-text-muted)' }}>{t('processing.checkingStatus')}</p>\n )}\n\n {orderStatus && (\n <div className=\"w-full mt-6 text-left\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n <DetailRow label={t('processing.orderId')} value={orderStatus.orderId} mono />\n <DetailRow label={t('processing.provider')} value={orderStatus.gateway} />\n <DetailRow\n label={t('processing.amount')}\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow\n label={t('processing.receiving')}\n value={`${orderStatus.cryptoAmount || '...'} ${orderStatus.cryptoCurrency}`}\n />\n <DetailRow label={t('processing.network')} value={orderStatus.network} />\n <DetailRow\n label={t('processing.toAddress')}\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n </div>\n )}\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('processing.usuallyMinutes')}\n </p>\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n {t('processing.safeToClose')}\n </p>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Complete Step Component\n * Success screen with transaction details.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\nimport { useT } from '../i18n';\n\nexport interface CompleteStepProps {\n className?: string;\n explorerUrl?: string;\n onDone?: () => void;\n doneButtonText?: string;\n}\n\nexport function CompleteStep({\n className = '',\n explorerUrl,\n onDone,\n doneButtonText,\n}: CompleteStepProps) {\n const { orderStatus, state, dispatch } = useRamp();\n const t = useT();\n const isSell = state.flowType === 'sell';\n\n const getExplorerUrl = () => {\n if (!orderStatus?.transactionHash) return null;\n if (!explorerUrl) {\n const defaultExplorers: Record<string, string> = {\n ethereum: 'https://etherscan.io/tx/{txHash}',\n polygon: 'https://polygonscan.com/tx/{txHash}',\n arbitrum: 'https://arbiscan.io/tx/{txHash}',\n optimism: 'https://optimistic.etherscan.io/tx/{txHash}',\n base: 'https://basescan.org/tx/{txHash}',\n bitcoin: 'https://mempool.space/tx/{txHash}',\n solana: 'https://solscan.io/tx/{txHash}',\n avalanche: 'https://snowtrace.io/tx/{txHash}',\n fantom: 'https://ftmscan.com/tx/{txHash}',\n };\n const baseUrl = defaultExplorers[state.network] || defaultExplorers.ethereum;\n return baseUrl.replace('{txHash}', orderStatus.transactionHash);\n }\n return explorerUrl.replace('{txHash}', orderStatus.transactionHash);\n };\n\n const handleDone = () => {\n if (onDone) {\n onDone();\n } else {\n dispatch({ type: 'RESET' });\n }\n };\n\n const explorerLink = getExplorerUrl();\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Success icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-success, #10b981)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path\n d=\"M4.83 12 9 16.17 19.59 5.59\"\n strokeDasharray=\"24\"\n strokeDashoffset=\"0\"\n style={{ animation: 'checkDraw 0.6s ease-out' }}\n />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {isSell ? t('complete.sellTitle') : t('complete.buyTitle')}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {isSell\n ? t('complete.sellDesc', { fiat: orderStatus?.fiatCurrency || state.fiatCurrency })\n : t('complete.buyDesc', { crypto: orderStatus?.cryptoCurrency || state.cryptoCurrency })\n }\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n <DetailRow\n label={isSell ? t('complete.amountSell') : t('complete.amountBuy')}\n value={`${orderStatus.cryptoAmount} ${orderStatus.cryptoCurrency}`}\n highlight\n />\n <DetailRow\n label={isSell ? t('complete.paidSell') : t('complete.paidBuy')}\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow label={t('complete.network')} value={orderStatus.network} />\n <DetailRow\n label={t('complete.wallet')}\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n {orderStatus.transactionHash && (\n <DetailRow\n label={t('complete.transaction')}\n value={`${orderStatus.transactionHash.slice(0, 10)}...${orderStatus.transactionHash.slice(-8)}`}\n mono\n />\n )}\n <DetailRow label={t('complete.provider')} value={orderStatus.gateway} />\n <DetailRow label={t('complete.orderId')} value={orderStatus.orderId} mono />\n {orderStatus.completedAt && (\n <DetailRow\n label={t('complete.completed')}\n value={new Date(orderStatus.completedAt).toLocaleString()}\n />\n )}\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n {explorerLink && (\n <a\n href={explorerLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-full font-semibold text-[14px] flex items-center justify-center transition-all\"\n style={{ height: 48, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-surface)', color: 'var(--t-text)', textDecoration: 'none' }}\n >\n {t('complete.viewExplorer')}\n </a>\n )}\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleDone}\n >\n {doneButtonText || t('complete.done')}\n </button>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Error Step Component\n * Displays error state with retry options.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\nimport { useT } from '../i18n';\n\nexport interface ErrorStepProps {\n className?: string;\n onRetry?: () => void;\n onDone?: () => void;\n doneButtonText?: string;\n supportEmail?: string;\n}\n\nexport function ErrorStep({\n className = '',\n onRetry,\n onDone,\n doneButtonText,\n supportEmail = 'support@nowramp.com',\n}: ErrorStepProps) {\n const { state, orderStatus, dispatch, goToStep } = useRamp();\n const t = useT();\n const isSell = state.flowType === 'sell';\n\n const getErrorTitle = () => {\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed': return t('errorStep.failed');\n case 'cancelled': return t('errorStep.cancelled');\n case 'expired': return t('errorStep.expired');\n case 'refunded': return t('errorStep.refunded');\n default: return t('errorStep.unknown');\n }\n }\n return t('errorStep.unknown');\n };\n\n const getErrorMessage = () => {\n if (state.errorMessage) return state.errorMessage;\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed':\n return isSell\n ? t('errorStep.failedSell')\n : t('errorStep.failedBuy');\n case 'cancelled':\n return isSell\n ? t('errorStep.cancelledSell')\n : t('errorStep.cancelledBuy');\n case 'expired':\n return isSell\n ? t('errorStep.expiredSell')\n : t('errorStep.expiredBuy');\n case 'refunded':\n return isSell\n ? t('errorStep.refundedSell')\n : t('errorStep.refundedBuy');\n default:\n return t('errorStep.genericDesc');\n }\n }\n return t('errorStep.genericDesc');\n };\n\n const handleRetry = () => {\n dispatch({ type: 'CLEAR_ERROR' });\n if (onRetry) {\n onRetry();\n } else {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n }\n };\n\n const handleStartOver = () => {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n };\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Error icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-error, #EF4444)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"white\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {getErrorTitle()}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {getErrorMessage()}\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n <div className=\"flex justify-between items-center py-2\">\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{t('errorStep.orderId')}</span>\n <span className=\"text-[13px] font-medium font-mono\" style={{ color: 'var(--t-text)' }}>\n {orderStatus.orderId}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleRetry}\n >\n {t('errorStep.tryAgain')}\n </button>\n <button\n className=\"w-full font-semibold text-[14px] transition-all\"\n style={{ height: 48, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-surface)', color: 'var(--t-text)' }}\n onClick={handleStartOver}\n >\n {t('errorStep.startOver')}\n </button>\n {onDone && (\n <button\n className=\"w-full font-semibold text-[14px] transition-all mt-1\"\n style={{ height: 48, borderRadius: 'var(--t-cta-radius, 100px)', background: 'transparent',\n color: 'var(--t-text-secondary)', border: '1px solid var(--t-divider)' }}\n onClick={onDone}\n aria-label={doneButtonText || t('errorStep.returnToMerchant')}\n >\n {doneButtonText || t('errorStep.return')}\n </button>\n )}\n </div>\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('errorStep.needHelp')}{' '}\n <a\n href={`mailto:${supportEmail}`}\n className=\"underline\"\n style={{ color: 'var(--t-accent)' }}\n >\n {supportEmail}\n </a>\n </p>\n {orderStatus && (\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n {t('errorStep.reference', { orderId: orderStatus.orderId })}\n </p>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Complete Banxa-supported cryptocurrencies and blockchains data.\n * TypeScript conversion of the crypto data module.\n * Icons are stored locally in /crypto-icons/{ticker}.svg\n */\n\n// ── TypeScript interfaces ──\n\nexport interface BlockchainInfo {\n name: string;\n shortName?: string;\n icon: string;\n}\n\nexport interface CryptoCurrency {\n code: string;\n name: string;\n chains: string[];\n popular: boolean;\n}\n\nexport interface FiatCurrency {\n code: string;\n name: string;\n}\n\nexport interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport interface CryptoChainCombo {\n code: string;\n name: string;\n chain: string;\n /** Display name from provider (e.g. \"Ethereum Mainnet\") */\n chainName?: string;\n popular: boolean;\n}\n\n// ── Blockchain / Network definitions ──\n// Maps blockchain codes to display names and their icon ticker\n\nexport const BLOCKCHAINS: Record<string, BlockchainInfo> = {\n // Canonical IDs (returned by the API — lowercase full names)\n // These cover cases where the canonical ID differs from the legacy uppercase key\n ethereum: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n bitcoin: { name: 'Bitcoin', icon: 'btc' },\n solana: { name: 'Solana', icon: 'sol' },\n polygon: { name: 'Polygon', icon: 'pol' },\n arbitrum: { name: 'Arbitrum', icon: 'arb' },\n avalanche: { name: 'Avalanche C-Chain', shortName: 'Avalanche', icon: 'avax' },\n litecoin: { name: 'Litecoin', icon: 'ltc' },\n tezos: { name: 'Tezos', icon: 'xtz' },\n sei: { name: 'SEI', icon: 'sei' },\n imx: { name: 'Immutable X', shortName: 'Immutable', icon: 'imx' },\n galachain: { name: 'Gala', icon: 'gala' },\n zksync2: { name: 'zkSync Era', shortName: 'zkSync', icon: 'zksync' },\n zks: { name: 'zkSpace', icon: 'zks' },\n 'flow-evm': { name: 'Flow (EVM)', shortName: 'Flow', icon: 'flow' },\n vara: { name: 'Vara', icon: 'vara' },\n venom: { name: 'Venom', icon: 'venom' },\n hsk: { name: 'HashKey Chain', shortName: 'HashKey', icon: 'hsk' },\n mck: { name: 'MCK', icon: 'mck' },\n peer: { name: 'Peer', icon: 'peer' },\n // Testnets (fallback display names)\n goerli: { name: 'Goerli Testnet', shortName: 'Goerli', icon: 'eth' },\n hbartestnet: { name: 'Hedera Testnet', shortName: 'Hedera', icon: 'hbar' },\n arbitrumrinkeby: { name: 'Arbitrum Testnet', shortName: 'Arbitrum', icon: 'arb' },\n dydxtestnet: { name: 'dYdX Testnet', shortName: 'dYdX', icon: 'stark' },\n 'zksync-rinkeby': { name: 'zkSync Testnet', shortName: 'zkSync', icon: 'zksync' },\n\n // Legacy uppercase keys (used by local crypto data and older integrations)\n ETH: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n BSC: { name: 'Binance Smart Chain (BEP20)', shortName: 'Binance', icon: 'bnb' },\n BTC: { name: 'Bitcoin', icon: 'btc' },\n SOL: { name: 'Solana', icon: 'sol' },\n MATIC: { name: 'Polygon', icon: 'pol' },\n ARB: { name: 'Arbitrum', icon: 'arb' },\n BASE: { name: 'Base', icon: 'base' },\n OPTIMISM: { name: 'Optimism', icon: 'op' },\n AVAX_C: { name: 'Avalanche C-Chain', shortName: 'Avalanche C', icon: 'avax' },\n AVAX_X: { name: 'Avalanche X-Chain', shortName: 'Avalanche X', icon: 'avax' },\n ADA: { name: 'Cardano', icon: 'ada' },\n DOT: { name: 'Polkadot', icon: 'dot' },\n TRON: { name: 'Tron (TRC20)', shortName: 'Tron', icon: 'trx' },\n XRP: { name: 'Ripple', icon: 'xrp' },\n XLM: { name: 'Stellar', icon: 'xlm' },\n ALGO: { name: 'Algorand', icon: 'algo' },\n ATOM: { name: 'Cosmos', icon: 'atom' },\n NEAR: { name: 'NEAR Protocol', shortName: 'NEAR', icon: 'near' },\n SUI: { name: 'Sui', icon: 'sui' },\n APT: { name: 'Aptos', icon: 'apt' },\n TON: { name: 'Ton', icon: 'ton' },\n FIL: { name: 'Filecoin', icon: 'fil' },\n FLOW: { name: 'Flow', icon: 'flow' },\n HBAR: { name: 'Hedera Hashgraph', shortName: 'Hedera', icon: 'hbar' },\n INJ: { name: 'Injective', icon: 'inj' },\n SEI_EVM: { name: 'SEI (EVM)', shortName: 'SEI', icon: 'sei' },\n ZKSYNC: { name: 'zkSync', icon: 'zksync' },\n LINEA: { name: 'Linea', icon: 'linea' },\n STARK: { name: 'StarkNet', icon: 'strk' },\n LN: { name: 'Lightning', icon: 'btc' },\n CELO: { name: 'Celo', icon: 'celo' },\n CRO: { name: 'Cronos', icon: 'cro' },\n FTM: { name: 'Fantom', icon: 'ftm' },\n GLMR: { name: 'Moonbeam', icon: 'glmr' },\n MOVR: { name: 'Moonriver', icon: 'movr' },\n KSM: { name: 'Kusama', icon: 'ksm' },\n EOS: { name: 'EOS', icon: 'eos' },\n ETC: { name: 'Ethereum Classic', shortName: 'ETH Classic', icon: 'etc' },\n LTC: { name: 'Litecoin', icon: 'ltc' },\n BCH: { name: 'Bitcoin Cash', shortName: 'BTC Cash', icon: 'bch' },\n DOGE: { name: 'Dogecoin', icon: 'doge' },\n BNB: { name: 'Binance Chain (BEP2)', shortName: 'Binance', icon: 'bnb' },\n ONE: { name: 'Harmony', icon: 'one' },\n KLAY: { name: 'Kaia', icon: 'kaia' },\n RON: { name: 'Ronin', icon: 'ron' },\n LRC: { name: 'Loopring', icon: 'lrc' },\n ICP: { name: 'Internet Computer', shortName: 'ICP', icon: 'icp' },\n EGLD: { name: 'MultiversX', icon: 'egld' },\n FLUX: { name: 'Flux', icon: 'flux' },\n KDA: { name: 'Kadena', icon: 'kda' },\n WAVES: { name: 'Waves', icon: 'waves' },\n XTZ: { name: 'Tezos', icon: 'xtz' },\n ACA: { name: 'Acala', icon: 'aca' },\n ALEO: { name: 'Aleo', icon: 'aleo' },\n ALPH: { name: 'Alephium', icon: 'alph' },\n APE: { name: 'ApeChain', icon: 'ape' },\n ASTR: { name: 'Astar', icon: 'astr' },\n AZERO: { name: 'Aleph Zero', icon: 'azero' },\n AZERO_EVM: { name: 'Aleph Zero EVM', shortName: 'Aleph Zero', icon: 'azero' },\n BAJU: { name: 'Bajun Network', shortName: 'Bajun', icon: 'baju' },\n BNCPOLKA: { name: 'Bifrost Polkadot', shortName: 'Bifrost', icon: 'bnc' },\n BNC: { name: 'Bifrost Kusama', shortName: 'Bifrost', icon: 'bnc' },\n BOBA: { name: 'Boba Network', shortName: 'Boba', icon: 'boba' },\n BSX: { name: 'Basilisk', icon: 'bsx' },\n CHZ: { name: 'Chiliz', icon: 'chz' },\n VIC: { name: 'Viction', icon: 'vic' },\n CCD: { name: 'Concordium', icon: 'ccd' },\n COREUM: { name: 'Coreum', icon: 'coreum' },\n DINGO: { name: 'Dingocoin', icon: 'dingo' },\n HDX: { name: 'Hydration', icon: 'hdx' },\n PLMC: { name: 'Polimec', icon: 'plmc' },\n MNT: { name: 'Mantle', icon: 'mnt' },\n ERG: { name: 'Ergo', icon: 'erg' },\n ECLIPSE: { name: 'Eclipse', icon: 'eclipse' },\n FUEL: { name: 'Fuel Ignition', shortName: 'Fuel', icon: 'fuel' },\n INK: { name: 'Ink', icon: 'ink' },\n SOPHON: { name: 'Sophon', icon: 'sophon' },\n UNICHAIN: { name: 'Unichain', icon: 'unichain' },\n WLD: { name: 'Worldchain', icon: 'wld' },\n ETHERLINK: { name: 'Etherlink', icon: 'etherlink' },\n MOB: { name: 'MobileCoin', icon: 'mob' },\n GALA: { name: 'Gala', icon: 'gala' },\n GUNZ: { name: 'Gunz', icon: 'gun' },\n HNT: { name: 'Helium', icon: 'hnt' },\n BITKUB: { name: 'BitKub', icon: 'kub' },\n IMMUTABLE_ZKEVM: { name: 'Immutable-zkEVM', shortName: 'Immutable', icon: 'imx' },\n INIT: { name: 'Initia', icon: 'init' },\n INTR: { name: 'Interlay', icon: 'intr' },\n KINESIS: { name: 'Kinesis', icon: 'kag' },\n KAR: { name: 'Karura', icon: 'kar' },\n KCC: { name: 'KuCoin Community Chain', shortName: 'KuCoin', icon: 'kcs' },\n KILT: { name: 'KILT Spiritnet', shortName: 'KILT', icon: 'kilt' },\n KINT: { name: 'Kintsugi', icon: 'kint' },\n KMD: { name: 'Komodo', icon: 'kmd' },\n LSK: { name: 'Lisk', icon: 'lsk' },\n METIS: { name: 'Metis Andromeda', shortName: 'Metis', icon: 'metis' },\n MYTH: { name: 'Myth', icon: 'myth' },\n OAS: { name: 'Oasys', icon: 'oas' },\n PEAQ_EVM: { name: 'Peaq (EVM)', shortName: 'Peaq', icon: 'peaq' },\n PEN: { name: 'Pendulum', icon: 'pen' },\n PI: { name: 'Pi', icon: 'pi' },\n POLYX: { name: 'Polymesh', icon: 'polyx' },\n Q: { name: 'QuantumCoin', icon: 'q' },\n QRL: { name: 'Quantum Resistant Ledger', shortName: 'QRL', icon: 'qrl' },\n QUBIC: { name: 'Qubic', icon: 'qubic' },\n RBX: { name: 'ReserveBlock', icon: 'rbx' },\n ROLLUX: { name: 'Rollux', icon: 'rollux' },\n THORCHAIN: { name: 'Thorchain', icon: 'rune' },\n S: { name: 'Sonic', icon: 's' },\n SONIC: { name: 'Sonic', icon: 's' },\n TERNOA: { name: 'Ternoa', icon: 'caps' },\n SX: { name: 'SX Network', icon: 'sol' },\n WAX: { name: 'WAX', icon: 'waxp' },\n XCH: { name: 'Chia Chain', icon: 'xch' },\n XPRT: { name: 'Persistence', icon: 'xprt' },\n ZETACHAIN: { name: 'ZetaChain', icon: 'zeta' },\n ZTG: { name: 'Zeitgeist', icon: 'ztg' },\n PLS: { name: 'Pulsechain', icon: 'pulsechain' },\n MEZO: { name: 'Mezo', icon: 'mezo' },\n BSV: { name: 'Bitcoin SV', shortName: 'BTC SV', icon: 'btc' },\n MONAD: { name: 'Monad', icon: 'mon' },\n SUPRA: { name: 'Supra', icon: 'supra' },\n SOMI: { name: 'Somnia', icon: 'somi' },\n VERIFIEDX: { name: 'VerifiedX', icon: 'vfx' },\n MOVE: { name: 'Movement', icon: 'move' },\n FLR: { name: 'Flare', icon: 'flr' },\n ASSETHUB: { name: 'Asset Hub Polkadot', shortName: 'Asset Hub', icon: 'dot' },\n BOB: { name: 'BOB', icon: 'btc' },\n GLUE: { name: 'Glue', icon: 'eth' },\n DYDX: { name: 'StarkEx', icon: 'stark' },\n OKC: { name: 'OKX Chain', icon: 'eth' },\n UNI_CHAIN: { name: 'UNI', icon: 'uni' },\n ZEC: { name: 'ZCash', icon: 'zec' },\n};\n\n// ── Full Banxa-supported cryptocurrencies ──\n// Each entry: { code, name, chains[], popular }\n// chains[] lists the blockchain codes this crypto is available on\n\nexport const CRYPTO_CURRENCIES: CryptoCurrency[] = [\n // --- Popular / Top coins ---\n { code: 'BTC', name: 'Bitcoin', chains: ['BTC', 'LN'], popular: true },\n { code: 'ETH', name: 'Ethereum', chains: ['ETH', 'ARB', 'BASE', 'BSC', 'OPTIMISM', 'LINEA', 'ZKSYNC', 'LRC', 'STARK', 'APE', 'ECLIPSE', 'FUEL', 'INK', 'SOPHON', 'UNICHAIN', 'WLD'], popular: true },\n { code: 'USDC', name: 'USD Coin', chains: ['ETH', 'SOL', 'ARB', 'BASE', 'BSC', 'MATIC', 'OPTIMISM', 'AVAX_C', 'ALGO', 'APT', 'CELO', 'FLOW', 'HBAR', 'LINEA', 'LRC', 'ZKSYNC', 'STARK', 'SUI', 'XLM', 'ECLIPSE', 'HDX', 'INK', 'LSK', 'METIS', 'MONAD', 'SEI_EVM', 'SONIC', 'SOPHON', 'SX', 'UNICHAIN', 'APE', 'BNCPOLKA', 'GLMR', 'PEAQ_EVM', 'PLMC', 'RON', 'UNI_CHAIN', 'WLD', 'BITKUB', 'BOB', 'DYDX', 'ETHERLINK', 'GLUE', 'ASSETHUB'], popular: true },\n { code: 'USDT', name: 'Tether', chains: ['ETH', 'BSC', 'TRON', 'ARB', 'MATIC', 'AVAX_C', 'SOL', 'OPTIMISM', 'ZKSYNC', 'STARK', 'APT', 'CELO', 'KLAY', 'LRC', 'LSK', 'ECLIPSE', 'ETHERLINK', 'OKC', 'PEAQ_EVM', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC', 'VIC', 'ASSETHUB'], popular: true },\n { code: 'SOL', name: 'Solana', chains: ['SOL'], popular: true },\n { code: 'XRP', name: 'Ripple', chains: ['XRP'], popular: true },\n { code: 'ADA', name: 'Cardano', chains: ['ADA'], popular: true },\n { code: 'DOGE', name: 'Dogecoin', chains: ['DOGE'], popular: true },\n { code: 'DOT', name: 'Polkadot', chains: ['DOT', 'BSC', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC'], popular: true },\n { code: 'AVAX', name: 'Avalanche', chains: ['AVAX_C', 'AVAX_X', 'BSC'], popular: true },\n { code: 'LINK', name: 'ChainLink', chains: ['ETH', 'BSC'], popular: true },\n { code: 'LTC', name: 'Litecoin', chains: ['LTC'], popular: true },\n\n // --- Major altcoins ---\n { code: 'AAVE', name: 'Aave', chains: ['ETH', 'BSC'], popular: false },\n { code: 'ACA', name: 'Acala', chains: ['ACA'], popular: false },\n { code: 'ALEO', name: 'Aleo', chains: ['ALEO'], popular: false },\n { code: 'ALGO', name: 'Algorand', chains: ['ALGO'], popular: false },\n { code: 'ALPH', name: 'Alephium', chains: ['ALPH'], popular: false },\n { code: 'APE', name: 'ApeCoin', chains: ['APE', 'ETH'], popular: false },\n { code: 'APT', name: 'Aptos', chains: ['APT'], popular: false },\n { code: 'ARB', name: 'Arbitrum', chains: ['ARB'], popular: false },\n { code: 'ASTR', name: 'Astar', chains: ['ASTR'], popular: false },\n { code: 'ATOM', name: 'Cosmos', chains: ['ATOM'], popular: false },\n { code: 'AUDD', name: 'Novatti Australian Digital Dollar', chains: ['ETH'], popular: false },\n { code: 'AVT', name: 'Aventus', chains: ['ETH'], popular: false },\n { code: 'AXS', name: 'Axie Infinity', chains: ['ETH', 'RON'], popular: false },\n { code: 'AZERO', name: 'Aleph Zero', chains: ['AZERO', 'AZERO_EVM'], popular: false },\n { code: 'BAJU', name: 'Bajun Network', chains: ['BAJU'], popular: false },\n { code: 'BARSIK', name: \"Hasbulla's Cat\", chains: ['SOL'], popular: false },\n { code: 'BAT', name: 'Basic Attention Token', chains: ['ETH', 'BSC'], popular: false },\n { code: 'BCH', name: 'Bitcoin Cash', chains: ['BCH'], popular: false },\n { code: 'BNB', name: 'Binance Coin', chains: ['BNB', 'BSC'], popular: false },\n { code: 'BNC', name: 'Bifrost Native Coin', chains: ['BNC', 'BNCPOLKA'], popular: false },\n { code: 'BOBA', name: 'Boba Network', chains: ['BOBA', 'ETH'], popular: false },\n { code: 'BORA', name: 'Bora', chains: ['KLAY'], popular: false },\n { code: 'BRETT', name: 'Brett', chains: ['BASE'], popular: false },\n { code: 'BSX', name: 'Basilisk', chains: ['BSX'], popular: false },\n { code: 'BZR', name: 'Bazaars', chains: ['ETH'], popular: false },\n { code: 'CAGA', name: 'Crypto Asset Governance Alliance', chains: ['ETH'], popular: false },\n { code: 'CAKE', name: 'PancakeSwap', chains: ['BSC'], popular: false },\n { code: 'CAPS', name: 'Caps', chains: ['TERNOA'], popular: false },\n { code: 'CELO', name: 'Celo', chains: ['CELO'], popular: false },\n { code: 'CHZ', name: 'Chiliz', chains: ['CHZ', 'BNB', 'ETH'], popular: false },\n { code: 'C98', name: 'Coin98', chains: ['VIC'], popular: false },\n { code: 'CCD', name: 'Concordium', chains: ['CCD'], popular: false },\n { code: 'COMP', name: 'Compound', chains: ['ETH', 'BSC'], popular: false },\n { code: 'COREUM', name: 'Coreum', chains: ['COREUM', 'XRP'], popular: false },\n { code: 'CRO', name: 'Cronos', chains: ['CRO'], popular: false },\n { code: 'CUSD', name: 'Celo Dollar', chains: ['CELO'], popular: false },\n { code: 'CVC', name: 'Civic', chains: ['ETH'], popular: false },\n { code: 'DAI', name: 'Dai', chains: ['ETH', 'BASE', 'MATIC'], popular: false },\n { code: 'DINGO', name: 'Dingocoin', chains: ['DINGO'], popular: false },\n { code: 'EGLD', name: 'MultiversX', chains: ['EGLD'], popular: false },\n { code: 'EMBER', name: 'Ember Sword', chains: ['MNT'], popular: false },\n { code: 'EOS', name: 'EOS', chains: ['EOS'], popular: false },\n { code: 'ERG', name: 'Ergo', chains: ['ERG'], popular: false },\n { code: 'ETC', name: 'Ethereum Classic', chains: ['ETC', 'BSC'], popular: false },\n { code: 'EUR', name: 'EURC', chains: ['BASE'], popular: false },\n { code: 'EUROC', name: 'Euro Coin', chains: ['ETH'], popular: false },\n { code: 'EURQ', name: 'Quantoz EURQ', chains: ['ETH'], popular: false },\n { code: 'EURR', name: 'StablR EUR', chains: ['ETH'], popular: false },\n { code: 'EUSD', name: 'Electronic USD', chains: ['MOB'], popular: false },\n { code: 'EXIT', name: 'EXIT - Designer Token', chains: ['BSC'], popular: false },\n { code: 'FDUSD', name: 'First Digital USD', chains: ['SUI'], popular: false },\n { code: 'FIL', name: 'Filecoin', chains: ['FIL', 'BSC'], popular: false },\n { code: 'FLOW', name: 'Flow', chains: ['FLOW'], popular: false },\n { code: 'FLR', name: 'Flare', chains: ['FLR'], popular: false },\n { code: 'FLUX', name: 'Flux', chains: ['FLUX'], popular: false },\n { code: 'FTM', name: 'Fantom', chains: ['FTM', 'ETH', 'BSC'], popular: false },\n { code: 'GALA', name: 'Gala', chains: ['GALA'], popular: false },\n { code: 'GLMR', name: 'Moonbeam', chains: ['GLMR'], popular: false },\n { code: 'GMX', name: 'GMX', chains: ['ARB'], popular: false },\n { code: 'GNUS', name: 'Genius AI', chains: ['ETH'], popular: false },\n { code: 'GRT', name: 'The Graph', chains: ['ETH', 'ARB'], popular: false },\n { code: 'GUN', name: 'Gunz', chains: ['GUNZ'], popular: false },\n { code: 'HBAR', name: 'Hedera', chains: ['HBAR'], popular: false },\n { code: 'HDX', name: 'HydraDX', chains: ['HDX'], popular: false },\n { code: 'HNT', name: 'Helium', chains: ['HNT'], popular: false },\n { code: 'HTP', name: 'HowToPay', chains: ['BSC'], popular: false },\n { code: 'HVLO', name: 'Hivello', chains: ['SOL'], popular: false },\n { code: 'ICP', name: 'Internet Computer', chains: ['ICP'], popular: false },\n { code: 'IMX', name: 'Immutable X', chains: ['ETH'], popular: false },\n { code: 'INIT', name: 'Initia', chains: ['INIT'], popular: false },\n { code: 'INJ', name: 'Injective', chains: ['INJ'], popular: false },\n { code: 'INTR', name: 'Interlay', chains: ['INTR'], popular: false },\n { code: 'JAM', name: 'Jam Tune.FM', chains: ['HBAR'], popular: false },\n { code: 'KAG', name: 'Silver', chains: ['KINESIS'], popular: false },\n { code: 'KAIA', name: 'Kaia', chains: ['KLAY'], popular: false },\n { code: 'KAR', name: 'Karura', chains: ['KAR'], popular: false },\n { code: 'KAU', name: 'Gold', chains: ['KINESIS'], popular: false },\n { code: 'KCS', name: 'KuCoin Token', chains: ['ETH', 'KCC'], popular: false },\n { code: 'KDA', name: 'Kadena', chains: ['KDA'], popular: false },\n { code: 'KILT', name: 'KILT', chains: ['KILT'], popular: false },\n { code: 'KINT', name: 'Kintsugi', chains: ['KINT'], popular: false },\n { code: 'KLV', name: 'Klever', chains: ['TRON'], popular: false },\n { code: 'KMD', name: 'Komodo', chains: ['KMD'], popular: false },\n { code: 'KSM', name: 'Kusama', chains: ['KSM'], popular: false },\n { code: 'KUB', name: 'Bitkub Coin', chains: ['BITKUB'], popular: false },\n { code: 'LOOKS', name: 'LooksRare', chains: ['ETH'], popular: false },\n { code: 'LRC', name: 'Loopring', chains: ['ETH', 'LRC'], popular: false },\n { code: 'LSK', name: 'Lisk', chains: ['LSK'], popular: false },\n { code: 'MANA', name: 'Decentraland', chains: ['ETH'], popular: false },\n { code: 'MBX', name: 'Marblex', chains: ['IMMUTABLE_ZKEVM', 'KLAY'], popular: false },\n { code: 'MELANIA', name: 'Melania', chains: ['SOL'], popular: false },\n { code: 'METAMASKUSD', name: 'Metamask USD', chains: ['ETH', 'LINEA'], popular: false },\n { code: 'METIS', name: 'Metis', chains: ['METIS'], popular: false },\n { code: 'MEZOUSD', name: 'MUSD', chains: ['ETH', 'MEZO'], popular: false },\n { code: 'MKR', name: 'Maker', chains: ['ETH', 'BSC'], popular: false },\n { code: 'MNEE', name: 'MNEE', chains: ['BSV', 'ETH'], popular: false },\n { code: 'MNT', name: 'Mantle', chains: ['ETH', 'MNT'], popular: false },\n { code: 'MOB', name: 'MobileCoin', chains: ['MOB'], popular: false },\n { code: 'MON', name: 'Monad', chains: ['MONAD'], popular: false },\n { code: 'MOVE', name: 'Movement', chains: ['MOVE'], popular: false },\n { code: 'MOVR', name: 'Moonriver', chains: ['MOVR'], popular: false },\n { code: 'MYTH', name: 'Myth', chains: ['MYTH'], popular: false },\n { code: 'NEAR', name: 'NEAR Protocol', chains: ['NEAR', 'BSC'], popular: false },\n { code: 'NEIRO', name: 'NEIRO Ethereum', chains: ['ETH'], popular: false },\n { code: 'OAS', name: 'Oasys', chains: ['OAS'], popular: false },\n { code: 'OMG', name: 'OmiseGo', chains: ['ETH'], popular: false },\n { code: 'OMUSD', name: 'Open Money USD', chains: ['ETH'], popular: false },\n { code: 'ONE', name: 'Harmony', chains: ['ONE', 'BNB', 'ETH'], popular: false },\n { code: 'OP', name: 'Optimism', chains: ['OPTIMISM'], popular: false },\n { code: 'ORDER', name: 'Orderly Network', chains: ['ETH'], popular: false },\n { code: 'PEAQ', name: 'Peaq', chains: ['PEAQ_EVM'], popular: false },\n { code: 'PEN', name: 'Pendulum', chains: ['PEN'], popular: false },\n { code: 'PERC', name: 'Perion', chains: ['ETH'], popular: false },\n { code: 'PI', name: 'Pi', chains: ['PI'], popular: false },\n { code: 'PLMC', name: 'Polimec', chains: ['PLMC'], popular: false },\n { code: 'POL', name: 'Polygon', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'POLYX', name: 'Polymesh', chains: ['POLYX'], popular: false },\n { code: 'PROPC', name: 'Propchain', chains: ['ETH'], popular: false },\n { code: 'PSTAKE', name: 'pSTAKE Finance', chains: ['ETH'], popular: false },\n { code: 'Q', name: 'QuantumCoin', chains: ['Q'], popular: false },\n { code: 'QRDO', name: 'Qredo', chains: ['ETH'], popular: false },\n { code: 'QRL', name: 'Quantum Resistant Ledger', chains: ['QRL'], popular: false },\n { code: 'QUBIC', name: 'QUBIC', chains: ['QUBIC'], popular: false },\n { code: 'RBX', name: 'ReserveBlock', chains: ['RBX'], popular: false },\n { code: 'REVU', name: 'Revuto', chains: ['ADA'], popular: false },\n { code: 'RITE', name: 'Ritestream', chains: ['BSC'], popular: false },\n { code: 'RLUSD', name: 'Ripple USD', chains: ['ETH'], popular: false },\n { code: 'RON', name: 'Ronin', chains: ['RON'], popular: false },\n { code: 'RUNE', name: 'THORChain', chains: ['THORCHAIN'], popular: false },\n { code: 'S', name: 'Sonic', chains: ['S'], popular: false },\n { code: 'SAND', name: 'The Sandbox', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SEI', name: 'SEI', chains: ['SEI_EVM'], popular: false },\n { code: 'SNX', name: 'Synthetix', chains: ['ETH'], popular: false },\n { code: 'SOIL', name: 'Sun Minimeal', chains: ['PLS'], popular: false },\n { code: 'SOLO', name: 'Sologenic', chains: ['XRP'], popular: false },\n { code: 'SOMI', name: 'Somnia', chains: ['SOMI'], popular: false },\n { code: 'STRK', name: 'Starknet', chains: ['STARK'], popular: false },\n { code: 'SUI', name: 'Sui', chains: ['SUI'], popular: false },\n { code: 'SUPR', name: 'SuperDapp', chains: ['ROLLUX'], popular: false },\n { code: 'SUPRA', name: 'Supra', chains: ['SUPRA'], popular: false },\n { code: 'SUSHI', name: 'SushiSwap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SYS', name: 'Syscoin', chains: ['ROLLUX'], popular: false },\n { code: 'TBTC', name: 'tBTC', chains: ['SUI', 'STARK'], popular: false },\n { code: 'TON', name: 'Toncoin', chains: ['TON'], popular: false },\n { code: 'TRUMP', name: 'TRUMP', chains: ['SOL'], popular: false },\n { code: 'TRX', name: 'Tron', chains: ['TRON', 'BSC'], popular: false },\n { code: 'TWT', name: 'Trust Wallet Token', chains: ['BSC'], popular: false },\n { code: 'UNI', name: 'Uniswap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'URANIUM', name: 'Uranium', chains: ['ETHERLINK'], popular: false },\n { code: 'USD0', name: 'Usual USD', chains: ['ETH'], popular: false },\n { code: 'USD1', name: 'World Liberty Financial USD', chains: ['SOL'], popular: false },\n { code: 'USDE', name: 'Ethena USDe', chains: ['ETH'], popular: false },\n { code: 'USDP', name: 'Pax Dollar', chains: ['ETH'], popular: false },\n { code: 'USDQ', name: 'Quantoz USDQ', chains: ['ETH'], popular: false },\n { code: 'USDR', name: 'StablR USD', chains: ['ETH'], popular: false },\n { code: 'USDT0', name: 'USDT0', chains: ['INK'], popular: false },\n { code: 'VFX', name: 'VerifiedX', chains: ['VERIFIEDX'], popular: false },\n { code: 'VERSE', name: 'Verse', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'VIC', name: 'Viction', chains: ['VIC'], popular: false },\n { code: 'WAL', name: 'Walrus', chains: ['SUI'], popular: false },\n { code: 'WAVES', name: 'Waves', chains: ['WAVES'], popular: false },\n { code: 'WAXP', name: 'WAX', chains: ['WAX'], popular: false },\n { code: 'WBTC', name: 'Wrapped Bitcoin', chains: ['ETH', 'STARK'], popular: false },\n { code: 'WETH', name: 'Wrapped Ether', chains: ['ETHERLINK'], popular: false },\n { code: 'WLD', name: 'Worldcoin', chains: ['WLD'], popular: false },\n { code: 'WLFI', name: 'World Liberty Financial', chains: ['ETH'], popular: false },\n { code: 'WOLF', name: 'LandWolf', chains: ['ETH'], popular: false },\n { code: 'WOMBAT', name: 'Wombat', chains: ['MATIC'], popular: false },\n { code: 'XCH', name: 'Chia', chains: ['XCH'], popular: false },\n { code: 'XLM', name: 'Stellar Lumens', chains: ['XLM', 'BSC'], popular: false },\n { code: 'XPRT', name: 'Persistence', chains: ['XPRT'], popular: false },\n { code: 'XTZ', name: 'Tezos', chains: ['XTZ', 'ETHERLINK'], popular: false },\n { code: 'YFI', name: 'yearn.finance', chains: ['ETH'], popular: false },\n { code: 'ZBU', name: 'Zeebu', chains: ['BSC'], popular: false },\n { code: 'ZEC', name: 'ZCash', chains: ['ZEC'], popular: false },\n { code: 'ZCHF', name: 'Frankencoin', chains: ['ETH'], popular: false },\n { code: 'ZETA', name: 'Zeta', chains: ['ETH', 'ZETACHAIN'], popular: false },\n { code: 'ZTG', name: 'Zeitgeist', chains: ['ZTG'], popular: false },\n];\n\n// ── Crypto code -> name lookup (for API data that only has codes) ──\nexport const CRYPTO_NAMES: Record<string, string> = Object.fromEntries(\n CRYPTO_CURRENCIES.map(c => [c.code, c.name])\n);\n\n// ── Fiat currency code -> ISO country code for flag lookup ──\n\nexport const FIAT_TO_COUNTRY: Record<string, string> = {\n AED: 'ae',\n ALL: 'al',\n ARS: 'ar',\n AUD: 'au',\n BRL: 'br',\n CAD: 'ca',\n CHF: 'ch',\n CLP: 'cl',\n CZK: 'cz',\n DKK: 'dk',\n EUR: 'eu',\n GBP: 'gb',\n HKD: 'hk',\n IDR: 'id',\n INR: 'in',\n JPY: 'jp',\n KRW: 'kr',\n MXN: 'mx',\n NGN: 'ng',\n NOK: 'no',\n NZD: 'nz',\n PHP: 'ph',\n PLN: 'pl',\n QAR: 'qa',\n SAR: 'sa',\n SEK: 'se',\n SGD: 'sg',\n THB: 'th',\n TRY: 'tr',\n TWD: 'tw',\n USD: 'us',\n VND: 'vn',\n ZAR: 'za',\n};\n\n// ── Icon URL helpers ──\n\n/**\n * Get the icon URL for a crypto ticker.\n * Icons are stored as SVGs in /crypto-icons/{ticker}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getCryptoIconUrl(ticker: string, baseUrl = ''): string {\n return `${baseUrl}/crypto-icons/${ticker.toLowerCase()}.svg`;\n}\n\n/**\n * Get the flag URL for a fiat currency code.\n * Flags are stored as SVGs in /flags/{country_code}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getFiatFlagUrl(currencyCode: string, baseUrl = ''): string {\n const country = FIAT_TO_COUNTRY[currencyCode] || 'us';\n return `${baseUrl}/flags/${country}.svg`;\n}\n\n/**\n * Get the icon URL for a blockchain/chain.\n * Uses the chain's native token icon.\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\n/** Lookup a chain in BLOCKCHAINS, handling canonical ids, legacy codes, and separator differences */\nexport function getChainInfo(chainCode: string): BlockchainInfo | undefined {\n return BLOCKCHAINS[chainCode]\n || BLOCKCHAINS[chainCode.toLowerCase()]\n || BLOCKCHAINS[chainCode.toUpperCase()]\n || BLOCKCHAINS[chainCode.toUpperCase().replace(/-/g, '_')]\n || BLOCKCHAINS[chainCode.toLowerCase().replace(/-/g, '_')];\n}\n\n/**\n * Get the icon URL for a provider/gateway.\n * Icons are stored as SVGs in /provider-icons/{id}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getProviderIconUrl(gatewayId: string, baseUrl = ''): string {\n return `${baseUrl}/provider-icons/${gatewayId.toLowerCase()}.svg`;\n}\n\nexport function getChainIconUrl(chainCode: string, baseUrl = ''): string {\n const chain = getChainInfo(chainCode);\n if (chain) return `${baseUrl}/crypto-icons/${chain.icon}.svg`;\n return `${baseUrl}/crypto-icons/${chainCode.toLowerCase()}.svg`;\n}\n\n// ── Fiat currencies ──\n\nexport const FIAT_CURRENCIES: FiatCurrency[] = [\n { code: 'ALL', name: 'Albania Lek' },\n { code: 'ARS', name: 'Argentina Peso' },\n { code: 'AUD', name: 'Australian Dollar' },\n { code: 'BRL', name: 'Brazilian Real' },\n { code: 'CAD', name: 'Canadian Dollar' },\n { code: 'EUR', name: 'Euro' },\n { code: 'GBP', name: 'British Pound' },\n { code: 'JPY', name: 'Japanese Yen' },\n { code: 'USD', name: 'US Dollar' },\n { code: 'CHF', name: 'Swiss Franc' },\n { code: 'MXN', name: 'Mexican Peso' },\n { code: 'INR', name: 'Indian Rupee' },\n];\n\n// ── Skin presets ──\n\nexport const SKINS: Skin[] = [\n { id: 'blue', name: 'Blue', accent: '#0077FF' },\n { id: 'violet', name: 'Violet', accent: '#7C3AED' },\n { id: 'green', name: 'Green', accent: '#10B981' },\n { id: 'orange', name: 'Orange', accent: '#F59E0B' },\n { id: 'rose', name: 'Rose', accent: '#F43F5E' },\n { id: 'mono', name: 'Mono', accent: null },\n];\n\n// ── Mock rates ──\n\nexport const MOCK_RATES: Record<string, Record<string, number>> = {\n USDC: { USD: 0.9962, EUR: 1.0814, GBP: 1.2573, JPY: 0.00667, CAD: 0.7198, AUD: 0.6384, BRL: 0.1726, CHF: 1.1306, MXN: 0.0487, INR: 0.01187, ARS: 0.000855, ALL: 0.01058 },\n USDT: { USD: 0.9958, EUR: 1.0810, GBP: 1.2568, JPY: 0.00666, CAD: 0.7194, AUD: 0.6380, BRL: 0.1724, CHF: 1.1301, MXN: 0.0486, INR: 0.01186, ARS: 0.000854, ALL: 0.01057 },\n BTC: { USD: 0.0000104, EUR: 0.00001129, GBP: 0.00001313, JPY: 0.0000000696, CAD: 0.00000751, AUD: 0.00000666, BRL: 0.0000018, CHF: 0.0000118, MXN: 0.000000508, INR: 0.000000124, ARS: 0.00000000892, ALL: 0.00000011 },\n ETH: { USD: 0.000316, EUR: 0.000343, GBP: 0.000399, JPY: 0.00000211, CAD: 0.000228, AUD: 0.000202, BRL: 0.0000547, CHF: 0.000358, MXN: 0.0000154, INR: 0.00000376, ARS: 0.000000271, ALL: 0.00000335 },\n SOL: { USD: 0.00424, EUR: 0.004607, GBP: 0.005356, JPY: 0.0000284, CAD: 0.003063, AUD: 0.002716, BRL: 0.000734, CHF: 0.004812, MXN: 0.000207, INR: 0.0000505, ARS: 0.00000364, ALL: 0.000045 },\n XRP: { USD: 0.4081, EUR: 0.4432, GBP: 0.5153, JPY: 0.00273, CAD: 0.2948, AUD: 0.2614, BRL: 0.0707, CHF: 0.4630, MXN: 0.01992, INR: 0.00486, ARS: 0.000350, ALL: 0.00433 },\n DOGE: { USD: 3.896, EUR: 4.232, GBP: 4.920, JPY: 0.02607, CAD: 2.815, AUD: 2.496, BRL: 0.6750, CHF: 4.421, MXN: 0.1902, INR: 0.04641, ARS: 0.003345, ALL: 0.04134 },\n ADA: { USD: 1.333, EUR: 1.448, GBP: 1.683, JPY: 0.00892, CAD: 0.963, AUD: 0.854, BRL: 0.2309, CHF: 1.512, MXN: 0.0651, INR: 0.01588, ARS: 0.001145, ALL: 0.01414 },\n};\n\n// ── Stablecoin detection ──\n\nconst STABLECOINS = new Set([\n 'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'FDUSD', 'PYUSD',\n 'USDP', 'USDE', 'USDQ', 'USDR', 'USDT0', 'RLUSD',\n 'CUSD', 'EUSD', 'OMUSD', 'MEZOUSD', 'METAMASKUSD',\n 'USD0', 'USD1', 'AUDD', 'EUROC', 'EURQ', 'EURR', 'ZCHF',\n]);\n\n/** Check if a crypto code is a known stablecoin */\nexport function isStablecoin(code: string): boolean {\n return STABLECOINS.has(code.toUpperCase());\n}\n\n// ── Helper functions ──\n\nexport function getMockRate(crypto: string, fiat: string): number {\n return MOCK_RATES[crypto]?.[fiat] ?? MOCK_RATES['USDC']?.[fiat] ?? 1;\n}\n\nexport function parseAmount(str: string): number {\n return parseFloat(str.replace(/,/g, '')) || 0;\n}\n\nexport function formatOutput(num: number): string {\n if (num === 0) return '0';\n if (num >= 1000) return num.toLocaleString('en-US', { maximumFractionDigits: 2 });\n if (num >= 1) return num.toFixed(2);\n if (num >= 0.01) return num.toFixed(4);\n const s = num.toPrecision(4);\n return parseFloat(s).toString();\n}\n\nexport const isValidHex = (str: string): boolean => /^#([0-9A-Fa-f]{3}){1,2}$/.test(str);\n\n// ── Validation constants ──\n\nexport const MIN_FIAT_AMOUNT = 10;\nexport const MIN_CRYPTO_AMOUNT = 0.0001;\n\n// ── Pre-built flat list of every crypto+chain combination ──\n\nexport const CRYPTO_CHAIN_COMBOS: CryptoChainCombo[] = (() => {\n const list: CryptoChainCombo[] = [];\n for (const c of CRYPTO_CURRENCIES) {\n for (const chain of c.chains) {\n list.push({ code: c.code, name: c.name, chain, popular: c.popular });\n }\n }\n return list;\n})();\n","/**\n * Confirm Step Component\n * Shown when all fields are pre-configured (session mode).\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useState } from 'react';\nimport { useRamp } from '../context/RampContext';\nimport { isStablecoin, formatOutput } from '../data/cryptoData';\nimport { Spinner } from './ui/Spinner';\nimport { useT } from '../i18n';\n\nexport interface ConfirmStepProps {\n className?: string;\n stablecoinParity?: boolean;\n partnerName?: string;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-6)}`;\n}\n\nexport function ConfirmStep({ className = '', stablecoinParity, partnerName }: ConfirmStepProps) {\n const {\n config,\n configLoading,\n state,\n defaultGateway,\n quotes,\n fetchQuotes,\n createOrder,\n orderLoading,\n } = useRamp();\n const t = useT();\n\n const isSell = state.flowType === 'sell';\n const [error, setError] = useState<string | null>(null);\n\n const gatewayInfo = config?.gateways.find((g) => g.id === defaultGateway);\n\n // Parity display for confirm step: stablecoin equivalent of fiat (partner absorbs fees)\n const exchangeRate = quotes?.bestQuote?.exchangeRate ? parseFloat(quotes.bestQuote.exchangeRate) : null;\n const fiatNumeric = parseFloat(state.fiatAmount) || 0;\n const confirmParityActive = !!(stablecoinParity && partnerName && !isSell && isStablecoin(state.cryptoCurrency) && exchangeRate);\n const confirmSamePeg = confirmParityActive && state.cryptoCurrency.toUpperCase().includes(state.fiatCurrency.toUpperCase());\n const confirmParityAmount = confirmParityActive && fiatNumeric > 0\n ? formatOutput(confirmSamePeg ? fiatNumeric : fiatNumeric / exchangeRate)\n : null;\n\n const handleConfirm = async () => {\n setError(null);\n try {\n fetchQuotes();\n await createOrder();\n } catch (err) {\n const message = err instanceof Error ? err.message : t('error.createOrderFailed');\n setError(message);\n }\n };\n\n if (configLoading) {\n return (\n <div className={`flex flex-col items-center justify-center p-12 ${className}`}>\n <Spinner size={32} />\n <p className=\"text-[14px] mt-4\" style={{ color: 'var(--t-text-secondary)' }}>{t('confirm.loading')}</p>\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 ${className}`}>\n <h2 className=\"text-[20px] font-semibold mb-6\" style={{ color: 'var(--t-text)' }}>\n {isSell ? t('confirm.sellTitle') : t('confirm.buyTitle')}\n </h2>\n\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n {gatewayInfo && (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{t('confirm.provider')}</span>\n <span className=\"flex items-center gap-2\">\n {gatewayInfo.logo && (\n <img src={gatewayInfo.logo} alt={gatewayInfo.name} width={20} height={20} style={{ borderRadius: 4 }} />\n )}\n <span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>{gatewayInfo.name}</span>\n </span>\n </div>\n )}\n\n {isSell ? (\n <>\n <DetailRow label={t('confirm.youSell')} value={`${state.cryptoAmount} ${state.cryptoCurrency}`} highlight />\n <DetailRow label={t('confirm.youReceive')} value={t('confirm.payout', { currency: state.fiatCurrency })} />\n </>\n ) : (\n <>\n <DetailRow label={t('confirm.youPay')} value={`${state.fiatAmount} ${state.fiatCurrency}`} highlight />\n <DetailRow\n label={t('confirm.youReceive')}\n value={confirmParityAmount ? `${confirmParityAmount} ${state.cryptoCurrency}` : t('confirm.cryptoOnNetwork', { crypto: state.cryptoCurrency, network: state.network })}\n />\n <DetailRow label={t('confirm.wallet')} value={truncateAddress(state.walletAddress)} mono />\n {confirmParityActive && confirmParityAmount && (\n <div className=\"py-2 text-[11px]\" style={{ color: 'var(--t-text-muted)', lineHeight: '15px' }}>\n {t('confirm.parityNote', { amount: confirmParityAmount, crypto: state.cryptoCurrency, partner: partnerName })}\n </div>\n )}\n </>\n )}\n\n <DetailRow label={t('confirm.network')} value={state.network} />\n\n {isSell && state.walletAddress && (\n <DetailRow label={t('confirm.refundAddress')} value={truncateAddress(state.walletAddress)} mono />\n )}\n </div>\n\n {error && (\n <p className=\"text-[12px] mb-4\" style={{ color: '#EF4444' }}>{error}</p>\n )}\n\n <button\n className=\"w-full font-semibold text-[16px] transition-all flex items-center justify-center gap-2\"\n style={{ height: 60, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)', opacity: orderLoading ? 0.7 : 1 }}\n disabled={orderLoading}\n onClick={handleConfirm}\n >\n {orderLoading ? (\n <>\n <Spinner size={18} />\n {t('confirm.processing')}\n </>\n ) : (\n isSell ? t('confirm.confirmSell') : t('confirm.confirmPay')\n )}\n </button>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","import type React from 'react';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function Modal({\n isOpen,\n onClose,\n children,\n variant = 'bottom',\n}: {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode | ((close: () => void) => React.ReactNode);\n /** Animation direction: 'bottom' slides up (default), 'right' slides from right */\n variant?: 'bottom' | 'right';\n}) {\n const [mounted, setMounted] = useState(false);\n const [animating, setAnimating] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setAnimating(true)));\n } else if (mounted) {\n setAnimating(false);\n const t = setTimeout(() => setMounted(false), 250);\n return () => clearTimeout(t);\n }\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setAnimating(false);\n setTimeout(() => onClose(), 250);\n }, [onClose]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [isOpen, handleClose]);\n\n if (!mounted) return null;\n\n const closedTransform = variant === 'right' ? 'translateX(100%)' : 'translateY(24px)';\n const openTransform = 'translate(0)';\n\n return (\n <div\n className=\"absolute inset-0 z-20 transition-opacity duration-250\"\n style={{ opacity: animating ? 1 : 0, backdropFilter: 'blur(4px)', WebkitBackdropFilter: 'blur(4px)' }}\n >\n <div\n className=\"absolute inset-0 flex flex-col transition-transform duration-250 ease-out\"\n style={{ background: 'var(--t-modal-bg)', borderRadius: 'var(--t-container-radius)', transform: animating ? openTransform : closedTransform }}\n >\n {typeof children === 'function' ? children(handleClose) : children}\n </div>\n </div>\n );\n}\n","export function Skeleton({\n w,\n h,\n className = '',\n}: {\n w: number | string;\n h: number | string;\n className?: string;\n}) {\n return <div className={`skeleton ${className}`} style={{ width: w, height: h }} />;\n}\n\nimport { useT } from '../../i18n';\n\nexport function FormSkeleton() {\n const t = useT();\n return (\n <div className=\"flex-1 px-5 flex flex-col\">\n <div className=\"px-[18px] pt-[14px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5 }}>\n <Skeleton w={70} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={120} h={32} />\n <Skeleton w={75} h={32} />\n </div>\n </div>\n <div className=\"px-[18px] pt-[12px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5, marginTop: 4 }}>\n <Skeleton w={50} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={180} h={32} />\n <Skeleton w={85} h={32} />\n </div>\n </div>\n <div className=\"flex justify-between mt-3 px-[2px]\">\n <Skeleton w={140} h={12} />\n <Skeleton w={90} h={12} />\n </div>\n <div className=\"mt-8\">\n <Skeleton w={65} h={14} className=\"mb-2.5\" />\n <Skeleton w=\"100%\" h={47} />\n </div>\n <div className=\"flex-1\" />\n <Skeleton w=\"100%\" h={60} className=\"mb-2\" />\n <div className=\"text-center py-3\">\n <span className=\"text-[11px]\" style={{ color: 'var(--t-text-tertiary)' }}>{t('skeleton.poweredBy')}</span>\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { useState, useCallback, useRef } from 'react';\nimport { getCryptoIconUrl, getFiatFlagUrl } from '../../data/cryptoData';\n\n/* ───────────── icon helpers ───────────── */\n\n/** Lazy-loaded image with placeholder and fallback */\nfunction LazyIcon({\n src,\n alt,\n size,\n className = '',\n background,\n}: {\n src: string;\n alt: string;\n size: number;\n className?: string;\n /** Background color for transparent icons */\n background?: string;\n}) {\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState(false);\n const currentSrc = useRef(src);\n\n // Reset state when src changes, using ref to avoid race with onLoad\n if (currentSrc.current !== src) {\n currentSrc.current = src;\n setLoaded(false);\n setError(false);\n }\n\n const handleLoad = useCallback(() => setLoaded(true), []);\n const handleError = useCallback(() => setError(true), []);\n\n return (\n <div\n className={`relative rounded-full shrink-0 ${className}`}\n style={{ width: size, height: size, background }}\n >\n {/* Placeholder while loading */}\n {!loaded && !error && (\n <div\n className=\"absolute inset-0 rounded-full animate-pulse\"\n style={{ background: 'var(--t-pill-bg, #333)' }}\n />\n )}\n {/* Fallback for broken images */}\n {error ? (\n <div\n className=\"absolute inset-0 rounded-full flex items-center justify-center font-bold\"\n style={{\n background: 'var(--t-pill-bg, #333)',\n color: 'var(--t-text-muted)',\n fontSize: Math.max(8, size * 0.35),\n }}\n >\n {alt.slice(0, 3)}\n </div>\n ) : (\n <img\n src={src}\n alt={alt}\n width={size}\n height={size}\n onLoad={handleLoad}\n onError={handleError}\n className={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n style={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n />\n )}\n </div>\n );\n}\n\nexport function CryptoIcon({ ticker, size = 32, baseUrl = '' }: { ticker: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getCryptoIconUrl(ticker, baseUrl)}\n alt={ticker}\n size={size}\n background=\"#ffffff\"\n />\n );\n}\n\nexport function FiatFlag({ currencyCode, size = 16, baseUrl = '' }: { currencyCode: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getFiatFlagUrl(currencyCode, baseUrl)}\n alt={currencyCode}\n size={size}\n />\n );\n}\n\nexport function GenericCoinIcon({ size = 32, color = '#888' }: { size?: number; color?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\">\n <circle cx=\"16\" cy=\"16\" r=\"16\" fill={color} />\n <circle cx=\"16\" cy=\"16\" r=\"8\" stroke=\"white\" strokeWidth=\"1.5\" fill=\"none\" />\n </svg>\n );\n}\n\nexport function BankIcon({ size = 24 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-card-icon-bg)' }}\n >\n <svg width={size * 0.6} height={size * 0.58} viewBox=\"0 0 25 24\" fill=\"none\">\n <path d=\"M23.292 7.5H1.70801L12.5 0.592773L23.292 7.5Z\" stroke=\"var(--t-card-icon-stroke)\" strokeWidth=\"1\" />\n <rect x=\"3\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"9\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"15\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"21\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect y=\"23\" width=\"25\" height=\"1\" fill=\"var(--t-card-icon-stroke)\" />\n </svg>\n </div>\n );\n}\n\nexport function RevolutIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center text-white font-semibold shrink-0\"\n style={{ width: size, height: size, backgroundColor: '#333', fontSize: size * 0.45 }}\n >\n R\n </div>\n );\n}\n\nexport function ApplePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#000', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.288} viewBox=\"0 0 50 20\" fill=\"none\">\n <path\n d=\"M9.14529 2.57901C8.55528 3.25398 7.61984 3.7887 6.68351 3.70976C6.56186 2.7971 7.02999 1.82591 7.55883 1.23105C8.14846 0.535892 9.166 0.0403839 9.9999 0C10.1017 0.952461 9.71518 1.88488 9.14529 2.57901ZM9.98932 3.88805C10.5171 3.92756 12.0384 4.08587 13.0125 5.48951C12.9312 5.54899 11.2066 6.51813 11.2267 8.55562C11.247 10.9883 13.4176 11.7995 13.4379 11.8193C13.4176 11.8787 13.0939 12.9667 12.3023 14.0939C11.6126 15.083 10.902 16.052 9.76606 16.0717C8.67023 16.0915 8.30483 15.4389 7.04742 15.4389C5.78949 15.4389 5.38394 16.052 4.34875 16.0915C3.25329 16.1307 2.42185 15.0429 1.73195 14.054C0.310872 12.0564 -0.764097 8.41705 0.696758 5.96431C1.40722 4.73809 2.70553 3.96677 4.10507 3.94695C5.18064 3.92756 6.17501 4.63962 6.82446 4.63962C7.47376 4.63962 8.62918 3.80889 9.98932 3.88805ZM23.544 1.13133C26.4989 1.13133 28.5569 3.11593 28.5569 6.00514C28.5569 8.90473 26.4567 10.8997 23.4702 10.8997H20.1987V15.9694H17.8349V1.13133H23.544ZM20.1987 8.96648H22.9108C24.9692 8.96648 26.1402 7.88694 26.1402 6.01552C26.1402 4.14448 24.9688 3.07467 22.9212 3.07467H20.1987V8.96648ZM29.1434 12.8945C29.1434 10.9923 30.6314 9.90226 33.375 9.7378L36.3194 9.56295V8.74027C36.3194 7.53753 35.5071 6.87939 34.0613 6.87939C32.8683 6.87939 32.0028 7.47564 31.8242 8.39042H29.6919C29.7556 6.46802 31.6126 5.06972 34.1246 5.06972C36.8262 5.06972 38.5886 6.44746 38.5886 8.58634V15.969H36.4042V14.1901H36.3515C35.7287 15.3518 34.3565 16.0817 32.8683 16.0817C30.6734 16.0817 29.1434 14.8072 29.1434 12.8945ZM36.3195 11.9385V11.1054L33.6918 11.27C32.2138 11.3624 31.4442 11.897 31.4442 12.8325C31.4442 13.7375 32.2459 14.3238 33.5018 14.3238C35.1055 14.3238 36.3195 13.3262 36.3195 11.9385ZM40.597 19.9377V18.1592C40.7449 18.1794 41.1032 18.1999 41.2935 18.1999C42.3381 18.1999 42.9291 17.7688 43.288 16.6575L43.4992 15.9997L39.4992 5.20338H41.9686L44.7548 13.9638H44.8077L47.5936 5.20338H50L45.8524 16.5445C44.9024 19.1463 43.8155 20 41.515 20C41.3354 20 40.7549 19.9793 40.597 19.9377Z\"\n fill=\"white\"\n />\n </svg>\n </div>\n );\n}\n\nexport function GooglePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#3C4043', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.296} viewBox=\"0 0 51 21\" fill=\"none\">\n <path d=\"M50.9156 5.87122L44.6406 20.2837H42.6992L45.0289 15.2416L40.9009 5.87122H42.9451L45.929 13.0573H45.9689L48.8714 5.87122H50.9156Z\" fill=\"white\" />\n <path d=\"M39.3906 6.65832C38.5866 5.91563 37.4895 5.54547 36.0995 5.54547C34.314 5.54547 32.9657 6.19816 32.0513 7.50532L33.7084 8.54664C34.3211 7.66089 35.1512 7.21951 36.2011 7.21951C36.8967 7.21951 37.5008 7.44661 38.0194 7.9023C38.538 8.35948 38.7964 8.91352 38.7964 9.5665V9.99507C38.0751 9.58796 37.1536 9.38381 36.0366 9.38381C34.7297 9.38381 33.6839 9.68959 32.8998 10.3023C32.1172 10.9151 31.7256 11.738 31.7256 12.7706C31.7256 13.8033 32.0969 14.5675 32.8396 15.2216C33.5808 15.8758 34.5065 16.2016 35.6092 16.2016C36.9033 16.2016 37.9389 15.6302 38.7147 14.4876H38.7976V15.8761H40.5944V9.70955C40.5944 8.4167 40.1944 7.39982 39.3903 6.65862L39.3906 6.65832ZM37.8665 13.6501C37.2451 14.2343 36.5424 14.5272 35.7511 14.5272C35.1926 14.5272 34.7068 14.3645 34.2913 14.0387C33.8741 13.7103 33.6673 13.3032 33.6673 12.8132C33.6673 12.2675 33.923 11.8134 34.4344 11.4462C34.9443 11.079 35.5815 10.8948 36.3442 10.8948C37.3926 10.8948 38.211 11.1249 38.7967 11.5889C38.7967 12.3775 38.4867 13.0645 37.8668 13.6501H37.8665Z\" fill=\"white\" />\n <path d=\"M30.4166 2.52282C29.5296 1.67999 28.4552 1.25739 27.1883 1.25739H22.2017V15.8758H24.0813V9.95362H27.188C28.4678 9.95362 29.5448 9.53936 30.4163 8.70815C31.3175 7.87962 31.7661 6.84397 31.7661 5.60565C31.7661 4.36733 31.3175 3.36744 30.4163 2.52312L30.4166 2.52282ZM29.0895 7.40248C28.598 7.90525 27.9781 8.15798 27.2297 8.15798H24.0816V3.05272H27.2297C27.9781 3.05272 28.5983 3.31141 29.0895 3.82849C29.5937 4.33276 29.845 4.92554 29.845 5.60535C29.845 6.28516 29.5934 6.8994 29.0895 7.40218V7.40248Z\" fill=\"white\" />\n <path d=\"M16.2663 11.4026C15.8887 12.6964 15.1901 13.9058 14.2131 14.8354C14.1815 14.8655 14.1496 14.895 14.1178 14.9245C14.116 14.9263 14.1148 14.9277 14.113 14.9292C13.1524 15.8144 11.9487 16.4295 10.6737 16.7272C10.6621 16.7302 10.6502 16.7329 10.6385 16.7356C10.2484 16.8241 9.85204 16.8888 9.45357 16.929C8.81668 16.9928 8.17293 16.9928 7.53723 16.9222C7.22102 16.8873 6.9063 16.8348 6.59546 16.7639C6.49293 16.7407 6.39101 16.7156 6.28938 16.6882C5.16759 16.3884 4.11256 15.8564 3.20476 15.1337C3.0018 14.971 2.80599 14.7987 2.61823 14.6184C2.61257 14.613 2.60721 14.6077 2.60154 14.6026C1.93962 13.9657 1.38081 13.22 0.956413 12.4034C0.938829 12.3691 0.921246 12.3352 0.90396 12.3009C0.717393 11.9319 0.559138 11.5493 0.429793 11.1574C0.364822 10.9618 0.307302 10.7634 0.257233 10.5631C0.226834 10.443 0.199117 10.3226 0.174678 10.2013C0.141299 10.0397 0.112986 9.87702 0.0894411 9.714C-0.0509314 8.75165 -0.0267907 7.76517 0.166929 6.81118C0.176168 6.76468 0.185705 6.71879 0.195838 6.6723C0.345748 5.97997 0.582981 5.31 0.903662 4.67698C1.53102 3.42525 2.48025 2.33983 3.62498 1.53514H3.62528C3.73704 1.45616 3.85029 1.38076 3.96533 1.30775C3.99424 1.28957 4.02345 1.27169 4.05206 1.25351C4.11018 1.21774 4.16889 1.18257 4.2276 1.148C4.34562 1.07945 4.46513 1.01329 4.58643 0.950111C4.64723 0.918519 4.70773 0.887822 4.76912 0.858018C5.0755 0.707811 5.39111 0.576975 5.71418 0.466108C5.77021 0.446438 5.82624 0.427961 5.88227 0.409781C5.96661 0.38266 6.05095 0.356731 6.13619 0.332292C6.19312 0.315603 6.25064 0.300106 6.30786 0.284906C6.36448 0.269707 6.4217 0.255401 6.47863 0.241393C6.51111 0.233346 6.5433 0.225895 6.57579 0.218146C6.62764 0.206225 6.6792 0.194901 6.73136 0.183874C6.73464 0.183278 6.73762 0.182681 6.7406 0.181787C6.90481 0.147216 7.06992 0.117711 7.23593 0.093273C7.25262 0.0905907 7.2693 0.088205 7.28629 0.0861187C8.67482 -0.111774 10.114 0.0309834 11.4319 0.518561C12.4443 0.889311 13.3712 1.47882 14.1651 2.21048C13.899 2.4957 13.6138 2.76661 13.3378 3.04705C12.8151 3.56533 12.2971 4.08807 11.774 4.60605C11.7734 4.60545 11.7723 4.60486 11.7717 4.60367L11.7645 4.61082C11.2465 4.11639 10.6192 3.74564 9.9346 3.53642C9.1314 3.29412 8.26652 3.26044 7.44425 3.43658C7.14741 3.49946 6.85772 3.59066 6.57847 3.70779C6.57519 3.70898 6.57221 3.71047 6.56893 3.71166C5.95231 3.97393 5.38843 4.36047 4.92022 4.83881C4.3638 5.39941 3.94089 6.09352 3.68906 6.83979C3.68727 6.8386 3.68548 6.83711 3.68369 6.83591C3.31831 7.89571 3.32308 9.07889 3.68399 10.1384C3.68191 10.1402 3.67982 10.1417 3.67773 10.1435C3.67833 10.1446 3.67863 10.1458 3.67893 10.147C3.68071 10.1461 3.6822 10.1446 3.68399 10.1435C4.03567 11.1892 4.72501 12.1158 5.62835 12.7482C6.19371 13.1473 6.84014 13.428 7.51995 13.5654C8.18545 13.6987 8.87927 13.6844 9.54477 13.5705C10.2103 13.4564 10.8519 13.209 11.4128 12.8338C11.4128 12.8338 11.413 12.834 11.4134 12.8344C11.4164 12.8326 11.4194 12.8308 11.4221 12.8287C12.3081 12.2294 12.9301 11.2691 13.1095 10.2147H8.48467V6.90178H8.48944V6.89701H16.4797C16.7458 8.38955 16.6889 9.94378 16.2657 11.4029L16.2663 11.4026Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PayPalIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#003087' }}\n >\n <span className=\"text-white font-bold\" style={{ fontSize: size * 0.38 }}>P</span>\n </div>\n );\n}\n\nexport function VisaIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#1A1F71', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.234} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function MastercardIcon({ size = 32 }: { size?: number }) {\n const s = size * 0.8;\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <svg width={s} height={s * 0.625} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n );\n}\n\nexport function CardIcon({ size = 32 }: { size?: number }) {\n const markW = size * 0.56;\n const markH = markW * 0.65;\n const r = Math.max(2, markW * 0.1);\n const overlap = markW * 0.2;\n return (\n <div className=\"flex items-center justify-center shrink-0\" style={{ width: size, height: size }}>\n {/* Visa mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#1A1F71',\n borderRadius: r,\n position: 'relative',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width={markW * 0.7} height={markH * 0.35} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n {/* Mastercard mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#252525',\n borderRadius: r,\n marginLeft: -overlap,\n position: 'relative',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <svg width={markH * 0.85} height={markH * 0.6} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n </div>\n );\n}\n\nexport function CoinifyIcon({ size = 18 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full bg-white flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <span className=\"text-black font-bold\" style={{ fontSize: size * 0.55 }}>C</span>\n </div>\n );\n}\n\nexport function ChevronDown() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function ChevronRight() {\n return (\n <svg width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\">\n <path d=\"M1 1L7 7L1 13\" stroke=\"var(--t-icon-stroke)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function MenuIcon({ onClick }: { onClick: () => void }) {\n return (\n <button onClick={onClick} className=\"hover:opacity-70 transition-opacity\">\n <svg width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path\n d=\"M22.4004 12V4C22.4004 2.67452 21.3255 1.59961 20 1.59961H6.7998V14.4004H20V16H4V14.4004H5.2002V1.59961H4C2.67452 1.59961 1.59961 2.67452 1.59961 4V12C1.59961 13.3255 2.67452 14.4004 4 14.4004V16L3.79395 15.9951C1.68056 15.8879 0 14.14 0 12V4C0 1.79086 1.79086 6.44266e-08 4 0H20C22.2091 0 24 1.79086 24 4V12L23.9951 12.2061C23.8913 14.2512 22.2512 15.8913 20.2061 15.9951L20 16V14.4004C21.3255 14.4004 22.4004 13.3255 22.4004 12Z\"\n fill=\"var(--t-icon-stroke)\"\n />\n </svg>\n </button>\n );\n}\n\nexport function DarkModeIcon({ size = 40 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-surface)' }}\n >\n <svg width={size * 0.5} height={size * 0.5} viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" stroke=\"var(--t-text)\" strokeWidth=\"1.5\" />\n <path d=\"M10 2.5A7.5 7.5 0 0 1 10 17.5\" fill=\"var(--t-text)\" />\n </svg>\n </div>\n );\n}\n\n/* ───────────── V2 circular payment icons ───────────── */\n\nexport function PaymentBankIcon({ size = 20 }: { size?: number }) {\n const iconSize = size * 0.6;\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={iconSize} height={iconSize} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M11 3.5H1L6 0.5L11 3.5Z\" stroke=\"white\" strokeWidth=\"0.8\" />\n <rect x=\"1.5\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"4.2\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"6.9\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"9.6\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"0.5\" y=\"10.5\" width=\"11\" height=\"0.5\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PaymentCardsIcon({ size = 20 }: { size?: number }) {\n const iconSize = size * 0.6;\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={iconSize} height={iconSize * 0.75} viewBox=\"0 0 12 9\" fill=\"none\">\n <rect x=\"0.5\" y=\"0.5\" width=\"11\" height=\"8\" rx=\"1.5\" stroke=\"white\" strokeWidth=\"0.8\" fill=\"none\" />\n <rect x=\"0.5\" y=\"2.5\" width=\"11\" height=\"1.5\" fill=\"white\" />\n <rect x=\"2\" y=\"5.5\" width=\"3\" height=\"1\" rx=\"0.5\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PaymentAppleIcon({ size = 20 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={10} height={12} viewBox=\"0 0 10 12\" fill=\"none\">\n <path d=\"M8.32 6.32C8.31 5.1 9.32 4.5 9.37 4.47C8.77 3.59 7.83 3.47 7.5 3.46C6.73 3.38 5.99 3.93 5.6 3.93C5.2 3.93 4.59 3.47 3.94 3.48C3.1 3.5 2.32 3.99 1.89 4.74C1.01 6.27 1.66 8.52 2.5 9.76C2.93 10.37 3.43 11.05 4.08 11.03C4.71 11 4.95 10.63 5.71 10.63C6.46 10.63 6.69 11.03 7.34 11.02C8.02 11 8.45 10.4 8.87 9.79C9.36 9.09 9.56 8.41 9.57 8.37C9.55 8.37 8.33 7.88 8.32 6.32Z\" fill=\"white\" />\n <path d=\"M7.13 2.57C7.49 2.12 7.74 1.5 7.67 0.88C7.15 0.91 6.51 1.24 6.13 1.68C5.79 2.08 5.5 2.72 5.58 3.32C6.16 3.37 6.76 3.02 7.13 2.57Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PaymentGoogleIcon({ size = 20 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={10} height={10} viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M9.68 5.11C9.68 4.76 9.65 4.42 9.6 4.09H5V6.02H7.62C7.52 6.58 7.2 7.05 6.73 7.37V8.5H8.26C9.14 7.69 9.68 6.51 9.68 5.11Z\" fill=\"white\" />\n <path d=\"M5 9.58C6.28 9.58 7.35 9.14 8.26 8.5L6.73 7.37C6.33 7.64 5.81 7.79 5 7.79C3.78 7.79 2.73 6.97 2.38 5.87H0.8V7.04C1.71 8.84 3.22 9.58 5 9.58Z\" fill=\"white\" />\n <path d=\"M2.38 5.87C2.28 5.57 2.22 5.25 2.22 4.93C2.22 4.6 2.28 4.28 2.38 3.98V2.82H0.8C0.46 3.49 0.27 4.24 0.27 5.03C0.27 5.73 0.44 6.4 0.73 7L2.38 5.87Z\" fill=\"white\" />\n <path d=\"M5 2.07C5.74 2.07 6.39 2.32 6.91 2.82L8.29 1.45C7.35 0.57 6.28 0.07 5 0.07C3.22 0.07 1.71 1.14 0.8 2.82L2.38 3.98C2.73 2.88 3.78 2.07 5 2.07Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\n/* ───────────── Additional V2 icons ───────────── */\n\nexport function NRLogoIcon({ size = 24 }: { size?: number }) {\n const w = size * (46 / 40);\n return (\n <svg width={w} height={size} viewBox=\"0 0 48 32\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\">\n <path d=\"M0 0H5.76C11.0619 0 15.36 4.47715 15.36 10V32H0V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M16.32 0H22.08C27.3819 0 31.68 4.47715 31.68 10V32H16.32V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M32.64 8C32.64 3.58172 36.0785 0 40.32 0C44.5615 0 48 3.58172 48 8C48 12.4183 44.5615 16 40.32 16C36.0785 16 32.64 12.4183 32.64 8Z\" fill=\"var(--t-text)\" />\n </svg>\n );\n}\n\nexport function InfoIcon({ size = 12 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center rounded-full shrink-0\"\n style={{\n width: size,\n height: size,\n background: 'var(--t-text-secondary)',\n }}\n >\n <span\n style={{\n fontSize: size * 0.75,\n fontWeight: 500,\n lineHeight: 1,\n letterSpacing: '0.18px',\n color: 'var(--t-bg)',\n }}\n >\n i\n </span>\n </div>\n );\n}\n\nexport function MoreDotsIcon({ onClick }: { onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n className=\"flex items-center justify-center rounded-full transition-opacity hover:opacity-70\"\n style={{ width: 40, height: 40 }}\n >\n <svg width=\"20\" height=\"4\" viewBox=\"0 0 20 4\" fill=\"none\">\n <circle cx=\"2\" cy=\"2\" r=\"2\" fill=\"var(--t-text)\" />\n <circle cx=\"10\" cy=\"2\" r=\"2\" fill=\"var(--t-text)\" />\n <circle cx=\"18\" cy=\"2\" r=\"2\" fill=\"var(--t-text)\" />\n </svg>\n </button>\n );\n}\n\nexport function SearchIcon({ size = 16 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"5.25\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" />\n <path d=\"M11 11l3.5 3.5\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function ArrowUpIcon({ size = 12 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 10V2M6 2L2.5 5.5M6 2l3.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function CheckmarkIcon({ size = 14 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M11.5 3.5L5.5 10.5L2.5 7.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function XIcon({ size = 12 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 2l8 8M10 2l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function getPaymentIcon(type: string, size?: number, theme?: 'dark' | 'light'): React.ReactNode;\nexport function getPaymentIcon(type: string, size = 32, _theme?: 'dark' | 'light'): React.ReactNode {\n switch (type) {\n case 'bank': return <PaymentBankIcon size={size} />;\n case 'card': return <PaymentCardsIcon size={size} />;\n case 'applepay': return <PaymentAppleIcon size={size} />;\n case 'googlepay': return <PaymentGoogleIcon size={size} />;\n case 'revolut': return <RevolutIcon size={size} />;\n case 'paypal': return <PayPalIcon size={size} />;\n case 'visa': return <VisaIcon size={size} />;\n case 'mastercard': return <MastercardIcon size={size} />;\n default: return <GenericCoinIcon size={size} />;\n }\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { CheckmarkIcon, XIcon } from './icons';\n\nexport interface ToastProps {\n type: 'success' | 'error';\n title: string;\n description?: string;\n visible: boolean;\n onDismiss: () => void;\n}\n\nexport function Toast({ type, title, description, visible, onDismiss }: ToastProps) {\n const [mounted, setMounted] = useState(false);\n const [exiting, setExiting] = useState(false);\n\n const startExit = useCallback(() => {\n setExiting(true);\n setTimeout(() => {\n setMounted(false);\n setExiting(false);\n onDismiss();\n }, 200);\n }, [onDismiss]);\n\n useEffect(() => {\n if (visible) {\n setMounted(true);\n setExiting(false);\n }\n }, [visible]);\n\n useEffect(() => {\n if (!visible || !mounted) return;\n const t = setTimeout(startExit, 5000);\n return () => clearTimeout(t);\n }, [visible, mounted, startExit]);\n\n if (!mounted) return null;\n\n const bg = type === 'success' ? 'var(--t-toast-success-bg)' : 'var(--t-toast-error-bg)';\n\n return (\n <div\n className=\"absolute top-0 left-0 right-0 z-[25] px-3 pt-3\"\n style={{ animation: exiting ? 'slideUpToastOut 0.2s ease-in forwards' : 'slideDownToast 0.3s ease-out both' }}\n >\n <div\n className=\"flex items-start gap-2.5 rounded-2xl px-4 py-3\"\n style={{ background: bg, color: '#ffffff' }}\n >\n <span className=\"mt-0.5 shrink-0\">\n {type === 'success' ? <CheckmarkIcon size={14} /> : <XIcon size={12} />}\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[13px] font-medium leading-tight\">{title}</div>\n {description && (\n <div className=\"text-[12px] leading-snug mt-0.5 opacity-90\">{description}</div>\n )}\n </div>\n <button\n onClick={startExit}\n className=\"shrink-0 opacity-80 hover:opacity-100 transition-opacity mt-0.5\"\n >\n <XIcon size={10} />\n </button>\n </div>\n </div>\n );\n}\n","export function NRLogo({ width = 46 }: { width?: number }) {\n const h = width * (40 / 46);\n return (\n <svg width={width} height={h} viewBox=\"0 0 48 32\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\">\n <path d=\"M0 0H5.76C11.0619 0 15.36 4.47715 15.36 10V32H0V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M16.32 0H22.08C27.3819 0 31.68 4.47715 31.68 10V32H16.32V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M32.64 8C32.64 3.58172 36.0785 0 40.32 0C44.5615 0 48 3.58172 48 8C48 12.4183 44.5615 16 40.32 16C36.0785 16 32.64 12.4183 32.64 8Z\" fill=\"var(--t-text)\" />\n </svg>\n );\n}\n","import { NRLogo } from '../ui/NRLogo';\n\nexport function LoadingScreen() {\n return (\n <div\n className=\"flex-1 flex items-center justify-center\"\n style={{ animation: 'fadeInScale 0.5s ease-out both' }}\n >\n <NRLogo width={90} />\n </div>\n );\n}\n","import type React from 'react';\n\nexport interface BottomSheetProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nexport function BottomSheet({ isOpen, onClose, children }: BottomSheetProps) {\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 z-[30] transition-opacity duration-300\"\n style={{\n background: 'rgba(0,0,0,0.4)',\n opacity: isOpen ? 1 : 0,\n pointerEvents: isOpen ? 'auto' : 'none',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n onClick={onClose}\n />\n {/* Panel */}\n <div\n className=\"absolute bottom-0 left-0 right-0 z-[31] transition-transform duration-300 ease-out sheet-inverted\"\n style={{\n transform: isOpen ? 'translateY(0)' : 'translateY(100%)',\n borderRadius: 20,\n background: 'var(--t-bg)',\n maxHeight: '70%',\n overflow: 'visible',\n marginBottom: 12,\n marginLeft: 12,\n marginRight: 12,\n }}\n >\n {children}\n </div>\n </>\n );\n}\n","export function CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n className=\"flex items-center justify-center shrink-0 opacity-60 hover:opacity-100 transition-opacity\"\n style={{ width: 40, height: 40 }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3 3L11 11M11 3L3 11\" stroke=\"var(--t-text)\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n );\n}\n","export function SearchInput({\n value,\n onChange,\n placeholder = '',\n inline = false,\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n /** When true, removes outer margin so it sits flush inside a parent container */\n inline?: boolean;\n}) {\n return (\n <div\n className={`flex items-center ${inline ? '' : 'mx-5 mb-5'}`}\n style={{\n height: 48,\n borderRadius: 100,\n backgroundColor: 'var(--t-surface)',\n paddingLeft: 16,\n paddingRight: 12,\n gap: 10,\n }}\n >\n {/* Search icon */}\n <div className=\"shrink-0 flex items-center justify-center\" style={{ color: 'var(--t-text-secondary)' }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"6.25\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"M13.5 13.5l4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </div>\n <input\n type=\"text\"\n value={value}\n onChange={e => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"flex-1 min-w-0 focus-visible:outline-none\"\n style={{\n height: '100%',\n border: 'none',\n outline: 'none',\n boxShadow: 'none',\n color: 'var(--t-text)',\n fontSize: 14,\n backgroundColor: 'transparent',\n }}\n />\n {value && (\n <button\n onClick={() => onChange('')}\n className=\"shrink-0 flex items-center justify-center\"\n style={{ width: 20, height: 20 }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 2l8 8M10 2l-8 8\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","/**\n * Fiat Currency Selector Modal\n * Searchable list of fiat currencies with flag icons.\n * Uses API currencies if provided, falls back to static FIAT_CURRENCIES data.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { FiatFlag } from '../ui/icons';\nimport { FIAT_CURRENCIES, type FiatCurrency } from '../../data/cryptoData';\nimport { useT } from '../../i18n';\n\nconst POPULAR_FIATS = ['USD', 'EUR', 'GBP'];\n\nexport interface FiatCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string) => void;\n\t/** Currencies from API config — takes precedence over static fallback */\n\tcurrencies?: Array<{ code: string; name?: string }>;\n\t/** Base URL for static assets (fiat flags) */\n\tassetBaseUrl?: string;\n\t/** Currently selected currency code */\n\tselectedCode?: string;\n}\n\nexport function FiatCurrencyModal({\n\tonClose,\n\tonSelect,\n\tcurrencies,\n\tassetBaseUrl = '',\n\tselectedCode,\n}: FiatCurrencyModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\t// Merge API data with static fallback for display names\n\tconst currencyList = useMemo<FiatCurrency[]>(() => {\n\t\tif (!currencies || currencies.length === 0) return FIAT_CURRENCIES;\n\n\t\t// Build a lookup from static data for display names\n\t\tconst staticMap = new Map(FIAT_CURRENCIES.map((c) => [c.code, c.name]));\n\n\t\treturn currencies.map((c) => ({\n\t\t\tcode: c.code,\n\t\t\tname: c.name || staticMap.get(c.code) || c.code,\n\t\t}));\n\t}, [currencies]);\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode) {\n\t\t\t\tconst selected = currencyList.find((c) => c.code === selectedCode);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = currencyList.filter((c) => c.code !== selectedCode);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn currencyList;\n\t\t}\n\n\t\treturn currencyList.filter(\n\t\t\t(c) => c.code.toLowerCase().includes(raw) || c.name.toLowerCase().includes(raw)\n\t\t);\n\t}, [currencyList, search, selectedCode]);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Modal header — 128px with blurred bg */}\n\t\t\t<div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n\t\t\t\t<div className=\"absolute\" style={{ left: 12, top: 20 }}>\n\t\t\t\t\t<NRLogo width={46} />\n\t\t\t\t</div>\n\t\t\t\t<p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n\t\t\t\t\t{t('modal.selectFiat')}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"absolute\" style={{ right: 12, top: 20 }}>\n\t\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n\t\t\t\t\t<SearchInput value={search} onChange={setSearch} inline />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n\t\t\t\t{filtered.map((c, i) => {\n\t\t\t\t\tconst isSelected = selectedCode === c.code;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={c.code}\n\t\t\t\t\t\t\tonClick={() => onSelect(c.code)}\n\t\t\t\t\t\t\tclassName=\"flex items-center w-full card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\tstyle={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FiatFlag currencyCode={c.code} size={32} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t<div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n\t\t\t\t\t\t\t\t<span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n\t\t\t\t\t\t\t\t\t{c.code}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{POPULAR_FIATS.includes(c.code) && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ border: '1.5px solid var(--t-card-border)', borderRadius: 100, paddingLeft: 8, paddingRight: 8, color: 'var(--t-text-secondary)', lineHeight: '20px', letterSpacing: '0.22px' }}>\n\t\t\t\t\t\t\t\t\t\t{t('modal.popular')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{t('modal.noCurrencies')}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Crypto Currency + Chain Selector Modal\n * Searchable list of crypto+chain combinations with compound icons (crypto icon + chain badge).\n * Smart search ranking: exact code > starts with > popular > other.\n * Uses API data if provided, falls back to static CRYPTO_CHAIN_COMBOS.\n */\n\nimport { useState, useMemo, useCallback, useRef } from 'react';\nimport { useT } from '../../i18n';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport {\n\tCRYPTO_CHAIN_COMBOS,\n\tgetCryptoIconUrl,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\tCRYPTO_NAMES,\n\ttype CryptoChainCombo,\n} from '../../data/cryptoData';\n\nconst POPULAR_CRYPTOS = ['BTC', 'ETH', 'SOL'];\n\n/** Image component with loading state and error fallback */\nfunction CryptoImage({ src, alt, size, className, style }: {\n\tsrc: string;\n\talt: string;\n\tsize: number;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}) {\n\tconst [loaded, setLoaded] = useState(false);\n\tconst [error, setError] = useState(false);\n\tconst currentSrc = useRef(src);\n\n\t// Reset state when src changes, using ref to avoid race with onLoad\n\tif (currentSrc.current !== src) {\n\t\tcurrentSrc.current = src;\n\t\tsetLoaded(false);\n\t\tsetError(false);\n\t}\n\n\tconst handleLoad = useCallback(() => setLoaded(true), []);\n\tconst handleError = useCallback(() => setError(true), []);\n\n\treturn (\n\t\t<div className={className} style={{ ...style, width: size, height: size, position: 'relative' }}>\n\t\t\t{/* Placeholder shown while loading */}\n\t\t\t{!loaded && !error && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full animate-pulse\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{/* Fallback for broken images */}\n\t\t\t{error ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full flex items-center justify-center text-[10px] font-bold\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)', color: 'var(--t-text-muted)' }}\n\t\t\t\t>\n\t\t\t\t\t{alt.slice(0, 3)}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<img\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={alt}\n\t\t\t\t\twidth={size}\n\t\t\t\t\theight={size}\n\t\t\t\t\tonLoad={handleLoad}\n\t\t\t\t\tonError={handleError}\n\t\t\t\t\tclassName={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n\t\t\t\t\tstyle={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport interface CryptoCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string, chain: string) => void;\n\t/** Crypto data from API config — takes precedence over static fallback */\n\tcryptos?: Array<{\n\t\tcode: string;\n\t\tname?: string;\n\t\tnetworks?: Array<{ code: string; id?: string; name?: string }>;\n\t}>;\n\t/** Base URL for static assets (crypto icons) */\n\tassetBaseUrl?: string;\n\t/** Currently selected crypto code */\n\tselectedCode?: string;\n\t/** Currently selected chain/network */\n\tselectedChain?: string;\n}\n\nexport function CryptoCurrencyModal({ onClose, onSelect, cryptos, assetBaseUrl = '', selectedCode, selectedChain }: CryptoCurrencyModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\t// Build flat combo list from API data or fall back to static data\n\tconst comboList = useMemo<CryptoChainCombo[]>(() => {\n\t\tif (!cryptos || cryptos.length === 0) return CRYPTO_CHAIN_COMBOS;\n\n\t\tconst list: CryptoChainCombo[] = [];\n\t\tfor (const c of cryptos) {\n\t\t\tconst networks = c.networks || [];\n\t\t\t// Get name from API, fallback to CRYPTO_NAMES lookup, then code\n\t\t\tconst cryptoName = c.name || CRYPTO_NAMES[c.code] || c.code;\n\t\t\tif (networks.length === 0) {\n\t\t\t\t// No networks listed — add a single entry with the code as chain\n\t\t\t\tlist.push({ code: c.code, name: cryptoName, chain: c.code, popular: POPULAR_CRYPTOS.includes(c.code) });\n\t\t\t} else {\n\t\t\t\tfor (const net of networks) {\n\t\t\t\t\tconst chainCode = net.code || net.id || net.name || c.code;\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\tname: cryptoName,\n\t\t\t\t\t\tchain: chainCode,\n\t\t\t\t\t\tchainName: net.name,\n\t\t\t\t\t\tpopular: POPULAR_CRYPTOS.includes(c.code),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}, [cryptos]);\n\n\t// Check if an item is currently selected\n\tconst isSelected = useCallback((code: string, chain: string) => {\n\t\treturn selectedCode === code && selectedChain === chain;\n\t}, [selectedCode, selectedChain]);\n\n\t// Filtered and ranked results\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode && selectedChain) {\n\t\t\t\tconst selected = comboList.find(c => c.code === selectedCode && c.chain === selectedChain);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = comboList.filter(c => !(c.code === selectedCode && c.chain === selectedChain));\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn comboList;\n\t\t}\n\n\t\tconst terms = raw.split(/\\s+/);\n\t\tconst scored: Array<{ item: CryptoChainCombo; score: number }> = [];\n\n\t\tfor (const c of comboList) {\n\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\tconst chainName = chain ? chain.name.toLowerCase() : '';\n\t\t\tconst chainShort = chain?.shortName?.toLowerCase() || '';\n\t\t\tconst chainCode = c.chain.toLowerCase();\n\t\t\tconst code = c.code.toLowerCase();\n\t\t\tconst name = c.name.toLowerCase();\n\t\t\tconst fields = [code, name, chainName, chainShort, chainCode];\n\n\t\t\t// All search terms must match at least one field\n\t\t\tconst allMatch = terms.every((t) => fields.some((f) => f.includes(t)));\n\t\t\tif (!allMatch) continue;\n\n\t\t\t// Scoring: exact code match > starts with > chain match bonus > popular\n\t\t\tlet score = 0;\n\t\t\tif (code === raw) score += 100;\n\t\t\telse if (code.startsWith(terms[0])) score += 50;\n\t\t\tif (c.popular) score += 10;\n\t\t\tif (\n\t\t\t\tterms.length > 1 &&\n\t\t\t\t(chainName.includes(terms[1]) ||\n\t\t\t\t\tchainShort.includes(terms[1]) ||\n\t\t\t\t\tchainCode.includes(terms[1]))\n\t\t\t) {\n\t\t\t\tscore += 25;\n\t\t\t}\n\t\t\tscored.push({ item: c, score });\n\t\t}\n\n\t\tscored.sort((a, b) => b.score - a.score);\n\t\treturn scored.map((s) => s.item);\n\t}, [comboList, search, selectedCode, selectedChain]);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Modal header — 128px with blurred bg */}\n\t\t\t<div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n\t\t\t\t<div className=\"absolute\" style={{ left: 12, top: 20 }}>\n\t\t\t\t\t<NRLogo width={46} />\n\t\t\t\t</div>\n\t\t\t\t<p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n\t\t\t\t\t{t('modal.selectCrypto')}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"absolute\" style={{ right: 12, top: 20 }}>\n\t\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n\t\t\t\t\t<SearchInput value={search} onChange={setSearch} inline />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n\t\t\t\t{filtered.map((c, i) => {\n\t\t\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\t\t\tconst chainName = chain?.name || c.chainName || c.chain;\n\t\t\t\t\tconst itemSelected = isSelected(c.code, c.chain);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={`${c.code}-${c.chain}`}\n\t\t\t\t\t\t\tonClick={() => onSelect(c.code, c.chain)}\n\t\t\t\t\t\t\tclassName=\"flex items-center w-full card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\tstyle={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Compound icon: crypto icon + chain badge */}\n\t\t\t\t\t\t\t<div className=\"relative shrink-0\" style={{ width: 40, height: 40 }}>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-0\"\n\t\t\t\t\t\t\t\t\tstyle={{ background: '#ffffff', borderRadius: '50%' }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\tsrc={getCryptoIconUrl(c.code, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\talt={c.code}\n\t\t\t\t\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\t\tborder: '1.5px solid var(--t-chain-border, var(--t-surface, #1C1C22))',\n\t\t\t\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\t\t\t\tbackground: '#ffffff',\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(c.chain, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\talt={c.chain}\n\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n\t\t\t\t\t\t\t\t<span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n\t\t\t\t\t\t\t\t\t{c.code}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"text-[15px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t{chainName}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{c.popular && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ border: '1.5px solid var(--t-card-border)', borderRadius: 100, paddingLeft: 8, paddingRight: 8, color: 'var(--t-text-secondary)', lineHeight: '20px', letterSpacing: '0.22px' }}>\n\t\t\t\t\t\t\t\t\t\t{t('modal.popular')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{itemSelected && (\n\t\t\t\t\t\t\t\t\t<div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{t('modal.noCurrencies')}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * PaymentMethodSelector\n * Inline row that opens a modal to choose a payment method.\n * Styled to match the exchange rate row in the form.\n */\n\nimport { useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { getPaymentIcon, GenericCoinIcon, ChevronDown } from './ui/icons';\nimport { useT, type TranslationKey } from '../i18n';\n\n// Map Banxa payment-method IDs to icon keys used by getPaymentIcon\nconst ICON_KEY_MAP: Record<string, string> = {\n\t'debit-credit-card': 'card',\n\t'bank-transfer': 'bank',\n\t'ach-bank-transfer': 'bank',\n\t'payid-bank-transfer': 'bank',\n\t'sepa-bank-transfer': 'bank',\n\tsepa: 'bank',\n\t'apple-pay': 'applepay',\n\t'google-pay': 'googlepay',\n\tpaypal: 'paypal',\n\trevolut: 'revolut',\n};\n\n// Localizable short names (non-brand)\nconst LOCALIZABLE_SHORT_NAMES: Record<string, TranslationKey> = {\n\t'debit-credit-card': 'payment.name.card',\n\t'bank-transfer': 'payment.name.bankTransfer',\n\t'ach-bank-transfer': 'payment.name.ach',\n};\n\n// Brand names that stay in English\nconst BRAND_NAME_MAP: Record<string, string> = {\n\t'apple-pay': 'Apple Pay',\n\t'google-pay': 'Google Pay',\n\t'payid-bank-transfer': 'PayID',\n\tpaypal: 'PayPal',\n\trevolut: 'Revolut',\n};\n\n// Compact names for inline card display (where space is tight)\nconst SHORT_NAME_MAP: Record<string, string> = {\n\t'sepa-bank-transfer': 'SEPA',\n\tsepa: 'SEPA',\n\t'bank-transfer': 'Bank',\n\t'ach-bank-transfer': 'ACH',\n};\n\nexport function getMethodDisplayName(\n\tid: string,\n\tfullName: string,\n\tt?: (key: TranslationKey) => string,\n\tshort = false,\n): string {\n\tif (short) {\n\t\tconst compact = SHORT_NAME_MAP[id];\n\t\tif (compact) return compact;\n\t}\n\tconst brand = BRAND_NAME_MAP[id];\n\tif (brand) return brand;\n\tconst key = LOCALIZABLE_SHORT_NAMES[id];\n\tif (key && t) return t(key);\n\t// Fallback: English defaults for when t is not provided\n\tif (key) {\n\t\tconst fallbacks: Record<string, string> = {\n\t\t\t'debit-credit-card': 'Card',\n\t\t\t'bank-transfer': 'Bank Transfer',\n\t\t\t'ach-bank-transfer': 'ACH',\n\t\t};\n\t\treturn fallbacks[id] || fullName;\n\t}\n\treturn fullName;\n}\n\nexport function getMethodIcon(methodId: string, icon?: string, size = 24): React.ReactNode {\n\tconst iconKey = ICON_KEY_MAP[methodId];\n\tif (iconKey) return getPaymentIcon(iconKey, size);\n\tif (icon) return <img src={icon} alt=\"\" width={size} height={size} style={{ borderRadius: '50%' }} />;\n\treturn <GenericCoinIcon size={size} />;\n}\n\nexport interface PaymentMethodSelectorProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonOpenModal: () => void;\n\tfiatCurrency: string;\n}\n\nexport function PaymentMethodSelector({\n\tmethods,\n\tselectedId,\n\tonOpenModal,\n\tfiatCurrency,\n}: PaymentMethodSelectorProps) {\n\tconst t = useT();\n\tconst filtered = useMemo(\n\t\t() => methods.filter((m) => m.supportedFiats.includes(fiatCurrency)),\n\t\t[methods, fiatCurrency]\n\t);\n\n\tconst selected = filtered.find((m) => m.id === selectedId) || filtered[0];\n\n\tif (filtered.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center justify-between px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t{t('payment.unavailableFor', { currency: fiatCurrency })}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={0}\n\t\t\t\tonClick={onOpenModal}\n\t\t\t\tonKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n\t\t\t\tclassName=\"flex items-center justify-between w-full px-[18px] transition-colors\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\theight: 42,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t{t('payment.label')}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n\t\t\t\t\t\t{selected && getMethodIcon(selected.id, selected.icon, 20)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t{selected ? getMethodDisplayName(selected.id, selected.name, t) : t('payment.select')}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown />\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Payment Method Modal\n * Searchable list of payment methods with icons.\n * Follows the same pattern as FiatCurrencyModal / CryptoCurrencyModal.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { useT } from '../../i18n';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { getMethodIcon, getMethodDisplayName } from '../PaymentMethodSelector';\n\nexport interface PaymentMethodModalProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonSelect: (id: string) => void;\n\tonClose: () => void;\n}\n\nexport function PaymentMethodModal({\n\tmethods,\n\tselectedId,\n\tonSelect,\n\tonClose,\n}: PaymentMethodModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\t// The first method from the API is the recommended one (before reordering)\n\tconst recommendedId = methods.length > 0 ? methods[0].id : '';\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedId) {\n\t\t\t\tconst selected = methods.find((m) => m.id === selectedId);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = methods.filter((m) => m.id !== selectedId);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn methods;\n\t\t}\n\n\t\treturn methods.filter(\n\t\t\t(m) =>\n\t\t\t\tm.id.toLowerCase().includes(raw) ||\n\t\t\t\tm.name.toLowerCase().includes(raw) ||\n\t\t\t\t(m.description && m.description.toLowerCase().includes(raw))\n\t\t);\n\t}, [methods, search, selectedId]);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Modal header — 128px with blurred bg */}\n\t\t\t<div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n\t\t\t\t<div className=\"absolute\" style={{ left: 12, top: 20 }}>\n\t\t\t\t\t<NRLogo width={46} />\n\t\t\t\t</div>\n\t\t\t\t<p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n\t\t\t\t\t{t('modal.choosePayment')}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"absolute\" style={{ right: 12, top: 20 }}>\n\t\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n\t\t\t\t\t<SearchInput value={search} onChange={setSearch} inline />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n\t\t\t\t{filtered.map((m, i) => {\n\t\t\t\t\tconst isSelected = m.id === selectedId;\n\t\t\t\t\tconst shortName = getMethodDisplayName(m.id, m.name, t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={m.id}\n\t\t\t\t\t\t\tonClick={() => onSelect(m.id)}\n\t\t\t\t\t\t\tclassName=\"flex items-center w-full card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\tstyle={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0\"\n\t\t\t\t\t\t\t\tstyle={{ width: 32, height: 32 }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{getMethodIcon(m.id, m.icon, 32)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n\t\t\t\t\t\t\t\t<span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n\t\t\t\t\t\t\t\t\t{shortName}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{m.id === recommendedId && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ border: '1.5px solid var(--t-card-border)', borderRadius: 100, paddingLeft: 8, paddingRight: 8, color: 'var(--t-text-secondary)', lineHeight: '20px', letterSpacing: '0.22px' }}>\n\t\t\t\t\t\t\t\t\t\t{t('modal.recommended')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{t('modal.noPaymentMethods')}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","export function ToggleSwitch({\n checked,\n onChange,\n accentColor,\n}: {\n checked: boolean;\n onChange: (v: boolean) => void;\n accentColor?: string;\n}) {\n return (\n <button\n onClick={() => onChange(!checked)}\n className=\"relative shrink-0 transition-colors duration-200\"\n style={{\n width: 64,\n height: 28,\n borderRadius: 14,\n backgroundColor: checked ? (accentColor || 'var(--t-toggle-on)') : 'var(--t-toggle-off)',\n }}\n >\n <div\n className=\"absolute top-[2px] bg-white shadow\"\n style={{\n width: 39,\n height: 24,\n borderRadius: 13,\n transform: checked ? 'translateX(23px)' : 'translateX(2px)',\n transition: 'transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1)',\n }}\n />\n </button>\n );\n}\n","/**\n * Settings Screen Modal\n * Location selector, dark mode toggle, and links (Privacy Policy, Terms of Use).\n * Each row is a rounded surface card matching the Figma V2 design.\n */\n\nimport { useState } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { NRLogo } from '../ui/NRLogo';\nimport { ChevronDown, ChevronRight } from '../ui/icons';\nimport { ToggleSwitch } from '../ui/ToggleSwitch';\nimport { useI18n } from '../../i18n';\n\nconst SETTINGS_LINK_KEYS = [\n { key: 'settings.privacy' as const, href: 'https://nowramp.com/privacy-policy' },\n { key: 'settings.terms' as const, href: 'https://nowramp.com/terms-and-conditions' },\n];\n\nconst cardStyle = {\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n} as const;\n\nexport interface SettingsScreenProps {\n onClose: () => void;\n darkMode: boolean;\n onToggleDarkMode: (v: boolean) => void;\n skinId: string;\n onSelectSkin: (id: string) => void;\n /** Show dark mode toggle (default: true) */\n showThemeToggle?: boolean;\n /** Currently detected/selected country code */\n country?: string;\n /** Display name for the country */\n countryName?: string;\n /** Callback when location row is pressed */\n onLocationPress?: () => void;\n /** Callback when language row is pressed (opens language picker modal) */\n onLanguagePress?: () => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n}\n\nexport function SettingsScreen({\n onClose,\n darkMode,\n onToggleDarkMode,\n skinId: _skinId,\n onSelectSkin: _onSelectSkin,\n showThemeToggle = true,\n country,\n countryName,\n onLocationPress,\n onLanguagePress,\n assetBaseUrl = '',\n}: SettingsScreenProps) {\n void _skinId;\n void _onSelectSkin;\n\n const { t, locale, languages } = useI18n();\n const [flagError, setFlagError] = useState(false);\n\n return (\n <>\n {/* Modal header — 80px with blurred bg */}\n <div className=\"relative shrink-0\" style={{ height: 80, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n <div className=\"absolute\" style={{ left: 12, top: 20 }}>\n <NRLogo width={46} />\n </div>\n <div className=\"absolute\" style={{ right: 12, top: 20 }}>\n <CloseButton onClick={onClose} />\n </div>\n </div>\n <div className=\"px-3 flex-1 pt-4 overflow-y-auto custom-scroll\" style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {/* Location card — label inside, flag + country + chevron */}\n {onLocationPress && (\n <button\n onClick={onLocationPress}\n className=\"w-full text-left transition-colors card-press modal-item-in\"\n style={{ ...cardStyle, backgroundColor: 'var(--t-surface)', color: 'inherit', border: 'none', cursor: 'pointer', padding: '12px 16px' }}\n >\n <span className=\"text-[13px] block mb-1.5\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('settings.location')}\n </span>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {country && !flagError ? (\n <img\n src={`${assetBaseUrl}/flags/${country.toLowerCase()}.svg`}\n alt={country}\n width={28}\n height={28}\n style={{ width: 28, height: 28, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setFlagError(true)}\n />\n ) : (\n <GlobeIcon size={28} />\n )}\n <span className=\"text-[15px] font-medium\" style={{ color: 'var(--t-text)' }}>\n {countryName || country}\n </span>\n </div>\n <ChevronDown />\n </div>\n </button>\n )}\n\n {/* Dark mode card */}\n {showThemeToggle && (\n <div\n className=\"flex items-center justify-between w-full px-4 modal-item-in\"\n style={{ ...cardStyle, paddingTop: 14, paddingBottom: 14, animationDelay: '60ms' }}\n >\n <span className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n {t('settings.darkMode')}\n </span>\n <ToggleSwitch checked={darkMode} onChange={onToggleDarkMode} />\n </div>\n )}\n\n {/* Language card */}\n {onLanguagePress && (\n <button\n onClick={onLanguagePress}\n className=\"flex items-center justify-between w-full transition-colors card-press modal-item-in\"\n style={{ ...cardStyle, backgroundColor: 'var(--t-surface)', color: 'inherit', border: 'none', cursor: 'pointer', padding: '14px 16px', margin: 0, textAlign: 'left', animationDelay: '120ms' }}\n >\n <span className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n {t('settings.language')}\n </span>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {languages.find(l => l.code === locale)?.name || locale}\n </span>\n </button>\n )}\n\n {/* Links: Privacy Policy, Terms of Use — each in its own card */}\n {SETTINGS_LINK_KEYS.map((item, i) => (\n <a\n key={item.key}\n href={item.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-between w-full px-4 transition-colors card-press modal-item-in\"\n style={{ ...cardStyle, textDecoration: 'none', color: 'inherit', paddingTop: 14, paddingBottom: 14, animationDelay: `${180 + i * 60}ms` }}\n >\n <span className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n {t(item.key)}\n </span>\n <ChevronRight />\n </a>\n ))}\n </div>\n </>\n );\n}\n\nfunction GlobeIcon({ size = 28 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\">\n <circle cx=\"20\" cy=\"20\" r=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <ellipse cx=\"20\" cy=\"20\" rx=\"9\" ry=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <line x1=\"2\" y1=\"20\" x2=\"38\" y2=\"20\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" />\n <path d=\"M5 12h30M5 28h30\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n","/**\n * Country Picker Modal\n * Searchable list of countries with flag icons.\n * Follows the FiatCurrencyModal pattern.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { COUNTRIES, COUNTRY_MAP } from '../../data/countries';\nimport { useT } from '../../i18n';\n\nexport interface CountryPickerModalProps {\n onClose: () => void;\n onSelect: (countryCode: string) => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n /** Currently selected country code */\n selectedCode?: string;\n}\n\nexport function CountryPickerModal({\n onClose,\n onSelect,\n assetBaseUrl = '',\n selectedCode,\n}: CountryPickerModalProps) {\n const t = useT();\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n const raw = search.trim().toLowerCase();\n\n // If no search, put selected item first\n if (!raw) {\n if (selectedCode) {\n const normalizedCode = selectedCode.toLowerCase();\n const selected = COUNTRY_MAP[normalizedCode];\n if (selected) {\n const rest = COUNTRIES.filter((c) => c.code !== normalizedCode);\n return [selected, ...rest];\n }\n }\n return COUNTRIES;\n }\n\n return COUNTRIES.filter(\n (c) =>\n c.name.toLowerCase().includes(raw) ||\n c.code.includes(raw) ||\n c.defaultFiat.toLowerCase().includes(raw)\n );\n }, [search, selectedCode]);\n\n return (\n <>\n {/* Modal header — 128px with blurred bg */}\n <div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n <div className=\"absolute\" style={{ left: 12, top: 20 }}>\n <NRLogo width={46} />\n </div>\n <p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n {t('modal.selectCountry')}\n </p>\n <div className=\"absolute\" style={{ right: 12, top: 20 }}>\n <CloseButton onClick={onClose} />\n </div>\n <div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n <SearchInput value={search} onChange={setSearch} inline />\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n {filtered.map((c, i) => {\n const isSelected = selectedCode?.toLowerCase() === c.code;\n return (\n <button\n key={c.code}\n onClick={() => onSelect(c.code)}\n className=\"flex items-center w-full card-press hover-item modal-item-in\"\n style={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n >\n <CountryFlag code={c.code} size={32} baseUrl={assetBaseUrl} />\n <div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n <span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n {c.name}\n </span>\n {isSelected && (\n <div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"var(--t-success, #4CD964)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n </button>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n {t('modal.noCountries')}\n </div>\n )}\n </div>\n </>\n );\n}\n\n/** Country flag image using the /flags/{code}.svg pattern */\nfunction CountryFlag({ code, size = 32, baseUrl = '' }: { code: string; size?: number; baseUrl?: string }) {\n const [error, setError] = useState(false);\n\n if (error) {\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: 'var(--t-pill-bg, #333)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: size * 0.4,\n color: 'var(--t-text-muted)',\n }}\n >\n {code.toUpperCase().slice(0, 2)}\n </div>\n );\n }\n\n return (\n <img\n src={`${baseUrl}/flags/${code}.svg`}\n alt={code}\n width={size}\n height={size}\n style={{ width: size, height: size, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setError(true)}\n />\n );\n}\n","/**\n * Language Picker Modal\n * Searchable list of languages.\n * Follows the CountryPickerModal pattern.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { LANGUAGES, type LanguageCode } from '../../i18n/languages';\nimport { useT } from '../../i18n';\n\nexport interface LanguagePickerModalProps {\n onClose: () => void;\n onSelect: (code: LanguageCode) => void;\n /** Currently selected language code */\n selectedCode?: string;\n}\n\nexport function LanguagePickerModal({\n onClose,\n onSelect,\n selectedCode,\n}: LanguagePickerModalProps) {\n const t = useT();\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n const raw = search.trim().toLowerCase();\n\n // If no search, put selected item first\n if (!raw) {\n if (selectedCode) {\n const selected = LANGUAGES.find((l) => l.code === selectedCode);\n if (selected) {\n const rest = LANGUAGES.filter((l) => l.code !== selectedCode);\n return [selected, ...rest];\n }\n }\n return LANGUAGES;\n }\n\n return LANGUAGES.filter(\n (l) =>\n l.name.toLowerCase().includes(raw) ||\n l.english.toLowerCase().includes(raw) ||\n l.code.includes(raw)\n );\n }, [search, selectedCode]);\n\n return (\n <>\n {/* Modal header — 128px with blurred bg */}\n <div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n <div className=\"absolute\" style={{ left: 12, top: 20 }}>\n <NRLogo width={46} />\n </div>\n <p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n {t('modal.selectLanguage')}\n </p>\n <div className=\"absolute\" style={{ right: 12, top: 20 }}>\n <CloseButton onClick={onClose} />\n </div>\n <div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n <SearchInput value={search} onChange={setSearch} inline />\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n {filtered.map((lang, i) => {\n const isSelected = selectedCode === lang.code;\n return (\n <button\n key={lang.code}\n onClick={() => onSelect(lang.code)}\n className=\"flex items-center w-full card-press hover-item modal-item-in\"\n style={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n >\n <div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, paddingLeft: 4, gap: 10 }}>\n <span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n {lang.name}\n </span>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>\n {lang.english}\n </span>\n {isSelected && (\n <div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"var(--t-success, #4CD964)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n </button>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n {t('modal.noLanguages')}\n </div>\n )}\n </div>\n </>\n );\n}\n","import { NRLogo } from '../ui/NRLogo';\nimport { MoreDotsIcon } from '../ui/icons';\nimport { useT } from '../../i18n';\n\nexport interface HeaderBarProps {\n tab: 'buy' | 'sell';\n onTabSwitch: (tab: 'buy' | 'sell') => void;\n showFlowToggle: boolean;\n showSettings: boolean;\n onOpenSettings: () => void;\n darkMode: boolean;\n}\n\nexport function HeaderBar({\n tab,\n onTabSwitch,\n showFlowToggle,\n showSettings,\n onOpenSettings,\n}: HeaderBarProps) {\n const t = useT();\n return (\n <div\n className=\"absolute top-0 left-0 right-0 z-10 flex items-center justify-between px-3\"\n style={{\n height: 80,\n background: 'var(--t-header-bg)',\n backdropFilter: `blur(var(--t-header-blur))`,\n WebkitBackdropFilter: `blur(var(--t-header-blur))`,\n }}\n >\n {/* Left: NR logo */}\n <div style={{ width: 46, display: 'flex', alignItems: 'center', justifyContent: 'flex-start' }}>\n <NRLogo width={46} />\n </div>\n\n {/* Center: pill tab switcher */}\n {showFlowToggle ? (\n <div\n className=\"relative flex\"\n style={{\n border: '1.5px solid var(--t-tab-border)',\n borderRadius: 'var(--t-pill-radius)',\n padding: 4,\n gap: 4,\n }}\n >\n {/* Sliding indicator */}\n <div\n style={{\n position: 'absolute',\n top: 4,\n left: 4,\n width: 88,\n height: 32,\n borderRadius: 'var(--t-pill-radius)',\n background: 'var(--t-tab-active-bg)',\n transform: tab === 'buy' ? 'translateX(0)' : 'translateX(92px)',\n transition: 'transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n zIndex: 0,\n }}\n />\n <button\n onClick={() => onTabSwitch('buy')}\n className={`text-[13px] font-medium transition-colors duration-200 tab-pill${tab === 'buy' ? ' tab-pill-active' : ''}`}\n style={{\n position: 'relative',\n zIndex: 1,\n width: 88,\n height: 32,\n borderRadius: 'var(--t-pill-radius)',\n color: tab === 'buy' ? 'var(--t-tab-active-text)' : 'var(--t-tab-inactive-text)',\n }}\n >\n {t('header.buy')}\n </button>\n <button\n onClick={() => onTabSwitch('sell')}\n className={`text-[13px] font-medium transition-colors duration-200 tab-pill${tab === 'sell' ? ' tab-pill-active' : ''}`}\n style={{\n position: 'relative',\n zIndex: 1,\n width: 88,\n height: 32,\n borderRadius: 'var(--t-pill-radius)',\n color: tab === 'sell' ? 'var(--t-tab-active-text)' : 'var(--t-tab-inactive-text)',\n }}\n >\n {t('header.sell')}\n </button>\n </div>\n ) : (\n <div />\n )}\n\n {/* Right: menu dots */}\n <div style={{ width: 40, display: 'flex', alignItems: 'center', justifyContent: 'flex-end' }}>\n {showSettings ? (\n <MoreDotsIcon onClick={onOpenSettings} />\n ) : (\n <div style={{ width: 40 }} />\n )}\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { CryptoIcon, FiatFlag, ChevronDown } from '../ui/icons';\nimport { useT } from '../../i18n';\nimport type { FieldLocksConfig } from '@nowramp/sdk';\n\ntype MaybeFieldLocks = FieldLocksConfig | null | undefined;\n\nexport interface SpendCardProps {\n amount: string;\n onAmountChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n currencyCode: string;\n isBuy: boolean;\n onOpenModal: () => void;\n assetBaseUrl: string;\n error?: string;\n fieldLocks?: MaybeFieldLocks;\n onBlur: () => void;\n inputRef?: React.Ref<HTMLInputElement>;\n /** Chain code for sell mode crypto display */\n chainCode?: string;\n chainDisplay?: string;\n getChainIconUrl?: (chain: string, base: string) => string;\n shaking?: boolean;\n onFocus?: () => void;\n}\n\nexport function SpendCard({\n amount,\n onAmountChange,\n currencyCode,\n isBuy,\n onOpenModal,\n assetBaseUrl,\n error,\n fieldLocks,\n onBlur,\n inputRef,\n chainCode,\n chainDisplay,\n getChainIconUrl,\n shaking,\n onFocus,\n}: SpendCardProps) {\n const t = useT();\n return (\n <>\n <div\n className={`flex flex-col gap-[20px] p-4 card-hover${shaking ? ' error-shake' : ''}`}\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n ...(error ? { border: '1px solid var(--t-error)' } : {}),\n }}\n >\n <div className=\"text-[16px]\" style={{ color: 'var(--t-text-secondary)', lineHeight: '16px' }}>\n {t('spend.label')}\n </div>\n <div className=\"flex items-center justify-between\">\n <input\n ref={inputRef}\n type=\"text\"\n value={amount}\n onChange={onAmountChange}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={isBuy ? t('spend.placeholderFiat') : t('spend.placeholderCrypto')}\n className=\"bg-transparent outline-none w-0 flex-1 mr-3\"\n style={{\n color: 'var(--t-text)',\n fontSize: 24,\n fontWeight: 500,\n lineHeight: '32px',\n padding: 0,\n border: 'none',\n borderRadius: 0,\n backgroundColor: 'transparent',\n height: 'auto',\n width: 0,\n }}\n inputMode=\"decimal\"\n disabled={!!fieldLocks?.sourceAmount?.locked}\n />\n {isBuy ? (\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] shrink-0 transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.sourceCurrency?.locked}\n >\n <FiatFlag currencyCode={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n ) : (\n <div className=\"flex flex-col items-end shrink-0\">\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.destinationCurrency?.locked}\n >\n <CryptoIcon ticker={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n {chainCode && getChainIconUrl && (\n <div className=\"flex items-center gap-1 mt-1.5 mr-0.5\">\n <div className=\"rounded-full\" style={{ width: 14, height: 14, background: '#ffffff' }}>\n <img\n src={getChainIconUrl(chainCode, assetBaseUrl)}\n alt={chainCode}\n width={14}\n height={14}\n className=\"rounded-full\"\n style={{ width: 14, height: 14 }}\n />\n </div>\n <span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {chainDisplay}\n </span>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n {error && (\n <div className=\"text-[12px] mt-1.5 text-center\" style={{ color: 'var(--t-error)' }}>\n {error}\n </div>\n )}\n </>\n );\n}\n","import type React from 'react';\n\nexport function AnimatedDigit({ char, height = 38 }: { char: string; height?: number }) {\n const digits = '0123456789';\n const idx = digits.indexOf(char);\n if (idx === -1) return <span style={{ display: 'inline-block', textAlign: 'center' }}>{char}</span>;\n return (\n <span className=\"digit-slot\" style={{ height, lineHeight: `${height}px`, textAlign: 'center' }}>\n <span className=\"digit-slot-inner block\" style={{ transform: `translateY(-${idx * height}px)` }}>\n {digits.split('').map(d => (\n <span key={d} className=\"block\" style={{ height, lineHeight: `${height}px` }}>{d}</span>\n ))}\n </span>\n </span>\n );\n}\n\nexport function AnimatedNumber({\n value,\n height = 38,\n className = '',\n style = {},\n}: {\n value: string;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}) {\n return (\n <span className={className} style={{ display: 'inline-flex', fontVariantNumeric: 'tabular-nums', ...style }}>\n {value.split('').map((ch, i) => (\n <AnimatedDigit key={i} char={ch} height={height} />\n ))}\n </span>\n );\n}\n","import { CryptoIcon, FiatFlag, ChevronDown, InfoIcon } from '../ui/icons';\nimport { useT } from '../../i18n';\nimport { AnimatedNumber } from '../ui/AnimatedNumber';\nimport { Spinner } from '../ui/Spinner';\nimport type { FieldLocksConfig } from '@nowramp/sdk';\n\ntype MaybeFieldLocks = FieldLocksConfig | null | undefined;\n\nexport interface ReceiveCardProps {\n amount: string;\n currencyCode: string;\n chainCode?: string;\n chainDisplay?: string;\n isBuy: boolean;\n onOpenModal: () => void;\n displayRate: string;\n assetBaseUrl: string;\n quotesLoading: boolean;\n onOpenRateBreakdown: () => void;\n fieldLocks?: MaybeFieldLocks;\n spendNumeric: number;\n getChainIconUrl?: (chain: string, base: string) => string;\n autoSelectPending?: boolean;\n rateFlash?: boolean;\n}\n\nexport function ReceiveCard({\n amount,\n currencyCode,\n chainCode,\n chainDisplay,\n isBuy,\n onOpenModal,\n displayRate,\n assetBaseUrl,\n quotesLoading,\n onOpenRateBreakdown,\n fieldLocks,\n spendNumeric,\n getChainIconUrl,\n autoSelectPending,\n rateFlash,\n}: ReceiveCardProps) {\n const t = useT();\n return (\n <div\n className=\"p-4 card-hover\"\n style={{\n borderRadius: 'var(--t-card-radius)',\n border: '1.5px solid var(--t-card-border)',\n background: 'transparent',\n }}\n >\n <div className=\"flex flex-col gap-[20px]\">\n <div className=\"text-[16px]\" style={{ color: 'var(--t-text-secondary)', lineHeight: '16px' }}>\n {t('receive.label')}\n </div>\n <div className=\"flex flex-col gap-[8px]\">\n <div className=\"flex items-start justify-between\">\n <div className={rateFlash ? 'rate-flash' : ''}>\n <AnimatedNumber\n value={spendNumeric > 0 ? amount : '0'}\n height={32}\n className=\"font-medium\"\n style={{\n color: spendNumeric > 0 ? 'var(--t-text)' : 'var(--t-text-muted)',\n fontSize: 24,\n }}\n />\n </div>\n {isBuy ? (\n <div className=\"flex flex-col items-end shrink-0\">\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.destinationCurrency?.locked}\n >\n <CryptoIcon ticker={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n </div>\n ) : (\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] shrink-0 transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.sourceCurrency?.locked}\n >\n <FiatFlag currencyCode={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n )}\n </div>\n\n {/* Bottom row: rate + chain info */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-[4px]\">\n {quotesLoading && !autoSelectPending ? (\n <>\n <Spinner size={12} />\n <span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-text-muted)', letterSpacing: '0.22px', lineHeight: '12px' }}>\n {t('receive.fetchingRate')}\n </span>\n </>\n ) : (\n <>\n <span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-text-muted)', letterSpacing: '0.22px', lineHeight: '12px' }}>\n {displayRate || '\\u00A0'}\n </span>\n {displayRate && (\n <button\n onClick={onOpenRateBreakdown}\n className=\"flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity\"\n >\n <InfoIcon size={12} />\n </button>\n )}\n </>\n )}\n </div>\n {isBuy && chainCode && getChainIconUrl && (\n <div className=\"flex items-center gap-1\">\n <div className=\"rounded-full\" style={{ width: 12, height: 12, background: '#ffffff' }}>\n <img\n src={getChainIconUrl(chainCode, assetBaseUrl)}\n alt={chainCode}\n width={12}\n height={12}\n className=\"rounded-full\"\n style={{ width: 12, height: 12 }}\n />\n </div>\n <span className=\"text-[11px]\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.22px', lineHeight: '12px' }}>\n {chainDisplay}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { ChevronDown } from '../ui/icons';\nimport { useT } from '../../i18n';\n\nexport interface PaymentCardProps {\n selectedMethod?: { id: string; name: string; icon?: string };\n onOpenModal: () => void;\n darkMode: boolean;\n getMethodIcon: (id: string, icon: string | undefined, size: number) => React.ReactNode;\n getMethodDisplayName: (id: string, name: string) => string;\n}\n\nexport function PaymentCard({\n selectedMethod,\n onOpenModal,\n getMethodIcon,\n getMethodDisplayName,\n}: PaymentCardProps) {\n const t = useT();\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpenModal}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n className=\"flex items-center gap-[4px] p-4 transition-colors cursor-pointer card-press card-hover\"\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n }}\n >\n <span className=\"text-[13px] flex-1\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.13px', lineHeight: '20px' }}>\n {t('payment.label')}\n </span>\n <span className=\"flex items-center gap-[6px]\">\n {selectedMethod && (\n <>\n <span className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n {getMethodIcon(selectedMethod.id, selectedMethod.icon, 20)}\n </span>\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '16px' }}>\n {getMethodDisplayName(selectedMethod.id, selectedMethod.name)}\n </span>\n </>\n )}\n {!selectedMethod && (\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>{t('payment.select')}</span>\n )}\n <ChevronDown />\n </span>\n </div>\n );\n}\n","import { ChevronDown } from '../ui/icons';\nimport { useT } from '../../i18n';\nimport { getProviderIconUrl } from '../../data/cryptoData';\nimport type { Quote } from '@nowramp/sdk';\n\nexport interface ProviderCardProps {\n selectedQuote: Quote | null;\n quotesLoading: boolean;\n onOpenModal: () => void;\n assetBaseUrl?: string;\n}\n\nexport function ProviderCard({\n selectedQuote,\n quotesLoading,\n onOpenModal,\n assetBaseUrl = '',\n}: ProviderCardProps) {\n const t = useT();\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpenModal}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n className=\"flex items-center gap-[4px] p-4 transition-colors cursor-pointer card-press card-hover\"\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n }}\n >\n <span className=\"text-[13px] flex-1\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.13px', lineHeight: '20px' }}>\n {t('provider.label')}\n </span>\n <span className=\"flex items-center gap-[6px]\">\n {quotesLoading && !selectedQuote && (\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>...</span>\n )}\n {!quotesLoading && !selectedQuote && (\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>{t('provider.select')}</span>\n )}\n {selectedQuote && (\n <>\n <span className=\"flex items-center justify-center overflow-hidden rounded-full\" style={{ width: 20, height: 20 }}>\n <img\n src={getProviderIconUrl(selectedQuote.gatewayId, assetBaseUrl)}\n alt=\"\"\n width={20}\n height={20}\n className=\"rounded-full\"\n style={{ width: 20, height: 20, objectFit: 'cover' }}\n onError={(e) => {\n if (selectedQuote.gatewayLogo && (e.target as HTMLImageElement).src !== selectedQuote.gatewayLogo) {\n (e.target as HTMLImageElement).src = selectedQuote.gatewayLogo;\n }\n }}\n />\n </span>\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '16px' }}>\n {selectedQuote.gatewayName}\n </span>\n </>\n )}\n <ChevronDown />\n </span>\n </div>\n );\n}\n","/**\n * Choose Ramp (Provider) Modal\n * Displays REAL quotes from the aggregation engine in a ranked list.\n * Selected item gets an accent border outline, others get surface background.\n * Shows loading skeletons while quotes load, and an empty state if no quotes available.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { Skeleton } from '../ui/Skeleton';\nimport { useT } from '../../i18n';\nimport { getProviderIconUrl } from '../../data/cryptoData';\nimport type { Quote, QuotesResponse } from '@nowramp/sdk';\n\nexport interface ChooseRampModalProps {\n\tonClose: () => void;\n\tonSelect: (quote: Quote) => void;\n\t/** Real quotes from the aggregation engine */\n\tquotes: QuotesResponse | null;\n\t/** Whether quotes are still loading */\n\tquotesLoading: boolean;\n\t/** The selected crypto currency code (for display) */\n\tcryptoCurrency: string;\n\t/** Currently selected gateway ID (outline border) */\n\tselectedGatewayId?: string | null;\n\t/** Base URL for static assets */\n\tassetBaseUrl?: string;\n}\n\nfunction BestPriceIcon() {\n\treturn (\n\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n\t\t\t<path d=\"M8 1l2.12 4.3 4.74.69-3.43 3.34.81 4.72L8 11.77l-4.24 2.28.81-4.72L1.14 5.99l4.74-.69L8 1z\" fill=\"var(--t-success)\" />\n\t\t</svg>\n\t);\n}\n\nfunction RecommendedIcon() {\n\treturn (\n\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n\t\t\t<path d=\"M14 7.5a6 6 0 11-12 0 6 6 0 0112 0z\" stroke=\"var(--t-accent)\" strokeWidth=\"1.5\" />\n\t\t\t<path d=\"M5.5 8l2 2 3.5-4\" stroke=\"var(--t-accent)\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t</svg>\n\t);\n}\n\nfunction QuoteTag({ quote }: { quote: Quote }) {\n\tconst t = useT();\n\tif (quote.isBestRate) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t<BestPriceIcon />\n\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-success)' }}>\n\t\t\t\t\t{t('modal.bestPrice')}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.isRecommended) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t<RecommendedIcon />\n\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-accent)' }}>\n\t\t\t\t\t{t('modal.recommended')}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.rank && quote.rank <= 3) {\n\t\treturn (\n\t\t\t<div className=\"text-[11px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t#{quote.rank}\n\t\t\t</div>\n\t\t);\n\t}\n\treturn null;\n}\n\nfunction ProviderIcon({ gatewayId, gatewayLogo, assetBaseUrl = '' }: { gatewayId: string; gatewayLogo?: string; assetBaseUrl?: string }) {\n\tconst localSrc = getProviderIconUrl(gatewayId, assetBaseUrl);\n\treturn (\n\t\t<span className=\"rounded-full shrink-0 overflow-hidden inline-flex items-center justify-center\" style={{ width: 36, height: 36 }}>\n\t\t\t<img\n\t\t\t\tsrc={localSrc}\n\t\t\t\talt=\"\"\n\t\t\t\twidth={36}\n\t\t\t\theight={36}\n\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\tstyle={{ width: 36, height: 36, objectFit: 'cover' }}\n\t\t\t\tonError={(e) => {\n\t\t\t\t\tif (gatewayLogo && (e.target as HTMLImageElement).src !== gatewayLogo) {\n\t\t\t\t\t\t(e.target as HTMLImageElement).src = gatewayLogo;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nfunction PercentageDiff({ pct }: { pct: number }) {\n\tif (pct === 0) return null;\n\tconst color = pct > 0 ? 'var(--t-success)' : 'var(--t-error)';\n\tconst sign = pct > 0 ? '+' : '';\n\treturn (\n\t\t<span className=\"text-[11px] font-medium\" style={{ color }}>\n\t\t\t{sign}{pct.toFixed(2)}%\n\t\t</span>\n\t);\n}\n\nfunction LoadingSkeletons() {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={i}\n\t\t\t\t\tclassName=\"w-full flex items-center gap-3.5 modal-item-in\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\theight: 64,\n\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tanimationDelay: `${i * 45}ms`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Skeleton w={36} h={36} className=\"rounded-full shrink-0\" />\n\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t<Skeleton w={90} h={14} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={60} h={12} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-right\">\n\t\t\t\t\t\t<Skeleton w={40} h={10} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={80} h={14} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nexport function ChooseRampModal({\n\tonClose,\n\tonSelect,\n\tquotes,\n\tquotesLoading,\n\tcryptoCurrency,\n\tselectedGatewayId,\n\tassetBaseUrl = '',\n}: ChooseRampModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\tconst filteredQuotes = useMemo(() => {\n\t\tif (!quotes?.quotes) return [];\n\t\tconst raw = search.trim().toLowerCase();\n\t\tif (!raw) return quotes.quotes;\n\t\treturn quotes.quotes.filter((q) => q.gatewayName.toLowerCase().includes(raw));\n\t}, [quotes, search]);\n\n\t// Best crypto amount for percentage diff calculation\n\tconst bestCryptoAmount = filteredQuotes.length > 0 ? parseFloat(filteredQuotes[0].cryptoAmount) : 0;\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\t{t('modal.chooseRamp')}\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5 space-y-2\">\n\t\t\t\t{quotesLoading ? (\n\t\t\t\t\t<LoadingSkeletons />\n\t\t\t\t) : filteredQuotes.length === 0 ? (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{quotes && quotes.quotes.length === 0\n\t\t\t\t\t\t\t? t('modal.noQuotes')\n\t\t\t\t\t\t\t: t('modal.noProvidersFound')}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\tfilteredQuotes.map((quote, i) => {\n\t\t\t\t\t\tconst isBest = i === 0;\n\t\t\t\t\t\tconst isSelected = selectedGatewayId === quote.gatewayId;\n\t\t\t\t\t\tconst receiveAmount = parseFloat(quote.cryptoAmount);\n\t\t\t\t\t\tconst displayAmount =\n\t\t\t\t\t\t\treceiveAmount >= 1 ? receiveAmount.toFixed(4) : receiveAmount.toPrecision(6);\n\n\t\t\t\t\t\t// Percentage difference from best quote\n\t\t\t\t\t\tconst pctDiff = !isBest && bestCryptoAmount > 0\n\t\t\t\t\t\t\t? ((receiveAmount - bestCryptoAmount) / bestCryptoAmount) * 100\n\t\t\t\t\t\t\t: 0;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={quote.gatewayId}\n\t\t\t\t\t\t\t\tonClick={() => onSelect(quote)}\n\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center gap-3 transition-colors card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--t-card-radius)',\n\t\t\t\t\t\t\t\t\tpadding: '12px 16px',\n\t\t\t\t\t\t\t\t\tborder: isSelected ? '1.5px solid var(--t-accent)' : '1.5px solid transparent',\n\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\tanimationDelay: `${Math.min(i * 45, 350)}ms`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ProviderIcon gatewayId={quote.gatewayId} gatewayLogo={quote.gatewayLogo} assetBaseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[14px] leading-[18px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{quote.gatewayName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<QuoteTag quote={quote} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-right shrink-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"text-[11px] leading-[14px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t{isBest ? t('receive.label') : <PercentageDiff pct={pctDiff} />}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[13px] leading-[18px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] font-normal\" style={{ color: 'var(--t-text-secondary)' }}>{cryptoCurrency}</span>{' '}{displayAmount}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t)}\n\n\t\t\t\t{/* Unavailable gateways */}\n\t\t\t\t{!quotesLoading && quotes?.unavailableGateways && quotes.unavailableGateways.length > 0 && (\n\t\t\t\t\t<div className=\"pt-2 space-y-1.5\">\n\t\t\t\t\t\t{quotes.unavailableGateways.map((g, i) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={g.gatewayId}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-3 modal-item-in\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--t-card-radius)',\n\t\t\t\t\t\t\t\t\tpadding: '10px 16px',\n\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\topacity: 0.45,\n\t\t\t\t\t\t\t\t\tanimationDelay: `${Math.min((filteredQuotes.length + i) * 45, 500)}ms`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ProviderIcon gatewayId={g.gatewayId} assetBaseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[14px] leading-[18px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{g.gatewayName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-right shrink-0\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t\t{g.reason}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useT } from '../../i18n';\nimport { Spinner } from '../ui/Spinner';\n\nexport interface WalletCardProps {\n address: string;\n onChange: (value: string) => void;\n placeholder: string;\n isBuy: boolean;\n error?: string;\n validating: boolean;\n disabled: boolean;\n onFocus: () => void;\n onBlur: () => void;\n focused?: boolean;\n}\n\nexport function WalletCard({\n address,\n onChange,\n placeholder,\n error,\n validating,\n disabled,\n onFocus,\n onBlur,\n focused,\n}: WalletCardProps) {\n const t = useT();\n const showInlineSpinner = validating && address.trim().length >= 10;\n const [shaking, setShaking] = useState(false);\n const prevErrorRef = useRef(error);\n\n useEffect(() => {\n if (error && !prevErrorRef.current) {\n setShaking(true);\n const timer = setTimeout(() => setShaking(false), 400);\n return () => clearTimeout(timer);\n }\n prevErrorRef.current = error;\n }, [error]);\n\n return (\n <div>\n <div\n className={`flex flex-col gap-[4px] p-4 card-hover${shaking ? ' error-shake' : ''}`}\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n }}\n >\n <div className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.13px', lineHeight: '20px' }}>\n {t('wallet.label')}\n </div>\n <div className=\"relative flex items-center\">\n <input\n type=\"text\"\n value={address}\n onChange={(e) => onChange(e.target.value)}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n className=\"w-full bg-transparent text-[13px] outline-none\"\n style={{\n color: 'var(--t-text)',\n border: 'none',\n padding: 0,\n paddingRight: showInlineSpinner ? 24 : 0,\n fontSize: 13,\n lineHeight: '20px',\n letterSpacing: '0.13px',\n backgroundColor: 'transparent',\n }}\n disabled={disabled}\n />\n {/* Inline validation spinner */}\n {showInlineSpinner && (\n <div className=\"absolute right-0 top-0 bottom-0 flex items-center\">\n <Spinner size={14} />\n </div>\n )}\n {/* Cursor blink indicator for empty active state */}\n {!address && focused && !disabled && (\n <div\n className=\"absolute left-0 top-0 bottom-0 flex items-center\"\n style={{ pointerEvents: 'none' }}\n >\n <div\n style={{\n width: 1,\n height: 16,\n background: 'var(--t-text)',\n animation: 'fadeIn 0.5s ease-in-out infinite alternate',\n }}\n />\n </div>\n )}\n </div>\n </div>\n {error && (\n <div className=\"text-[12px] mt-1.5 text-center\" style={{ color: 'var(--t-error)' }}>\n {error}\n </div>\n )}\n </div>\n );\n}\n","export interface CtaButtonProps {\n label: string;\n disabled: boolean;\n loading: boolean;\n onClick: () => void;\n}\n\nexport function CtaButton({ label, disabled, loading, onClick }: CtaButtonProps) {\n return (\n <button\n disabled={disabled}\n onClick={onClick}\n className=\"w-full font-medium text-[18px] transition-all duration-150 cta-btn\"\n style={{\n padding: '12px 24px',\n lineHeight: '28px',\n borderRadius: 'var(--t-cta-radius)',\n background: 'var(--t-cta-bg)',\n color: 'var(--t-cta-text)',\n opacity: disabled ? 0.4 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n <span className=\"flex items-center justify-center gap-2\">\n {label}\n {loading && (\n <div style={{\n width: 18, height: 18,\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'nramp-spin 0.8s linear infinite',\n opacity: 0.6,\n }} />\n )}\n </span>\n </button>\n );\n}\n","import { useT } from '../../i18n';\n\nexport function Footer() {\n const t = useT();\n return (\n <div className=\"text-center py-3\" style={{ height: 16, lineHeight: '16px' }}>\n <span style={{ fontSize: 9, opacity: 0.5, color: 'var(--t-text)', letterSpacing: '0.27px' }}>\n {t('footer.poweredBy')}\n </span>\n <span style={{ fontSize: 9, opacity: 0.65, color: 'var(--t-text)', letterSpacing: '0.27px' }}>\n {t('footer.brand')}\n </span>\n </div>\n );\n}\n","import type { Quote } from '@nowramp/sdk';\nimport { Spinner } from '../ui/Spinner';\nimport { InfoIcon, XIcon } from '../ui/icons';\nimport { useT } from '../../i18n';\n\nexport interface RateBreakdownProps {\n quote: Quote | null | undefined;\n isOpen: boolean;\n onClose: () => void;\n countdown: number;\n quotesLoading: boolean;\n}\n\nexport function RateBreakdown({\n quote,\n isOpen,\n onClose,\n countdown,\n quotesLoading,\n}: RateBreakdownProps) {\n const t = useT();\n\n if (!isOpen) return null;\n\n const pad = (n: number) => String(n).padStart(2, '0');\n\n const fiatSymbol = quote?.fiatCurrency === 'USD' ? '$'\n : quote?.fiatCurrency === 'EUR' ? '\\u20AC'\n : quote?.fiatCurrency === 'GBP' ? '\\u00A3'\n : quote?.fiatCurrency ? `${quote.fiatCurrency} ` : '$';\n\n const formatFiat = (value: string | number) => {\n const num = typeof value === 'string' ? parseFloat(value) : value;\n if (isNaN(num)) return `${fiatSymbol}0.00`;\n return `${fiatSymbol}${num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n };\n\n return (\n <div className=\"px-5 py-5\">\n {/* Header: countdown pill + info + X close */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {quotesLoading ? (\n <Spinner size={16} />\n ) : (\n <>\n <span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n {t('rate.updatesInLabel')}\n </span>\n <span\n className=\"text-[12px] font-medium px-2 py-0.5 rounded-full\"\n style={{ color: 'var(--t-text)', border: '1px solid var(--t-border)' }}\n >\n 00:{pad(countdown)}\n </span>\n <div className=\"relative group\">\n <div\n className=\"flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-help\"\n aria-label={t('rate.rateTooltip')}\n >\n <InfoIcon size={12} />\n </div>\n <div\n className=\"info-tooltip pointer-events-none absolute left-1/2 z-50 w-[200px] px-3 py-2 rounded-xl text-[11px] leading-snug font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n style={{ background: 'var(--t-tooltip-bg)', color: 'var(--t-tooltip-text)', top: 'calc(100% + 8px)', transform: 'translateX(-50%)' }}\n >\n {t('rate.rateTooltip')}\n </div>\n </div>\n </>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"flex items-center justify-center rounded-full transition-opacity hover:opacity-70\"\n style={{ width: 28, height: 28, background: 'var(--t-surface)', color: 'var(--t-text)' }}\n >\n <XIcon size={10} />\n </button>\n </div>\n\n {!quote ? (\n <div className=\"text-[13px] py-4 text-center\" style={{ color: 'var(--t-text-muted)' }}>\n {t('rate.noQuote')}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* Large exchange rate value */}\n {quote.exchangeRate && (\n <div className=\"text-[28px] font-semibold\" style={{ color: 'var(--t-text)' }}>\n {formatFiat(quote.exchangeRate)}\n </div>\n )}\n\n {/* Processing fee — stacked label + value */}\n {quote.fees?.processingFee && (\n <div>\n <span className=\"text-[13px] block mb-0.5\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('rate.processingFee')}{quote.fees.feePercentage ? ` ${t('rate.feeIncluded', { percentage: Math.round(parseFloat(String(quote.fees.feePercentage)) * 100) / 100 })}` : ''}\n </span>\n <span className=\"text-[15px] font-semibold\" style={{ color: 'var(--t-text)' }}>\n {formatFiat(quote.fees.processingFee)}\n </span>\n </div>\n )}\n\n {/* Network fee — stacked label + value with crypto equivalent */}\n {quote.fees?.networkFee && (\n <div>\n <span className=\"flex items-center gap-1 text-[13px] mb-0.5\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('rate.networkFeeIncl')}\n <div className=\"relative group\">\n <div\n className=\"flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-help\"\n aria-label={t('rate.networkFeeTooltip')}\n >\n <InfoIcon size={12} />\n </div>\n <div\n className=\"info-tooltip pointer-events-none absolute left-1/2 z-50 w-[220px] px-3 py-2 rounded-xl text-[11px] leading-snug font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n style={{ background: 'var(--t-tooltip-bg)', color: 'var(--t-tooltip-text)', bottom: 'calc(100% + 8px)', transform: 'translateX(-50%)' }}\n >\n {t('rate.networkFeeTooltip')}\n </div>\n </div>\n </span>\n <span className=\"text-[15px] font-semibold\" style={{ color: 'var(--t-text)' }}>\n {formatFiat(quote.fees.networkFee)}\n {quote.exchangeRate && (\n <span className=\"text-[13px] font-normal ml-1.5\" style={{ color: 'var(--t-text-muted)' }}>\n ({(parseFloat(quote.fees.networkFee) / parseFloat(quote.exchangeRate)).toFixed(8)} {quote.cryptoCurrency})\n </span>\n )}\n </span>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * RampForm\n * Main single-screen form with modal overlays (new NowRamp design).\n * Replaces the old multi-step wizard.\n */\n\nimport { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { RampProvider, useRamp, type RampProviderProps } from '../context/RampContext';\nimport { CheckoutStep } from './CheckoutStep';\nimport { ProcessingStep } from './ProcessingStep';\nimport { CompleteStep } from './CompleteStep';\nimport { ErrorStep } from './ErrorStep';\nimport { ConfirmStep } from './ConfirmStep';\nimport { Modal } from './ui/Modal';\nimport { FormSkeleton } from './ui/Skeleton';\nimport { Toast } from './ui/Toast';\nimport { LoadingScreen } from './form/LoadingScreen';\nimport { BottomSheet } from './ui/BottomSheet';\nimport { FiatCurrencyModal } from './modals/FiatCurrencyModal';\nimport { CryptoCurrencyModal } from './modals/CryptoCurrencyModal';\nimport { PaymentMethodModal } from './modals/PaymentMethodModal';\nimport { SettingsScreen } from './modals/SettingsScreen';\nimport { CountryPickerModal } from './modals/CountryPickerModal';\nimport { LanguagePickerModal } from './modals/LanguagePickerModal';\nimport { COUNTRY_MAP } from '../data/countries';\nimport {\n\tSKINS,\n\tparseAmount,\n\tformatOutput,\n\tisValidHex,\n\tisStablecoin,\n\tMIN_FIAT_AMOUNT,\n\tMIN_CRYPTO_AMOUNT,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\ttype Skin,\n} from '../data/cryptoData';\nimport type { Transaction } from '@nowramp/sdk';\n\n// V2 sub-components\nimport { HeaderBar } from './form/HeaderBar';\nimport { SpendCard } from './form/SpendCard';\nimport { ReceiveCard } from './form/ReceiveCard';\nimport { PaymentCard } from './form/PaymentCard';\nimport { ProviderCard } from './form/ProviderCard';\nimport { ChooseRampModal } from './modals/ChooseRampModal';\nimport { WalletCard } from './form/WalletCard';\nimport { CtaButton } from './form/CtaButton';\nimport { Footer } from './form/Footer';\nimport { RateBreakdown } from './form/RateBreakdown';\nimport { getMethodIcon, getMethodDisplayName } from './PaymentMethodSelector';\nimport { useT, useI18n } from '../i18n';\nimport { I18nProvider, type LanguageCode } from '../i18n';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RampFormProps extends Omit<RampProviderProps, 'children'> {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\t/** Skin preset ID */\n\tskinId?: string;\n\t/** Custom accent color override (hex) */\n\taccentColor?: string;\n\t/** Custom background color override (hex) */\n\tbgColor?: string;\n\t/** Custom background image URL */\n\tbgImage?: string;\n\t/** Custom border color (hex) */\n\tborderColor?: string;\n\t/** Custom border radius (CSS value, e.g. '5px') */\n\tborderRadius?: string;\n\t// Extended theme color overrides\n\t/** Surface/card background color (hex) */\n\tsurfaceColor?: string;\n\t/** Input/pill background color (hex) */\n\tinputBgColor?: string;\n\t/** Primary text color (hex) */\n\ttextColor?: string;\n\t/** Secondary/label text color (hex) */\n\ttextSecondaryColor?: string;\n\t/** Muted text color (hex) */\n\ttextMutedColor?: string;\n\t/** Success/rate indicator color (hex) */\n\tsuccessColor?: string;\n\t/** Show Buy/Sell flow toggle (default: true). Set false to lock to the provided flowType. */\n\tshowFlowToggle?: boolean;\n\t/** Show settings menu icon (default: true). Set false to hide settings entirely. */\n\tshowSettings?: boolean;\n\t/** Show dark mode toggle in settings (default: true). Set false to hide theme switching. */\n\tshowThemeToggle?: boolean;\n\t/** Auto-redirect for redirect checkouts */\n\tautoRedirect?: boolean;\n\t/** Block explorer URL pattern */\n\texplorerUrl?: string;\n\t/** Done button text */\n\tdoneButtonText?: string;\n\t/** Support email */\n\tsupportEmail?: string;\n\t/** Show email field in wallet step */\n\tshowEmail?: boolean;\n\t/** Require email */\n\trequireEmail?: boolean;\n\t/** Show fee-free stablecoin amount (partner absorbs fees) */\n\tstablecoinParity?: boolean;\n\t/** Partner display name for parity info banner */\n\tpartnerName?: string;\n\t/** Explicit container height in px. When set, post-form screens use this as fixed height. Form itself is content-driven with no min-height. */\n\tcontainerHeight?: number;\n\t/** Callback when user clicks done */\n\tonDone?: () => void;\n\t/** Language code for translations (default: 'en') */\n\tlocale?: LanguageCode;\n\tonComplete?: (status: Transaction) => void;\n\tonError?: (error: Error) => void;\n}\n\n// =============================================================================\n// Inner Form\n// =============================================================================\n\ninterface InnerFormProps {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\tskinId?: string;\n\taccentColor?: string;\n\tbgColor?: string;\n\tbgImage?: string;\n\tborderColor?: string;\n\tborderRadius?: string;\n\tsurfaceColor?: string;\n\tinputBgColor?: string;\n\ttextColor?: string;\n\ttextSecondaryColor?: string;\n\ttextMutedColor?: string;\n\tsuccessColor?: string;\n\tshowFlowToggle?: boolean;\n\tshowSettings?: boolean;\n\tshowThemeToggle?: boolean;\n\tautoRedirect?: boolean;\n\texplorerUrl?: string;\n\tdoneButtonText?: string;\n\tsupportEmail?: string;\n\tstablecoinParity?: boolean;\n\tpartnerName?: string;\n\tcontainerHeight?: number;\n\tlocale?: LanguageCode;\n\tonDone?: () => void;\n}\n\ntype ModalType = 'fiat' | 'crypto' | 'payment' | 'provider' | 'settings' | 'country' | 'language' | null;\n\nfunction InnerForm({\n\tclassName = '',\n\ttheme = 'dark',\n\tskinId: skinIdProp = 'mono',\n\taccentColor: accentColorProp,\n\tbgColor: bgColorProp,\n\tbgImage: bgImageProp,\n\tborderColor: borderColorProp,\n\tborderRadius: borderRadiusProp,\n\tsurfaceColor: surfaceColorProp,\n\tinputBgColor: inputBgColorProp,\n\ttextColor: textColorProp,\n\ttextSecondaryColor: textSecondaryColorProp,\n\ttextMutedColor: textMutedColorProp,\n\tsuccessColor: successColorProp,\n\tshowFlowToggle = true,\n\tshowSettings = true,\n\tshowThemeToggle = true,\n\tautoRedirect = false,\n\texplorerUrl,\n\tdoneButtonText,\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tcontainerHeight,\n\tlocale: _locale,\n\tonDone,\n}: InnerFormProps) {\n\tvoid _locale; // consumed by I18nProvider wrapper\n\tconst t = useT();\n\tconst {\n\t\tstate,\n\t\tdispatch,\n\t\tconfig,\n\t\tconfigLoading,\n\t\tquotes,\n\t\tquotesLoading,\n\t\tquotesError,\n\t\tfetchQuotes,\n\t\tcreateOrder,\n\t\torderLoading,\n\t\tamountError,\n\t\tfieldLocks,\n\t\tapiConfig,\n\t\tassetBaseUrl,\n\t\tavailableFiats,\n\t\tavailableCryptos,\n\t\tavailablePaymentMethods,\n\t\tselectionUnsupported,\n\t\tquotesEmpty,\n\t\tbestUnavailableReason,\n\t} = useRamp();\n\n\tconst { locale: currentLocale, setLocale } = useI18n();\n\n\t// Local UI state\n\tconst [darkMode, setDarkMode] = useState(theme === 'dark');\n\tconst [skinId, setSkinId] = useState(skinIdProp);\n\tconst [modal, setModal] = useState<ModalType>(null);\n\tconst [amountTouched, setAmountTouched] = useState(false);\n\tconst [walletTouched, setWalletTouched] = useState(false);\n\tconst [walletFocused, setWalletFocused] = useState(false);\n\tconst [walletValidating, setWalletValidating] = useState(false);\n\tconst [walletServerValid, setWalletServerValid] = useState<boolean | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst [switching, setSwitching] = useState(false);\n\tconst [autoSelectPending, setAutoSelectPending] = useState(false);\n\tconst [manualProvider, setManualProvider] = useState(false);\n\n\t// V2 state\n\tconst [toast, setToast] = useState<{ type: 'success' | 'error'; title: string; desc?: string } | null>(null);\n\tconst [rateBreakdownOpen, setRateBreakdownOpen] = useState(false);\n\tconst [rateCountdown, setRateCountdown] = useState(30);\n\tconst [rateFlash, setRateFlash] = useState(false);\n\tconst [amountShake, setAmountShake] = useState(false);\n\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst walletValidationTimer = useRef<ReturnType<typeof setTimeout>>();\n\tconst prevTabRef = useRef(state.flowType);\n\n\tconst postFormHeight = containerHeight ?? 640;\n\n\t// Reset manual provider override when new quotes arrive (inputs changed)\n\tconst prevQuotesRef = useRef(quotes);\n\tuseEffect(() => {\n\t\tif (quotes && quotes !== prevQuotesRef.current) {\n\t\t\tsetManualProvider(false);\n\t\t}\n\t\tprevQuotesRef.current = quotes;\n\t}, [quotes]);\n\n\t// Auto-select best quote into state when quotes arrive (unless user manually picked a provider)\n\tuseEffect(() => {\n\t\tif (manualProvider || autoSelectPending) return;\n\t\tif (quotes?.bestQuote) {\n\t\t\tdispatch({ type: 'SELECT_QUOTE', quote: quotes.bestQuote });\n\t\t}\n\t}, [quotes?.bestQuote, manualProvider, autoSelectPending, dispatch]);\n\n\t// Sync darkMode with theme prop\n\tuseEffect(() => {\n\t\tsetDarkMode(theme === 'dark');\n\t}, [theme]);\n\n\t// Initial load animation\n\tuseEffect(() => {\n\t\tconst t = setTimeout(() => setLoading(false), configLoading ? 0 : 800);\n\t\treturn () => clearTimeout(t);\n\t}, [configLoading]);\n\n\t// Tab switching animation\n\tuseEffect(() => {\n\t\tif (prevTabRef.current !== state.flowType && !loading) {\n\t\t\tprevTabRef.current = state.flowType;\n\t\t\tsetSwitching(true);\n\t\t\tsetAmountTouched(false);\n\t\t\tsetWalletTouched(false);\n\t\t\tconst t = setTimeout(() => setSwitching(false), 350);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t\tprevTabRef.current = state.flowType;\n\t}, [state.flowType, loading]);\n\n\tconst tab = state.flowType;\n\tconst isBuy = tab === 'buy';\n\n\t// Compute display values from real quotes only\n\tconst cryptoCode = state.cryptoCurrency || 'BTC';\n\tconst fiatCode = state.fiatCurrency || 'USD';\n\tconst spendAmount = isBuy ? state.fiatAmount : state.cryptoAmount;\n\tconst spendNumeric = parseAmount(spendAmount);\n\n\tconst activeQuote = state.selectedQuote || quotes?.bestQuote || null;\n\n\tconst quoteRate = activeQuote?.exchangeRate\n\t\t? parseFloat(activeQuote.exchangeRate)\n\t\t: null;\n\n\t// Persist last known rate so it stays visible between quote fetches\n\tconst lastRateRef = useRef<{ rate: number; crypto: string; fiat: string } | null>(null);\n\tif (quoteRate && cryptoCode && fiatCode) {\n\t\tlastRateRef.current = { rate: quoteRate, crypto: cryptoCode, fiat: fiatCode };\n\t}\n\n\t// Clear stale rate when no providers can quote\n\tuseEffect(() => {\n\t\tif (quotesEmpty || quotesError) {\n\t\t\tlastRateRef.current = null;\n\t\t}\n\t}, [quotesEmpty, quotesError]);\n\n\tconst receiveAmount = useMemo(() => {\n\t\tif (activeQuote) {\n\t\t\tconst amt = isBuy ? activeQuote.cryptoAmount : activeQuote.fiatAmount;\n\t\t\tif (amt) return amt;\n\t\t}\n\t\treturn '0';\n\t}, [activeQuote, isBuy]);\n\n\t// Rate flash when receive amount changes\n\tconst prevReceiveRef = useRef(receiveAmount);\n\tuseEffect(() => {\n\t\tif (receiveAmount !== prevReceiveRef.current && receiveAmount !== '0' && prevReceiveRef.current !== '0') {\n\t\t\tsetRateFlash(true);\n\t\t\tconst t = setTimeout(() => setRateFlash(false), 500);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t\tprevReceiveRef.current = receiveAmount;\n\t}, [receiveAmount]);\n\n\t// Stablecoin parity: partner absorbs fees, credits user full amount\n\t// Same-peg (crypto code contains fiat code) → 1:1 fiat amount.\n\t// Cross-currency → FX-convert via quote rate.\n\tconst parityActive = !!(stablecoinParity && partnerName && isBuy && isStablecoin(cryptoCode) && quoteRate);\n\tconst isSamePeg = parityActive && cryptoCode.toUpperCase().includes(fiatCode.toUpperCase());\n\tconst parityAmount = parityActive && spendNumeric > 0\n\t\t? formatOutput(isSamePeg ? spendNumeric : spendNumeric / quoteRate)\n\t\t: null;\n\tconst displayReceiveAmount = parityActive && parityAmount ? parityAmount : receiveAmount;\n\n\tconst displayRate = useMemo(() => {\n\t\tconst r = quoteRate || lastRateRef.current?.rate;\n\t\tconst cc = quoteRate ? cryptoCode : lastRateRef.current?.crypto;\n\t\tconst fc = quoteRate ? fiatCode : lastRateRef.current?.fiat;\n\t\tif (!r || !cc || !fc) return '';\n\t\treturn `1 ${cc} ≈ ${r.toFixed(2)} ${fc}`;\n\t}, [cryptoCode, fiatCode, quoteRate]);\n\n\t// Server-side wallet address validation (debounced with AbortController)\n\tuseEffect(() => {\n\t\tconst addr = state.walletAddress.trim();\n\t\tconst network = state.network;\n\n\t\t// Reset when empty\n\t\tif (!addr || addr.length < 10) {\n\t\t\tsetWalletServerValid(null);\n\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\treturn;\n\t\t}\n\n\t\tsetWalletValidating(true);\n\t\tsetWalletServerValid(null);\n\n\t\tconst abortController = new AbortController();\n\n\t\tclearTimeout(walletValidationTimer.current);\n\t\twalletValidationTimer.current = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${apiConfig.apiUrl}/public/validate/address`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ address: addr, ...(network ? { network } : {}) }),\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t});\n\t\t\t\tconst data = await res.json();\n\t\t\t\tconst result = data.data?.attributes || data.data || data;\n\t\t\t\tif (result.isValid) {\n\t\t\t\t\tsetWalletServerValid(true);\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\t\t} else {\n\t\t\t\t\tsetWalletServerValid(false);\n\t\t\t\t\tconst msg = result.errors?.[0] || result.details?.formatMessage || t('wallet.invalidServer');\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: msg });\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// Ignore aborted requests; network errors don't block the user\n\t\t\t\tif (err instanceof DOMException && err.name === 'AbortError') return;\n\t\t\t\tsetWalletServerValid(null);\n\t\t\t} finally {\n\t\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\t\tsetWalletValidating(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 500);\n\n\t\treturn () => {\n\t\t\tclearTimeout(walletValidationTimer.current);\n\t\t\tabortController.abort();\n\t\t};\n\t}, [state.walletAddress, state.network, apiConfig.apiUrl]);\n\n\t// Validation — use server-provided limits (amountError) as source of truth, fall back to hardcoded\n\tconst amountIsEmpty = !spendAmount || spendNumeric === 0;\n\tconst amountBelowMin = spendNumeric > 0 && (isBuy ? spendNumeric < MIN_FIAT_AMOUNT : spendNumeric < MIN_CRYPTO_AMOUNT);\n\tconst hasAmountError = !!amountError || amountBelowMin || (amountTouched && amountIsEmpty);\n\tconst isAmountValid = spendNumeric > 0 && !amountError && !amountBelowMin;\n\tconst isWalletValid = state.walletAddress.trim().length >= 10 && walletServerValid !== false && !walletValidating;\n\tconst isFormValid = isAmountValid && (isBuy ? isWalletValid : true) && !!state.cryptoCurrency && !!state.network;\n\n\tconst handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tlet raw = e.target.value.replace(/[^0-9.,]/g, '');\n\t\t// Limit decimal places: 2 for fiat, 6 for crypto\n\t\tconst maxDecimals = isBuy ? 2 : 6;\n\t\tconst dotIndex = raw.indexOf('.');\n\t\tif (dotIndex !== -1 && raw.length - dotIndex - 1 > maxDecimals) {\n\t\t\traw = raw.slice(0, dotIndex + maxDecimals + 1);\n\t\t}\n\t\tif (isBuy) {\n\t\t\tdispatch({ type: 'SET_FIAT_AMOUNT', amount: raw });\n\t\t} else {\n\t\t\tdispatch({ type: 'SET_CRYPTO_AMOUNT', amount: raw });\n\t\t}\n\t};\n\n\tconst handleTabSwitch = (newTab: 'buy' | 'sell') => {\n\t\tif (newTab === tab) return;\n\t\tdispatch({ type: 'SET_FLOW_TYPE', flowType: newTab, fieldLocks });\n\t};\n\n\tconst handleFiatSelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_FIAT_CURRENCY', currency: code });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCryptoSelect = useCallback(\n\t\t(code: string, chain: string) => {\n\t\t\tdispatch({ type: 'SET_CRYPTO_CURRENCY', currency: code });\n\t\t\tdispatch({ type: 'SET_CRYPTO_CHAIN', chain });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handlePaymentMethodSelect = useCallback(\n\t\t(methodId: string) => {\n\t\t\tdispatch({ type: 'SET_PAYMENT_METHOD', methodId });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCountrySelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_COUNTRY', country: code });\n\t\t\tsetModal(null);\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleLocationPress = useCallback(() => {\n\t\t// Close settings, then open country picker after animation completes\n\t\tsetModal(null);\n\t\tsetTimeout(() => setModal('country'), 280);\n\t}, []);\n\n\tconst handleLanguagePress = useCallback(() => {\n\t\t// Close settings, then open language picker after animation completes\n\t\tsetModal(null);\n\t\tsetTimeout(() => setModal('language'), 280);\n\t}, []);\n\n\tconst countryName = state.country ? COUNTRY_MAP[state.country.toLowerCase()]?.name : undefined;\n\n\tconst handleCtaClick = () => {\n\t\tif (!isFormValid) {\n\t\t\tif (hasAmountError || amountIsEmpty) {\n\t\t\t\tsetAmountTouched(true);\n\t\t\t\tsetAmountShake(true);\n\t\t\t\tsetTimeout(() => setAmountShake(false), 400);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t// If a provider quote is already selected, go straight to order creation\n\t\tif (state.selectedQuote) {\n\t\t\tcreateOrder().catch((err) => {\n\t\t\t\tsetToast({ type: 'error', title: t('toast.orderFailed'), desc: err instanceof Error ? err.message : t('toast.couldNotCreate') });\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsetAutoSelectPending(true);\n\t\tfetchQuotes();\n\t};\n\n\t// Auto-select best quote when quotes arrive after CTA click\n\tuseEffect(() => {\n\t\tif (!autoSelectPending || quotesLoading) return;\n\n\t\tif (quotes?.bestQuote) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tdispatch({ type: 'SELECT_QUOTE', quote: quotes.bestQuote });\n\t\t\tcreateOrder().catch((err) => {\n\t\t\t\tsetToast({ type: 'error', title: t('toast.orderFailed'), desc: err instanceof Error ? err.message : t('toast.couldNotCreate') });\n\t\t\t});\n\t\t} else if (quotesError) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tconst msg = quotesError.message || t('error.noProviders');\n\t\t\tdispatch({ type: 'SET_ERROR', message: msg });\n\t\t\tsetToast({ type: 'error', title: t('toast.quoteError'), desc: msg });\n\t\t} else if (quotes && !quotes.bestQuote) {\n\t\t\t// Quotes loaded successfully but no providers available\n\t\t\tsetAutoSelectPending(false);\n\t\t\tconst reasons = (quotes as any).unavailableGateways\n\t\t\t\t?.map((g: any) => g.reason)\n\t\t\t\t.filter(Boolean);\n\t\t\tconst message = reasons?.length\n\t\t\t\t? `${t('error.noProviders')}: ${reasons.join('; ')}`\n\t\t\t\t: t('error.noProviders');\n\t\t\tdispatch({ type: 'SET_ERROR', message });\n\t\t\tsetToast({ type: 'error', title: t('toast.noProviders'), desc: message });\n\t\t}\n\t}, [autoSelectPending, quotes, quotesLoading, quotesError, dispatch, createOrder]);\n\n\t// ─── Toast on step transitions ───\n\tconst prevStepRef = useRef(state.step);\n\tuseEffect(() => {\n\t\tconst prev = prevStepRef.current;\n\t\tprevStepRef.current = state.step;\n\t\tif (prev === state.step) return;\n\t\tif (state.step === 'checkout') {\n\t\t\tsetToast({ type: 'success', title: t('toast.orderCreated'), desc: t('toast.redirecting') });\n\t\t} else if (state.step === 'error' && state.errorMessage) {\n\t\t\tsetToast({ type: 'error', title: t('toast.somethingWrong'), desc: state.errorMessage });\n\t\t}\n\t}, [state.step, state.errorMessage]);\n\n\t// ─── Rate countdown orchestration ───\n\tconst isFormStep = state.step === 'amount';\n\n\t// Force-close sheet on step change\n\tuseEffect(() => {\n\t\tif (!isFormStep) setRateBreakdownOpen(false);\n\t}, [isFormStep]);\n\n\t// Timer lives in InnerForm — RateBreakdown is pure presentational\n\tuseEffect(() => {\n\t\tif (!rateBreakdownOpen || !isFormStep) return;\n\t\tsetRateCountdown(30);\n\t\tconst id = setInterval(() => {\n\t\t\tsetRateCountdown(prev => {\n\t\t\t\tif (prev <= 1) { fetchQuotes(); return 30; }\n\t\t\t\treturn prev - 1;\n\t\t\t});\n\t\t}, 1000);\n\t\treturn () => clearInterval(id);\n\t}, [rateBreakdownOpen, isFormStep, fetchQuotes]);\n\n\t// Reset countdown when fresh quotes arrive\n\tuseEffect(() => {\n\t\tif (rateBreakdownOpen && isFormStep && !quotesLoading) setRateCountdown(30);\n\t}, [quotesLoading, rateBreakdownOpen, isFormStep]);\n\n\t// Theme computation\n\tconst themeClass = darkMode ? 'theme-dark' : 'theme-light';\n\tconst activeSkin = SKINS.find((s: Skin) => s.id === skinId) || SKINS[0];\n\tconst isMono = activeSkin.accent === null;\n\n\tconst hasCustomAccent = accentColorProp ? isValidHex(accentColorProp) : false;\n\n\t// Auto-detect best text color for CTA based on accent luminance\n\tconst getCtaTextColor = (hex: string): string => {\n\t\tconst c = hex.replace('#', '');\n\t\tconst r = parseInt(c.substring(0, 2), 16);\n\t\tconst g = parseInt(c.substring(2, 4), 16);\n\t\tconst b = parseInt(c.substring(4, 6), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#000000' : '#ffffff';\n\t};\n\n\tconst accentStyle: Record<string, string> = hasCustomAccent\n\t\t? { '--t-accent': accentColorProp!, '--t-cta-bg': accentColorProp!, '--t-cta-text': getCtaTextColor(accentColorProp!) }\n\t\t: isMono\n\t\t\t? {\n\t\t\t\t\t'--t-accent': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-bg': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-text': darkMode ? '#000000' : '#ffffff',\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t'--t-accent': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-bg': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-text': getCtaTextColor(activeSkin.accent!),\n\t\t\t\t};\n\n\t// Extended theme overrides\n\tconst themeOverrides: Record<string, string> = {};\n\tif (surfaceColorProp && isValidHex(surfaceColorProp)) {\n\t\tthemeOverrides['--t-surface'] = surfaceColorProp;\n\t\tthemeOverrides['--t-modal-bg'] = surfaceColorProp;\n\t}\n\tif (inputBgColorProp && isValidHex(inputBgColorProp)) {\n\t\tthemeOverrides['--t-pill-bg'] = inputBgColorProp;\n\t\tthemeOverrides['--t-close-bg'] = inputBgColorProp;\n\t}\n\tif (textColorProp && isValidHex(textColorProp)) {\n\t\tthemeOverrides['--t-text'] = textColorProp;\n\t}\n\tif (textSecondaryColorProp && isValidHex(textSecondaryColorProp)) {\n\t\tthemeOverrides['--t-text-secondary'] = textSecondaryColorProp;\n\t}\n\tif (textMutedColorProp && isValidHex(textMutedColorProp)) {\n\t\tthemeOverrides['--t-text-muted'] = textMutedColorProp;\n\t\tthemeOverrides['--t-text-tertiary'] = textMutedColorProp;\n\t}\n\tif (successColorProp && isValidHex(successColorProp)) {\n\t\tthemeOverrides['--t-success'] = successColorProp;\n\t}\n\n\tconst backgroundStyle: Record<string, string> = {};\n\tif (bgColorProp && isValidHex(bgColorProp)) {\n\t\tbackgroundStyle.backgroundColor = bgColorProp;\n\t} else {\n\t\tbackgroundStyle.backgroundColor = 'var(--t-bg)';\n\t}\n\tif (bgImageProp && (bgImageProp.startsWith('https://') || bgImageProp.startsWith('data:image/'))) {\n\t\tbackgroundStyle.backgroundImage = `url(${bgImageProp})`;\n\t\tbackgroundStyle.backgroundSize = 'cover';\n\t\tbackgroundStyle.backgroundPosition = 'center';\n\t}\n\n\tconst borderStyle: Record<string, string> = {};\n\tif (borderColorProp && isValidHex(borderColorProp)) {\n\t\tborderStyle.border = `1px solid ${borderColorProp}`;\n\t}\n\tif (borderRadiusProp) {\n\t\tborderStyle.borderRadius = borderRadiusProp;\n\t}\n\n\t// Chain info for display\n\tconst chainCode = state.network;\n\tconst chainInfo = chainCode ? getChainInfo(chainCode) : null;\n\tconst chainDisplay = chainInfo?.shortName || chainInfo?.name || chainCode;\n\n\t// Amount error message — API errors show immediately, local validation waits for blur\n\tconst amountErrorMessage = amountError\n\t\t? amountError\n\t\t: (amountTouched && (amountBelowMin || amountIsEmpty))\n\t\t\t? (amountIsEmpty\n\t\t\t\t? t('error.amountZero')\n\t\t\t\t: isBuy\n\t\t\t\t\t? t('error.minAmountFiat', { min: String(MIN_FIAT_AMOUNT), currency: fiatCode })\n\t\t\t\t\t: t('error.minAmountCrypto', { min: String(MIN_CRYPTO_AMOUNT), currency: cryptoCode }))\n\t\t\t: undefined;\n\n\t// Wallet error message\n\tconst walletErrorMessage = state.walletError\n\t\t? state.walletError\n\t\t: (walletTouched && !isWalletValid && !walletValidating)\n\t\t\t? t('wallet.invalid')\n\t\t\t: undefined;\n\n\t// Selected payment method\n\tconst filteredPaymentMethods = availablePaymentMethods.filter(m => m.supportedFiats.includes(state.fiatCurrency));\n\tconst selectedPaymentMethod = filteredPaymentMethods.find(m => m.id === state.paymentMethodId) || filteredPaymentMethods[0];\n\n\t// If we're in a post-form step, render inside the same themed container\n\tconst postFormStep =\n\t\tstate.step === 'checkout' ? <CheckoutStep autoRedirect={autoRedirect} /> :\n\t\tstate.step === 'processing' ? <ProcessingStep /> :\n\t\tstate.step === 'complete' ? <CompleteStep explorerUrl={explorerUrl} doneButtonText={doneButtonText} onDone={onDone} /> :\n\t\tstate.step === 'error' ? <ErrorStep supportEmail={supportEmail} onDone={onDone} doneButtonText={doneButtonText} /> :\n\t\tstate.step === 'confirm' ? <ConfirmStep stablecoinParity={parityActive} partnerName={partnerName} /> :\n\t\tnull;\n\n\tif (postFormStep) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] overflow-hidden flex flex-col select-none transition-colors duration-[400ms] ${className}`}\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\t\theight: postFormHeight,\n\t\t\t\t\tborderRadius: 'var(--t-container-radius)',\n\t\t\t\t\t...backgroundStyle,\n\t\t\t\t\t...accentStyle,\n\t\t\t\t\t...themeOverrides,\n\t\t\t\t\t...borderStyle,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{postFormStep}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] overflow-hidden flex flex-col select-none transition-colors duration-[400ms] ${className}`}\n\t\t\tstyle={{\n\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\tminHeight: 640,\n\t\t\t\tborderRadius: 'var(--t-container-radius)',\n\t\t\t\t...backgroundStyle,\n\t\t\t\t...accentStyle,\n\t\t\t\t...themeOverrides,\n\t\t\t\t...borderStyle,\n\t\t\t}}\n\t\t>\n\t\t\t{/* V2 Header */}\n\t\t\t<HeaderBar\n\t\t\t\ttab={tab}\n\t\t\t\tonTabSwitch={handleTabSwitch}\n\t\t\t\tshowFlowToggle={showFlowToggle}\n\t\t\t\tshowSettings={showSettings}\n\t\t\t\tonOpenSettings={() => setModal('settings')}\n\t\t\t\tdarkMode={darkMode}\n\t\t\t/>\n\n\t\t\t{/* Form body */}\n\t\t\t{loading || switching || configLoading ? (\n\t\t\t\t<div className=\"pt-[88px] px-3 flex-1 flex flex-col\">\n\t\t\t\t\t{configLoading ? <FormSkeleton /> : <LoadingScreen />}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div key={tab} className=\"flex-1 overflow-hidden pt-[88px] px-3 flex flex-col gap-1 tab-fade-in\">\n\t\t\t\t\t<SpendCard\n\t\t\t\t\t\tamount={spendAmount}\n\t\t\t\t\t\tonAmountChange={handleAmountChange}\n\t\t\t\t\t\tcurrencyCode={isBuy ? fiatCode : cryptoCode}\n\t\t\t\t\t\tisBuy={isBuy}\n\t\t\t\t\t\tonOpenModal={() => setModal(isBuy ? 'fiat' : 'crypto')}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\terror={amountErrorMessage}\n\t\t\t\t\t\tfieldLocks={fieldLocks}\n\t\t\t\t\t\tonBlur={() => setAmountTouched(true)}\n\t\t\t\t\t\tinputRef={inputRef}\n\t\t\t\t\t\tchainCode={!isBuy ? chainCode : undefined}\n\t\t\t\t\t\tchainDisplay={!isBuy ? chainDisplay : undefined}\n\t\t\t\t\t\tgetChainIconUrl={!isBuy ? getChainIconUrl : undefined}\n\t\t\t\t\t\tshaking={amountShake}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ReceiveCard\n\t\t\t\t\t\tamount={displayReceiveAmount}\n\t\t\t\t\t\tcurrencyCode={isBuy ? cryptoCode : fiatCode}\n\t\t\t\t\t\tchainCode={isBuy ? chainCode : undefined}\n\t\t\t\t\t\tchainDisplay={isBuy ? chainDisplay : undefined}\n\t\t\t\t\t\tisBuy={isBuy}\n\t\t\t\t\t\tonOpenModal={() => setModal(isBuy ? 'crypto' : 'fiat')}\n\t\t\t\t\t\tdisplayRate={displayRate}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t\t\tonOpenRateBreakdown={() => setRateBreakdownOpen(true)}\n\t\t\t\t\t\tfieldLocks={fieldLocks}\n\t\t\t\t\t\tspendNumeric={spendNumeric}\n\t\t\t\t\t\tgetChainIconUrl={isBuy ? getChainIconUrl : undefined}\n\t\t\t\t\t\tautoSelectPending={autoSelectPending}\n\t\t\t\t\t\trateFlash={rateFlash}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* No-quote inline warning */}\n\t\t\t\t\t{quotesEmpty && spendNumeric > 0 && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"px-4 py-2.5 mt-1\"\n\t\t\t\t\t\t\tstyle={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius)', fontSize: 12, color: 'var(--t-error)', lineHeight: '16px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{bestUnavailableReason || t('error.noProviders')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Parity info banner */}\n\t\t\t\t\t{parityActive && spendNumeric > 0 && quotes?.bestQuote && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-start gap-2 mt-1 px-4 py-2.5\"\n\t\t\t\t\t\t\tstyle={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius)', fontSize: 12, color: 'var(--t-text-secondary)', lineHeight: '16px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0, marginTop: 1 }}>\n\t\t\t\t\t\t\t\t<circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n\t\t\t\t\t\t\t\t<path d=\"M8 7v4M8 5.5v-.01\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{t('parity.info', { receiveAmount, crypto: cryptoCode, spendAmount: formatOutput(spendNumeric), fiat: fiatCode, partner: partnerName || '' })}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Provider selector */}\n\t\t\t\t\t{(quotes || quotesLoading) && (\n\t\t\t\t\t\t<ProviderCard\n\t\t\t\t\t\t\tselectedQuote={state.selectedQuote}\n\t\t\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t\t\t\tonOpenModal={() => setModal('provider')}\n\t\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Payment method */}\n\t\t\t\t\t{(availablePaymentMethods.length > 0 || (config?.paymentMethods && config.paymentMethods.length > 0)) && (\n\t\t\t\t\t\tfilteredPaymentMethods.length > 0 ? (\n\t\t\t\t\t\t\t<PaymentCard\n\t\t\t\t\t\t\t\tselectedMethod={selectedPaymentMethod}\n\t\t\t\t\t\t\t\tonOpenModal={() => setModal('payment')}\n\t\t\t\t\t\t\t\tdarkMode={darkMode}\n\t\t\t\t\t\t\t\tgetMethodIcon={getMethodIcon}\n\t\t\t\t\t\t\t\tgetMethodDisplayName={(id, name) => getMethodDisplayName(id, name, t, true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center px-4 mt-1\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--t-card-radius)',\n\t\t\t\t\t\t\t\t\theight: 56,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t{t('payment.noneAvailable')}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Wallet address — only for buy (offramp collects via provider checkout) */}\n\t\t\t\t\t{isBuy && (\n\t\t\t\t\t\t<WalletCard\n\t\t\t\t\t\t\taddress={state.walletAddress}\n\t\t\t\t\t\t\tonChange={(v) => dispatch({ type: 'SET_WALLET_ADDRESS', address: v })}\n\t\t\t\t\t\t\tplaceholder={t('wallet.placeholderBuy')}\n\t\t\t\t\t\t\tisBuy={isBuy}\n\t\t\t\t\t\t\terror={walletErrorMessage}\n\t\t\t\t\t\t\tvalidating={walletValidating}\n\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationAddress?.locked}\n\t\t\t\t\t\t\tonFocus={() => setWalletFocused(true)}\n\t\t\t\t\t\t\tonBlur={() => { setWalletFocused(false); setWalletTouched(true); }}\n\t\t\t\t\t\t\tfocused={walletFocused}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"flex-1\" style={{ minHeight: 16 }} />\n\n\t\t\t\t\t{/* Unsupported selection message */}\n\t\t\t\t\t{selectionUnsupported && (\n\t\t\t\t\t\t<div className=\"text-[12px] text-center mb-2\" style={{ color: 'var(--t-error)' }}>\n\t\t\t\t\t\t\t{isBuy ? t('error.currencyUnavailableBuy') : t('error.currencyUnavailableSell')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* CTA + Footer */}\n\t\t\t\t\t<div className=\"flex flex-col gap-3 pb-3\">\n\t\t\t\t\t\t<CtaButton\n\t\t\t\t\t\t\tlabel={isBuy\n\t\t\t\t\t\t\t\t? t('cta.buy', { crypto: cryptoCode })\n\t\t\t\t\t\t\t\t: t('cta.sell', { crypto: cryptoCode })}\n\t\t\t\t\t\t\tdisabled={!isFormValid || orderLoading || autoSelectPending || selectionUnsupported || quotesEmpty}\n\t\t\t\t\t\t\tloading={orderLoading || autoSelectPending}\n\t\t\t\t\t\t\tonClick={handleCtaClick}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Footer />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Toast */}\n\t\t\t{toast && (\n\t\t\t\t<Toast\n\t\t\t\t\ttype={toast.type}\n\t\t\t\t\ttitle={toast.title}\n\t\t\t\t\tdescription={toast.desc}\n\t\t\t\t\tvisible={!!toast}\n\t\t\t\t\tonDismiss={() => setToast(null)}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/* Rate breakdown bottom sheet */}\n\t\t\t<BottomSheet isOpen={rateBreakdownOpen} onClose={() => setRateBreakdownOpen(false)}>\n\t\t\t\t<RateBreakdown\n\t\t\t\t\tquote={activeQuote}\n\t\t\t\t\tisOpen={rateBreakdownOpen}\n\t\t\t\t\tonClose={() => setRateBreakdownOpen(false)}\n\t\t\t\t\tcountdown={rateCountdown}\n\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t/>\n\t\t\t</BottomSheet>\n\n\t\t\t{/* Modal overlays */}\n\t\t\t<Modal isOpen={modal === 'fiat'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<FiatCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(v) => {\n\t\t\t\t\t\t\thandleFiatSelect(v);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcurrencies={availableFiats.map((f) => ({ code: f.code, name: f.code }))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.fiatCurrency}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'crypto'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CryptoCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code, chain) => {\n\t\t\t\t\t\t\thandleCryptoSelect(code, chain);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcryptos={availableCryptos.map((c) => ({\n\t\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\t\tname: c.code,\n\t\t\t\t\t\t\tnetworks: c.networks?.map((n) => ({ code: n.id, name: n.name })),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.cryptoCurrency}\n\t\t\t\t\t\tselectedChain={state.network}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'payment'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<PaymentMethodModal\n\t\t\t\t\t\tmethods={availablePaymentMethods}\n\t\t\t\t\t\tselectedId={state.paymentMethodId}\n\t\t\t\t\t\tonSelect={(id) => {\n\t\t\t\t\t\t\thandlePaymentMethodSelect(id);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'provider'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<ChooseRampModal\n\t\t\t\t\t\tquotes={quotes}\n\t\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t\t\tcryptoCurrency={cryptoCode}\n\t\t\t\t\t\tselectedGatewayId={state.selectedProvider}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tonSelect={(quote) => {\n\t\t\t\t\t\t\tsetManualProvider(true);\n\t\t\t\t\t\t\tdispatch({ type: 'SELECT_QUOTE', quote });\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'settings'} onClose={() => setModal(null)} variant=\"right\">\n\t\t\t\t{(close) => (\n\t\t\t\t\t<SettingsScreen\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tdarkMode={darkMode}\n\t\t\t\t\t\tonToggleDarkMode={setDarkMode}\n\t\t\t\t\t\tskinId={skinId}\n\t\t\t\t\t\tonSelectSkin={(id) => {\n\t\t\t\t\t\t\tsetSkinId(id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\t\t\tcountry={state.country}\n\t\t\t\t\t\tcountryName={countryName}\n\t\t\t\t\t\tonLocationPress={handleLocationPress}\n\t\t\t\t\t\tonLanguagePress={handleLanguagePress}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'country'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CountryPickerModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code) => {\n\t\t\t\t\t\t\thandleCountrySelect(code);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.country}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'language'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<LanguagePickerModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code) => {\n\t\t\t\t\t\t\tsetLocale(code);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tselectedCode={currentLocale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t</div>\n\t);\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport function RampForm({\n\tprojectId,\n\tapiUrl,\n\tassetBaseUrl,\n\tflowType,\n\tcustomerId,\n\tbrandId,\n\tdefaultFiatCurrency,\n\tdefaultCryptoCurrency,\n\tdefaultNetwork,\n\tdefaultFiatAmount,\n\tdefaultCryptoAmount,\n\tdefaultWalletAddress,\n\tdefaultGateway,\n\tdefaultCountry,\n\tfieldLocks,\n\tpartnerMetadata,\n\tstatusPollInterval,\n\tonComplete,\n\tonError,\n\tclassName,\n\ttheme,\n\tskinId,\n\taccentColor,\n\tbgColor,\n\tbgImage,\n\tborderColor,\n\tborderRadius,\n\tsurfaceColor,\n\tinputBgColor,\n\ttextColor,\n\ttextSecondaryColor,\n\ttextMutedColor,\n\tsuccessColor,\n\tshowFlowToggle,\n\tshowSettings,\n\tshowThemeToggle,\n\tautoRedirect,\n\texplorerUrl,\n\tdoneButtonText,\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tcontainerHeight,\n\tlocale,\n\tonDone,\n}: RampFormProps) {\n\treturn (\n\t\t<RampProvider\n\t\t\tprojectId={projectId}\n\t\t\tapiUrl={apiUrl}\n\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\tflowType={flowType}\n\t\t\tcustomerId={customerId}\n\t\t\tbrandId={brandId}\n\t\t\tdefaultFiatCurrency={defaultFiatCurrency}\n\t\t\tdefaultCryptoCurrency={defaultCryptoCurrency}\n\t\t\tdefaultNetwork={defaultNetwork}\n\t\t\tdefaultFiatAmount={defaultFiatAmount}\n\t\t\tdefaultCryptoAmount={defaultCryptoAmount}\n\t\t\tdefaultWalletAddress={defaultWalletAddress}\n\t\t\tdefaultGateway={defaultGateway}\n\t\t\tdefaultCountry={defaultCountry}\n\t\t\tfieldLocks={fieldLocks}\n\t\t\tpartnerMetadata={partnerMetadata}\n\t\t\tstatusPollInterval={statusPollInterval}\n\t\t\tonComplete={onComplete}\n\t\t\tonError={onError}\n\t\t>\n\t\t\t<I18nProvider defaultLocale={locale || 'en'}>\n\t\t\t\t<InnerForm\n\t\t\t\t\tclassName={className}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t\tskinId={skinId}\n\t\t\t\t\taccentColor={accentColor}\n\t\t\t\t\tbgColor={bgColor}\n\t\t\t\t\tbgImage={bgImage}\n\t\t\t\t\tborderColor={borderColor}\n\t\t\t\t\tborderRadius={borderRadius}\n\t\t\t\t\tsurfaceColor={surfaceColor}\n\t\t\t\t\tinputBgColor={inputBgColor}\n\t\t\t\t\ttextColor={textColor}\n\t\t\t\t\ttextSecondaryColor={textSecondaryColor}\n\t\t\t\t\ttextMutedColor={textMutedColor}\n\t\t\t\t\tsuccessColor={successColor}\n\t\t\t\t\tshowFlowToggle={showFlowToggle}\n\t\t\t\t\tshowSettings={showSettings}\n\t\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\t\tautoRedirect={autoRedirect}\n\t\t\t\t\texplorerUrl={explorerUrl}\n\t\t\t\t\tdoneButtonText={doneButtonText}\n\t\t\t\t\tsupportEmail={supportEmail}\n\t\t\t\t\tstablecoinParity={stablecoinParity}\n\t\t\t\t\tpartnerName={partnerName}\n\t\t\t\t\tcontainerHeight={containerHeight}\n\t\t\t\t\tonDone={onDone}\n\t\t\t\t/>\n\t\t\t</I18nProvider>\n\t\t</RampProvider>\n\t);\n}\n","/**\n * CheckoutForm Component\n * Single-page checkout form using the same NowRamp design as RampForm.\n * This is the hosted-checkout variant — both components now produce the\n * same visual since the new design is inherently single-page.\n */\n\nimport { RampForm, type RampFormProps } from './RampForm';\n\nexport interface CheckoutFormProps extends RampFormProps {\n /** Submit button text (legacy — maps to nothing in new design, kept for API compat) */\n submitButtonText?: string;\n /** Rate refresh interval in ms (legacy, kept for API compat) */\n rateRefreshInterval?: number;\n}\n\n/**\n * Hosted checkout form.\n * Now uses the same NowRamp design as RampForm.\n */\nexport function CheckoutForm({\n submitButtonText: _submitButtonText,\n rateRefreshInterval: _rateRefreshInterval,\n ...props\n}: CheckoutFormProps) {\n return <RampForm {...props} />;\n}\n","export interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport function SkinSwatch({\n skin,\n active,\n onClick,\n darkMode,\n dimmed,\n}: {\n skin: Skin;\n active: boolean;\n onClick: () => void;\n darkMode: boolean;\n dimmed: boolean;\n}) {\n const isMono = skin.accent === null;\n const size = 32;\n return (\n <button\n onClick={onClick}\n className=\"relative shrink-0\"\n style={{ width: size, height: size, opacity: dimmed ? 0.4 : 1, transition: 'opacity 0.2s' }}\n >\n {isMono ? (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <clipPath id=\"mono-left\"><rect x=\"0\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <clipPath id=\"mono-right\"><rect x=\"16\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#111111\" clipPath=\"url(#mono-left)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#ffffff\" clipPath=\"url(#mono-right)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"none\" stroke={darkMode ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.1)'} strokeWidth=\"1\" />\n </svg>\n ) : (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill={skin.accent!} />\n </svg>\n )}\n {active && !dimmed && (\n <div\n className=\"absolute inset-0 rounded-full\"\n style={{ boxShadow: '0 0 0 2px var(--t-bg), 0 0 0 4px var(--t-text)' }}\n />\n )}\n </button>\n );\n}\n"],"names":["useRampConfig","config","orderType","country","data","setData","useState","loading","setLoading","error","setError","apiRef","useRef","RampApi","fetchConfig","useCallback","supportedParams","result","err","useEffect","useQuotes","params","configKeyRef","configKey","fetchIdRef","id","refetch","useCheckoutIntent","order","setOrder","createOrder","reset","useTransaction","transactionId","options","status","setStatus","fetchStatus","delay","timer","interval","COUNTRIES","COUNTRY_MAP","c","getDefaultFiatForCountry","countryCode","supportedFiats","preferredFiat","PROVIDERS_WILDCARD_COMPAT","providersOverlap","a","b","compat","p","filterAvailableFiats","fiats","networkProviders","f","filterAvailableCryptos","cryptos","fiatProviders","crypto","filteredNetworks","n","filterAvailablePaymentMethods","methods","fiatCurrency","m","reconcileSelections","state","filtered","locks","changed","first","net","compatible","lockedCrypto","target","isSelectionUnsupported","_a","network","_b","fiat","_c","normalizeAmount","value","maxDecimals","dotIndex","isQuotesEmpty","quotesLoading","quotes","quoteParams","pickBestUnavailableReason","gateways","defaultGateway","match","g","scored","idx","reasonScore","reason","r","TERMINAL_STATUSES","initialState","rampReducer","action","_d","_f","_e","_h","_g","RampContext","createContext","RampProvider","props","fiatProvidedRef","projectId","apiUrl","assetBaseUrl","flowType","customerId","brandId","defaultFiatCurrency","defaultCryptoCurrency","defaultNetworkProp","defaultFiatAmount","defaultCryptoAmount","defaultWalletAddress","defaultCountry","fieldLocks","partnerMetadata","statusPollInterval","onComplete","onError","children","apiConfig","useMemo","defaultNetwork","initialIsSell","hasAmount","initialStep","effectiveFiatAmount","dispatch","useReducer","isSell","configLoading","configError","geoAppliedRef","React","detected","defaultCountryAppliedRef","prevCountryRef","geoFallbackAppliedRef","prevFiatRef","currentAmount","minAmount","availableFiats","availableCryptos","availablePaymentMethods","selectionUnsupported","corrections","amountError","amount","min","max","quotesError","fetchQuotes","quotesEmpty","orderLoading","orderError","createOrderApi","CHECKOUT_POLL_INITIAL_DELAY","orderStatus","orderStatusLoading","terminalFiredForRef","effectiveDefaultGateway","bestUnavailableReason","preferred","gatewayRef","quotesRef","brandIdRef","gateway","missing","message","goToStep","step","goBack","stepOrder","currentIndex","canProceed","jsx","useRamp","context","useContext","en","LANGUAGES","I18nContext","loaders","cache","interpolate","template","vars","_","key","val","I18nProvider","defaultLocale","locale","setLocaleState","dict","setDict","loader","mod","setLocale","code","t","useI18n","ctx","useT","RedirectScreen","gatewayName","checkoutUrl","onCancel","redirectCountdown","jsxs","Spinner","size","borderWidth","CheckoutStep","className","autoRedirect","redirectDelay","iframeLoaded","setIframeLoaded","setRedirectCountdown","isExpired","countdownInterval","prev","iframeSrc","allowAttr","createPortal","widgetUrl","buildWidgetUrl","baseUrl","url","ProcessingStep","getStatusMessage","DetailRow","label","mono","CompleteStep","explorerUrl","onDone","doneButtonText","getExplorerUrl","defaultExplorers","handleDone","explorerLink","highlight","ErrorStep","onRetry","supportEmail","getErrorTitle","getErrorMessage","handleRetry","handleStartOver","BLOCKCHAINS","CRYPTO_CURRENCIES","CRYPTO_NAMES","FIAT_TO_COUNTRY","getCryptoIconUrl","ticker","getFiatFlagUrl","currencyCode","getChainInfo","chainCode","getProviderIconUrl","gatewayId","getChainIconUrl","chain","FIAT_CURRENCIES","SKINS","MOCK_RATES","STABLECOINS","isStablecoin","getMockRate","parseAmount","str","formatOutput","num","s","isValidHex","MIN_FIAT_AMOUNT","MIN_CRYPTO_AMOUNT","CRYPTO_CHAIN_COMBOS","list","truncateAddress","address","ConfirmStep","stablecoinParity","partnerName","gatewayInfo","exchangeRate","fiatNumeric","confirmParityActive","confirmSamePeg","confirmParityAmount","handleConfirm","Fragment","Modal","isOpen","onClose","variant","mounted","setMounted","animating","setAnimating","handleClose","onKey","e","closedTransform","Skeleton","w","h","FormSkeleton","LazyIcon","src","alt","background","loaded","setLoaded","currentSrc","handleLoad","handleError","CryptoIcon","FiatFlag","GenericCoinIcon","color","BankIcon","RevolutIcon","ApplePayIcon","GooglePayIcon","PayPalIcon","VisaIcon","MastercardIcon","CardIcon","markW","markH","overlap","CoinifyIcon","ChevronDown","ChevronRight","MenuIcon","onClick","DarkModeIcon","PaymentBankIcon","iconSize","PaymentCardsIcon","PaymentAppleIcon","PaymentGoogleIcon","NRLogoIcon","InfoIcon","MoreDotsIcon","SearchIcon","ArrowUpIcon","CheckmarkIcon","XIcon","getPaymentIcon","type","_theme","Toast","title","description","visible","onDismiss","exiting","setExiting","startExit","bg","NRLogo","width","LoadingScreen","BottomSheet","CloseButton","SearchInput","onChange","placeholder","inline","POPULAR_FIATS","FiatCurrencyModal","onSelect","currencies","selectedCode","search","setSearch","currencyList","staticMap","raw","selected","rest","i","isSelected","POPULAR_CRYPTOS","CryptoImage","style","CryptoCurrencyModal","selectedChain","comboList","networks","cryptoName","terms","chainName","chainShort","name","fields","score","itemSelected","ICON_KEY_MAP","LOCALIZABLE_SHORT_NAMES","BRAND_NAME_MAP","SHORT_NAME_MAP","getMethodDisplayName","fullName","short","compact","brand","getMethodIcon","methodId","icon","iconKey","PaymentMethodSelector","selectedId","onOpenModal","PaymentMethodModal","recommendedId","shortName","ToggleSwitch","checked","accentColor","SETTINGS_LINK_KEYS","cardStyle","SettingsScreen","darkMode","onToggleDarkMode","_skinId","_onSelectSkin","showThemeToggle","countryName","onLocationPress","onLanguagePress","languages","flagError","setFlagError","GlobeIcon","l","item","CountryPickerModal","normalizedCode","CountryFlag","LanguagePickerModal","lang","HeaderBar","tab","onTabSwitch","showFlowToggle","showSettings","onOpenSettings","SpendCard","onAmountChange","isBuy","onBlur","inputRef","chainDisplay","shaking","onFocus","AnimatedDigit","char","height","digits","d","AnimatedNumber","ch","ReceiveCard","displayRate","onOpenRateBreakdown","spendNumeric","autoSelectPending","rateFlash","PaymentCard","selectedMethod","ProviderCard","selectedQuote","BestPriceIcon","RecommendedIcon","QuoteTag","quote","ProviderIcon","gatewayLogo","localSrc","PercentageDiff","pct","sign","LoadingSkeletons","ChooseRampModal","cryptoCurrency","selectedGatewayId","filteredQuotes","q","bestCryptoAmount","isBest","receiveAmount","displayAmount","pctDiff","WalletCard","validating","disabled","focused","showInlineSpinner","setShaking","prevErrorRef","CtaButton","Footer","RateBreakdown","countdown","pad","fiatSymbol","formatFiat","InnerForm","theme","skinIdProp","accentColorProp","bgColorProp","bgImageProp","borderColorProp","borderRadiusProp","surfaceColorProp","inputBgColorProp","textColorProp","textSecondaryColorProp","textMutedColorProp","successColorProp","containerHeight","_locale","currentLocale","setDarkMode","skinId","setSkinId","modal","setModal","amountTouched","setAmountTouched","walletTouched","setWalletTouched","walletFocused","setWalletFocused","walletValidating","setWalletValidating","walletServerValid","setWalletServerValid","switching","setSwitching","setAutoSelectPending","manualProvider","setManualProvider","toast","setToast","rateBreakdownOpen","setRateBreakdownOpen","rateCountdown","setRateCountdown","setRateFlash","amountShake","setAmountShake","walletValidationTimer","prevTabRef","postFormHeight","prevQuotesRef","cryptoCode","fiatCode","spendAmount","activeQuote","quoteRate","lastRateRef","amt","prevReceiveRef","parityActive","isSamePeg","parityAmount","displayReceiveAmount","cc","fc","addr","abortController","msg","amountIsEmpty","amountBelowMin","hasAmountError","isAmountValid","isWalletValid","isFormValid","handleAmountChange","handleTabSwitch","newTab","handleFiatSelect","handleCryptoSelect","handlePaymentMethodSelect","handleCountrySelect","handleLocationPress","handleLanguagePress","handleCtaClick","reasons","prevStepRef","isFormStep","themeClass","activeSkin","isMono","hasCustomAccent","getCtaTextColor","hex","accentStyle","themeOverrides","backgroundStyle","borderStyle","chainInfo","amountErrorMessage","walletErrorMessage","filteredPaymentMethods","selectedPaymentMethod","postFormStep","v","close","RampForm","bgColor","bgImage","borderColor","borderRadius","surfaceColor","inputBgColor","textColor","textSecondaryColor","textMutedColor","successColor","CheckoutForm","_submitButtonText","_rateRefreshInterval","SkinSwatch","skin","active","dimmed"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/hooks/useRamp.ts","../src/data/countries.ts","../src/utils/provider-filters.ts","../src/context/RampContext.tsx","../src/i18n/en.ts","../src/i18n/languages.ts","../src/i18n/context.tsx","../src/components/form/RedirectScreen.tsx","../src/components/ui/Spinner.tsx","../src/components/CheckoutStep.tsx","../src/components/ProcessingStep.tsx","../src/components/CompleteStep.tsx","../src/components/ErrorStep.tsx","../src/data/cryptoData.ts","../src/components/ConfirmStep.tsx","../src/components/ui/Modal.tsx","../src/components/ui/Skeleton.tsx","../src/components/ui/icons.tsx","../src/components/ui/Toast.tsx","../src/components/ui/NRLogo.tsx","../src/components/form/LoadingScreen.tsx","../src/components/ui/BottomSheet.tsx","../src/components/ui/CloseButton.tsx","../src/components/ui/SearchInput.tsx","../src/components/modals/FiatCurrencyModal.tsx","../src/components/modals/CryptoCurrencyModal.tsx","../src/components/PaymentMethodSelector.tsx","../src/components/modals/PaymentMethodModal.tsx","../src/components/ui/ToggleSwitch.tsx","../src/components/modals/SettingsScreen.tsx","../src/components/modals/CountryPickerModal.tsx","../src/components/modals/LanguagePickerModal.tsx","../src/components/form/HeaderBar.tsx","../src/components/form/SpendCard.tsx","../src/components/ui/AnimatedNumber.tsx","../src/components/form/ReceiveCard.tsx","../src/components/form/PaymentCard.tsx","../src/components/form/ProviderCard.tsx","../src/components/modals/ChooseRampModal.tsx","../src/components/form/WalletCard.tsx","../src/components/form/CtaButton.tsx","../src/components/form/Footer.tsx","../src/components/form/RateBreakdown.tsx","../src/components/RampForm.tsx","../src/components/CheckoutForm.tsx","../src/components/ui/SkinSwatch.tsx"],"sourcesContent":["/**\n * React hooks for NowRamp Onramp API\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n RampApi,\n type RampApiConfig,\n type OnrampSupported,\n type QuotesResponse,\n type GetQuotesParams,\n type GetSupportedParams,\n type CheckoutIntent,\n type CreateCheckoutIntentParams,\n type Transaction,\n type FlowType,\n} from '@nowramp/sdk';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseRampConfigResult {\n config: OnrampSupported | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseQuotesResult {\n quotes: QuotesResponse | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface UseCheckoutIntentResult {\n order: CheckoutIntent | null;\n loading: boolean;\n error: Error | null;\n createOrder: (params: CreateCheckoutIntentParams) => Promise<CheckoutIntent>;\n reset: () => void;\n}\n\nexport interface UseTransactionResult {\n status: Transaction | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\n/**\n * Hook to fetch onramp supported configuration\n * Returns gateways, currencies, and payment methods\n */\nexport function useRampConfig(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n orderType?: FlowType,\n country?: string\n): UseRampConfigResult {\n const [data, setData] = useState<OnrampSupported | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n // Memoize API instance\n if (!apiRef.current || apiRef.current !== config) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n }\n\n const fetchConfig = useCallback(async () => {\n if (!config.projectId) {\n setError(new Error('projectId is required'));\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const supportedParams: GetSupportedParams = {};\n if (orderType) supportedParams.orderType = orderType;\n if (country) supportedParams.country = country;\n const result = await apiRef.current!.getSupported(supportedParams);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch config'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, orderType, country]);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n return { config: data, loading, error, refetch: fetchConfig };\n}\n\n/**\n * Hook to fetch quotes from all gateways\n * Auto-refreshes when params change\n */\nexport function useQuotes(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>,\n params: GetQuotesParams | null\n): UseQuotesResult {\n const [data, setData] = useState<QuotesResponse | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const fetchIdRef = useRef(0);\n\n useEffect(() => {\n // Bump fetch ID on every param change to invalidate in-flight requests\n const id = ++fetchIdRef.current;\n\n if (!params || !config.projectId) {\n setData(null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n apiRef.current!.getQuotes(params).then(\n (result) => {\n if (fetchIdRef.current === id) {\n setData(result);\n setLoading(false);\n }\n },\n (err) => {\n if (fetchIdRef.current === id) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n setData(null);\n setLoading(false);\n }\n }\n );\n }, [config.projectId, params?.fiatCurrency, params?.fiatAmount, params?.cryptoAmount, params?.cryptoCurrency, params?.network, params?.paymentMethodId, params?.country, params?.orderType]);\n\n const refetch = useCallback(async () => {\n if (!params || !config.projectId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await apiRef.current!.getQuotes(params);\n setData(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch quotes'));\n } finally {\n setLoading(false);\n }\n }, [config.projectId, params]);\n\n return { quotes: data, loading, error, refetch };\n}\n\n/**\n * Hook to create a checkout intent\n */\nexport function useCheckoutIntent(\n config: Pick<RampApiConfig, 'apiUrl' | 'projectId'>\n): UseCheckoutIntentResult {\n const [order, setOrder] = useState<CheckoutIntent | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n const configKeyRef = useRef('');\n\n // Recreate API instance when config changes\n const configKey = `${config.apiUrl}|${config.projectId}`;\n if (!apiRef.current || configKeyRef.current !== configKey) {\n apiRef.current = new RampApi({ apiKey: '', ...config });\n configKeyRef.current = configKey;\n }\n\n const createOrder = useCallback(async (params: CreateCheckoutIntentParams): Promise<CheckoutIntent> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.createCheckoutIntent(params);\n setOrder(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create checkout intent');\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n setOrder(null);\n setError(null);\n }, []);\n\n return { order, loading, error, createOrder, reset };\n}\n\n/**\n * Hook to poll transaction status\n */\nexport function useTransaction(\n config: Pick<RampApiConfig, 'apiUrl'>,\n transactionId: string | null,\n options?: { pollInterval?: number; initialDelay?: number }\n): UseTransactionResult {\n const [status, setStatus] = useState<Transaction | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const apiRef = useRef<RampApi | null>(null);\n\n if (!apiRef.current) {\n apiRef.current = new RampApi({ apiKey: '', projectId: '', ...config });\n }\n\n const fetchStatus = useCallback(async () => {\n if (!transactionId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const result = await apiRef.current!.getTransaction(transactionId);\n setStatus(result);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to fetch status'));\n } finally {\n setLoading(false);\n }\n }, [transactionId]);\n\n // Initial fetch (with optional delay to let checkout iframe load first)\n useEffect(() => {\n if (!transactionId) return;\n\n const delay = options?.initialDelay ?? 0;\n if (delay > 0) {\n const timer = setTimeout(fetchStatus, delay);\n return () => clearTimeout(timer);\n }\n\n fetchStatus();\n }, [fetchStatus, transactionId, options?.initialDelay]);\n\n // Polling — only start after the initial (possibly delayed) fetch has\n // returned a status. Without the `!status` guard the setInterval would\n // bypass initialDelay entirely, firing its first callback at pollInterval\n // (e.g. 5 s) even though we asked for a 15 s delay.\n useEffect(() => {\n if (!transactionId || !options?.pollInterval) return;\n\n // Wait for the initial fetch to populate status before polling\n if (!status) return;\n\n // Stop polling if order is in terminal state\n const terminalStatuses = ['completed', 'failed', 'cancelled', 'expired', 'refunded'];\n if (terminalStatuses.includes(status.status)) {\n return;\n }\n\n const interval = setInterval(fetchStatus, options.pollInterval);\n return () => clearInterval(interval);\n }, [transactionId, options?.pollInterval, status?.status, fetchStatus]);\n\n return { status, loading, error, refetch: fetchStatus };\n}\n","/**\n * Country list with default fiat currency mapping\n * Used for geo-based fiat auto-selection\n */\n\nexport interface Country {\n /** ISO 3166-1 alpha-2 country code (lowercase) */\n code: string;\n /** Display name */\n name: string;\n /** Default fiat currency code for this country */\n defaultFiat: string;\n}\n\nexport const COUNTRIES: Country[] = [\n { code: 'ad', name: 'Andorra', defaultFiat: 'EUR' },\n { code: 'ae', name: 'United Arab Emirates', defaultFiat: 'AED' },\n { code: 'af', name: 'Afghanistan', defaultFiat: 'USD' },\n { code: 'ag', name: 'Antigua and Barbuda', defaultFiat: 'USD' },\n { code: 'al', name: 'Albania', defaultFiat: 'ALL' },\n { code: 'am', name: 'Armenia', defaultFiat: 'USD' },\n { code: 'ao', name: 'Angola', defaultFiat: 'USD' },\n { code: 'ar', name: 'Argentina', defaultFiat: 'ARS' },\n { code: 'at', name: 'Austria', defaultFiat: 'EUR' },\n { code: 'au', name: 'Australia', defaultFiat: 'AUD' },\n { code: 'az', name: 'Azerbaijan', defaultFiat: 'USD' },\n { code: 'ba', name: 'Bosnia and Herzegovina', defaultFiat: 'EUR' },\n { code: 'bb', name: 'Barbados', defaultFiat: 'USD' },\n { code: 'bd', name: 'Bangladesh', defaultFiat: 'USD' },\n { code: 'be', name: 'Belgium', defaultFiat: 'EUR' },\n { code: 'bf', name: 'Burkina Faso', defaultFiat: 'USD' },\n { code: 'bg', name: 'Bulgaria', defaultFiat: 'EUR' },\n { code: 'bh', name: 'Bahrain', defaultFiat: 'USD' },\n { code: 'bi', name: 'Burundi', defaultFiat: 'USD' },\n { code: 'bj', name: 'Benin', defaultFiat: 'USD' },\n { code: 'bn', name: 'Brunei', defaultFiat: 'USD' },\n { code: 'bo', name: 'Bolivia', defaultFiat: 'USD' },\n { code: 'br', name: 'Brazil', defaultFiat: 'BRL' },\n { code: 'bs', name: 'Bahamas', defaultFiat: 'USD' },\n { code: 'bt', name: 'Bhutan', defaultFiat: 'USD' },\n { code: 'bw', name: 'Botswana', defaultFiat: 'USD' },\n { code: 'by', name: 'Belarus', defaultFiat: 'USD' },\n { code: 'bz', name: 'Belize', defaultFiat: 'USD' },\n { code: 'ca', name: 'Canada', defaultFiat: 'CAD' },\n { code: 'cd', name: 'DR Congo', defaultFiat: 'USD' },\n { code: 'cf', name: 'Central African Republic', defaultFiat: 'USD' },\n { code: 'ch', name: 'Switzerland', defaultFiat: 'CHF' },\n { code: 'ci', name: \"Cote d'Ivoire\", defaultFiat: 'USD' },\n { code: 'cl', name: 'Chile', defaultFiat: 'CLP' },\n { code: 'cm', name: 'Cameroon', defaultFiat: 'USD' },\n { code: 'cn', name: 'China', defaultFiat: 'USD' },\n { code: 'co', name: 'Colombia', defaultFiat: 'USD' },\n { code: 'cr', name: 'Costa Rica', defaultFiat: 'USD' },\n { code: 'cu', name: 'Cuba', defaultFiat: 'USD' },\n { code: 'cv', name: 'Cape Verde', defaultFiat: 'USD' },\n { code: 'cy', name: 'Cyprus', defaultFiat: 'EUR' },\n { code: 'cz', name: 'Czech Republic', defaultFiat: 'CZK' },\n { code: 'de', name: 'Germany', defaultFiat: 'EUR' },\n { code: 'dj', name: 'Djibouti', defaultFiat: 'USD' },\n { code: 'dk', name: 'Denmark', defaultFiat: 'DKK' },\n { code: 'dm', name: 'Dominica', defaultFiat: 'USD' },\n { code: 'do', name: 'Dominican Republic', defaultFiat: 'USD' },\n { code: 'dz', name: 'Algeria', defaultFiat: 'USD' },\n { code: 'ec', name: 'Ecuador', defaultFiat: 'USD' },\n { code: 'ee', name: 'Estonia', defaultFiat: 'EUR' },\n { code: 'eg', name: 'Egypt', defaultFiat: 'USD' },\n { code: 'er', name: 'Eritrea', defaultFiat: 'USD' },\n { code: 'es', name: 'Spain', defaultFiat: 'EUR' },\n { code: 'et', name: 'Ethiopia', defaultFiat: 'USD' },\n { code: 'fi', name: 'Finland', defaultFiat: 'EUR' },\n { code: 'fj', name: 'Fiji', defaultFiat: 'USD' },\n { code: 'fr', name: 'France', defaultFiat: 'EUR' },\n { code: 'ga', name: 'Gabon', defaultFiat: 'USD' },\n { code: 'gb', name: 'United Kingdom', defaultFiat: 'GBP' },\n { code: 'gd', name: 'Grenada', defaultFiat: 'USD' },\n { code: 'ge', name: 'Georgia', defaultFiat: 'USD' },\n { code: 'gh', name: 'Ghana', defaultFiat: 'USD' },\n { code: 'gm', name: 'Gambia', defaultFiat: 'USD' },\n { code: 'gn', name: 'Guinea', defaultFiat: 'USD' },\n { code: 'gq', name: 'Equatorial Guinea', defaultFiat: 'USD' },\n { code: 'gr', name: 'Greece', defaultFiat: 'EUR' },\n { code: 'gt', name: 'Guatemala', defaultFiat: 'USD' },\n { code: 'gw', name: 'Guinea-Bissau', defaultFiat: 'USD' },\n { code: 'gy', name: 'Guyana', defaultFiat: 'USD' },\n { code: 'hk', name: 'Hong Kong', defaultFiat: 'HKD' },\n { code: 'hn', name: 'Honduras', defaultFiat: 'USD' },\n { code: 'hr', name: 'Croatia', defaultFiat: 'EUR' },\n { code: 'ht', name: 'Haiti', defaultFiat: 'USD' },\n { code: 'hu', name: 'Hungary', defaultFiat: 'EUR' },\n { code: 'id', name: 'Indonesia', defaultFiat: 'IDR' },\n { code: 'ie', name: 'Ireland', defaultFiat: 'EUR' },\n { code: 'il', name: 'Israel', defaultFiat: 'USD' },\n { code: 'in', name: 'India', defaultFiat: 'INR' },\n { code: 'iq', name: 'Iraq', defaultFiat: 'USD' },\n { code: 'ir', name: 'Iran', defaultFiat: 'USD' },\n { code: 'is', name: 'Iceland', defaultFiat: 'EUR' },\n { code: 'it', name: 'Italy', defaultFiat: 'EUR' },\n { code: 'jm', name: 'Jamaica', defaultFiat: 'USD' },\n { code: 'jo', name: 'Jordan', defaultFiat: 'USD' },\n { code: 'jp', name: 'Japan', defaultFiat: 'JPY' },\n { code: 'ke', name: 'Kenya', defaultFiat: 'USD' },\n { code: 'kg', name: 'Kyrgyzstan', defaultFiat: 'USD' },\n { code: 'kh', name: 'Cambodia', defaultFiat: 'USD' },\n { code: 'ki', name: 'Kiribati', defaultFiat: 'USD' },\n { code: 'km', name: 'Comoros', defaultFiat: 'USD' },\n { code: 'kn', name: 'Saint Kitts and Nevis', defaultFiat: 'USD' },\n { code: 'kr', name: 'South Korea', defaultFiat: 'KRW' },\n { code: 'kw', name: 'Kuwait', defaultFiat: 'USD' },\n { code: 'kz', name: 'Kazakhstan', defaultFiat: 'USD' },\n { code: 'la', name: 'Laos', defaultFiat: 'USD' },\n { code: 'lb', name: 'Lebanon', defaultFiat: 'USD' },\n { code: 'lc', name: 'Saint Lucia', defaultFiat: 'USD' },\n { code: 'li', name: 'Liechtenstein', defaultFiat: 'CHF' },\n { code: 'lk', name: 'Sri Lanka', defaultFiat: 'USD' },\n { code: 'lr', name: 'Liberia', defaultFiat: 'USD' },\n { code: 'ls', name: 'Lesotho', defaultFiat: 'ZAR' },\n { code: 'lt', name: 'Lithuania', defaultFiat: 'EUR' },\n { code: 'lu', name: 'Luxembourg', defaultFiat: 'EUR' },\n { code: 'lv', name: 'Latvia', defaultFiat: 'EUR' },\n { code: 'ly', name: 'Libya', defaultFiat: 'USD' },\n { code: 'ma', name: 'Morocco', defaultFiat: 'USD' },\n { code: 'mc', name: 'Monaco', defaultFiat: 'EUR' },\n { code: 'md', name: 'Moldova', defaultFiat: 'EUR' },\n { code: 'me', name: 'Montenegro', defaultFiat: 'EUR' },\n { code: 'mg', name: 'Madagascar', defaultFiat: 'USD' },\n { code: 'mk', name: 'North Macedonia', defaultFiat: 'EUR' },\n { code: 'ml', name: 'Mali', defaultFiat: 'USD' },\n { code: 'mm', name: 'Myanmar', defaultFiat: 'USD' },\n { code: 'mn', name: 'Mongolia', defaultFiat: 'USD' },\n { code: 'mr', name: 'Mauritania', defaultFiat: 'USD' },\n { code: 'mt', name: 'Malta', defaultFiat: 'EUR' },\n { code: 'mu', name: 'Mauritius', defaultFiat: 'USD' },\n { code: 'mv', name: 'Maldives', defaultFiat: 'USD' },\n { code: 'mw', name: 'Malawi', defaultFiat: 'USD' },\n { code: 'mx', name: 'Mexico', defaultFiat: 'MXN' },\n { code: 'my', name: 'Malaysia', defaultFiat: 'USD' },\n { code: 'mz', name: 'Mozambique', defaultFiat: 'USD' },\n { code: 'na', name: 'Namibia', defaultFiat: 'ZAR' },\n { code: 'ne', name: 'Niger', defaultFiat: 'USD' },\n { code: 'ng', name: 'Nigeria', defaultFiat: 'NGN' },\n { code: 'ni', name: 'Nicaragua', defaultFiat: 'USD' },\n { code: 'nl', name: 'Netherlands', defaultFiat: 'EUR' },\n { code: 'no', name: 'Norway', defaultFiat: 'NOK' },\n { code: 'np', name: 'Nepal', defaultFiat: 'USD' },\n { code: 'nr', name: 'Nauru', defaultFiat: 'AUD' },\n { code: 'nz', name: 'New Zealand', defaultFiat: 'NZD' },\n { code: 'om', name: 'Oman', defaultFiat: 'USD' },\n { code: 'pa', name: 'Panama', defaultFiat: 'USD' },\n { code: 'pe', name: 'Peru', defaultFiat: 'USD' },\n { code: 'pg', name: 'Papua New Guinea', defaultFiat: 'USD' },\n { code: 'ph', name: 'Philippines', defaultFiat: 'PHP' },\n { code: 'pk', name: 'Pakistan', defaultFiat: 'USD' },\n { code: 'pl', name: 'Poland', defaultFiat: 'PLN' },\n { code: 'pt', name: 'Portugal', defaultFiat: 'EUR' },\n { code: 'pw', name: 'Palau', defaultFiat: 'USD' },\n { code: 'py', name: 'Paraguay', defaultFiat: 'USD' },\n { code: 'qa', name: 'Qatar', defaultFiat: 'QAR' },\n { code: 'ro', name: 'Romania', defaultFiat: 'EUR' },\n { code: 'rs', name: 'Serbia', defaultFiat: 'EUR' },\n { code: 'ru', name: 'Russia', defaultFiat: 'USD' },\n { code: 'rw', name: 'Rwanda', defaultFiat: 'USD' },\n { code: 'sa', name: 'Saudi Arabia', defaultFiat: 'SAR' },\n { code: 'sb', name: 'Solomon Islands', defaultFiat: 'USD' },\n { code: 'sc', name: 'Seychelles', defaultFiat: 'USD' },\n { code: 'sd', name: 'Sudan', defaultFiat: 'USD' },\n { code: 'se', name: 'Sweden', defaultFiat: 'SEK' },\n { code: 'sg', name: 'Singapore', defaultFiat: 'SGD' },\n { code: 'si', name: 'Slovenia', defaultFiat: 'EUR' },\n { code: 'sk', name: 'Slovakia', defaultFiat: 'EUR' },\n { code: 'sl', name: 'Sierra Leone', defaultFiat: 'USD' },\n { code: 'sm', name: 'San Marino', defaultFiat: 'EUR' },\n { code: 'sn', name: 'Senegal', defaultFiat: 'USD' },\n { code: 'so', name: 'Somalia', defaultFiat: 'USD' },\n { code: 'sr', name: 'Suriname', defaultFiat: 'USD' },\n { code: 'ss', name: 'South Sudan', defaultFiat: 'USD' },\n { code: 'sv', name: 'El Salvador', defaultFiat: 'USD' },\n { code: 'sy', name: 'Syria', defaultFiat: 'USD' },\n { code: 'sz', name: 'Eswatini', defaultFiat: 'ZAR' },\n { code: 'td', name: 'Chad', defaultFiat: 'USD' },\n { code: 'tg', name: 'Togo', defaultFiat: 'USD' },\n { code: 'th', name: 'Thailand', defaultFiat: 'THB' },\n { code: 'tj', name: 'Tajikistan', defaultFiat: 'USD' },\n { code: 'tl', name: 'Timor-Leste', defaultFiat: 'USD' },\n { code: 'tm', name: 'Turkmenistan', defaultFiat: 'USD' },\n { code: 'tn', name: 'Tunisia', defaultFiat: 'USD' },\n { code: 'to', name: 'Tonga', defaultFiat: 'USD' },\n { code: 'tr', name: 'Turkey', defaultFiat: 'TRY' },\n { code: 'tt', name: 'Trinidad and Tobago', defaultFiat: 'USD' },\n { code: 'tv', name: 'Tuvalu', defaultFiat: 'AUD' },\n { code: 'tw', name: 'Taiwan', defaultFiat: 'TWD' },\n { code: 'tz', name: 'Tanzania', defaultFiat: 'USD' },\n { code: 'ua', name: 'Ukraine', defaultFiat: 'USD' },\n { code: 'ug', name: 'Uganda', defaultFiat: 'USD' },\n { code: 'us', name: 'United States', defaultFiat: 'USD' },\n { code: 'uy', name: 'Uruguay', defaultFiat: 'USD' },\n { code: 'uz', name: 'Uzbekistan', defaultFiat: 'USD' },\n { code: 'va', name: 'Vatican City', defaultFiat: 'EUR' },\n { code: 'vc', name: 'Saint Vincent and the Grenadines', defaultFiat: 'USD' },\n { code: 've', name: 'Venezuela', defaultFiat: 'USD' },\n { code: 'vn', name: 'Vietnam', defaultFiat: 'VND' },\n { code: 'vu', name: 'Vanuatu', defaultFiat: 'USD' },\n { code: 'ws', name: 'Samoa', defaultFiat: 'USD' },\n { code: 'ye', name: 'Yemen', defaultFiat: 'USD' },\n { code: 'za', name: 'South Africa', defaultFiat: 'ZAR' },\n { code: 'zm', name: 'Zambia', defaultFiat: 'USD' },\n { code: 'zw', name: 'Zimbabwe', defaultFiat: 'USD' },\n];\n\n/** Precomputed lookup by country code */\nexport const COUNTRY_MAP: Record<string, Country> = Object.fromEntries(\n COUNTRIES.map((c) => [c.code, c])\n);\n\n/**\n * Resolve the default fiat currency for a country.\n * Validates against available fiats, falls back to USD then first available.\n */\nexport function getDefaultFiatForCountry(\n countryCode: string | undefined | null,\n supportedFiats?: string[]\n): string {\n if (!countryCode) return 'USD';\n\n const country = COUNTRY_MAP[countryCode.toLowerCase()];\n const preferredFiat = country?.defaultFiat || 'USD';\n\n // If no supported fiats list, return the preferred fiat directly\n if (!supportedFiats || supportedFiats.length === 0) return preferredFiat;\n\n // Check if the country's default fiat is supported\n if (supportedFiats.includes(preferredFiat)) return preferredFiat;\n\n // Fall back to USD if supported\n if (supportedFiats.includes('USD')) return 'USD';\n\n // Last resort: first available fiat\n return supportedFiats[0] || 'USD';\n}\n","/**\n * Provider-aware cascading filters for currency/network/payment method selection.\n *\n * Pure functions with no React deps — testable independently.\n * Uses the `providers` arrays from the backend's AggregatedConfig to ensure\n * only provider-supported combinations are selectable in the form.\n */\n\nimport type {\n SupportedFiat,\n SupportedCrypto,\n SupportedPaymentMethod,\n} from '@nowramp/sdk';\n\n/**\n * Build-time compat flag. When true (default), undefined providers arrays\n * are treated as wildcards (match everything). Set to false and rebuild\n * once all providers are fully annotated to enable strict filtering.\n */\nexport const PROVIDERS_WILDCARD_COMPAT = true;\n\n/**\n * Returns true if two providers arrays share at least one common provider.\n *\n * Semantics:\n * undefined → wildcard when compat is true, else no match\n * [] → \"no providers support this\", always returns false\n */\nexport function providersOverlap(\n a?: string[],\n b?: string[],\n compat = PROVIDERS_WILDCARD_COMPAT,\n): boolean {\n if (a === undefined || b === undefined) return compat;\n if (a.length === 0 || b.length === 0) return false;\n return a.some((p) => b.includes(p));\n}\n\n/** Filter fiats by provider overlap with selected network. */\nexport function filterAvailableFiats(\n fiats: SupportedFiat[],\n networkProviders: string[] | undefined,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedFiat[] {\n return fiats.filter((f) => providersOverlap(f.providers, networkProviders, compat));\n}\n\n/**\n * Filter cryptos: keep only networks with provider overlap against fiat providers.\n * Drop cryptos with zero remaining networks.\n */\nexport function filterAvailableCryptos(\n cryptos: SupportedCrypto[],\n fiatProviders: string[] | undefined,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedCrypto[] {\n const result: SupportedCrypto[] = [];\n for (const crypto of cryptos) {\n const filteredNetworks = crypto.networks.filter((n) =>\n providersOverlap(n.providers, fiatProviders, compat),\n );\n if (filteredNetworks.length > 0) {\n result.push(\n filteredNetworks.length === crypto.networks.length\n ? crypto\n : { ...crypto, networks: filteredNetworks },\n );\n }\n }\n return result;\n}\n\n/** Filter payment methods by provider overlap with network AND supportedFiats. */\nexport function filterAvailablePaymentMethods(\n methods: SupportedPaymentMethod[],\n networkProviders: string[] | undefined,\n fiatCurrency: string,\n compat = PROVIDERS_WILDCARD_COMPAT,\n): SupportedPaymentMethod[] {\n if (!fiatCurrency) return [];\n return methods.filter(\n (m) =>\n m.supportedFiats.includes(fiatCurrency) &&\n providersOverlap(m.providers, networkProviders, compat),\n );\n}\n\n// =============================================================================\n// Reconciliation\n// =============================================================================\n\nexport interface ReconciledSelections {\n cryptoCurrency?: string;\n network?: string;\n fiatCurrency?: string;\n paymentMethodId?: string;\n}\n\nexport interface LockFlags {\n cryptoLocked?: boolean;\n networkLocked?: boolean;\n fiatLocked?: boolean;\n}\n\n/**\n * Pure reconciliation: given current selections, filtered lists, and lock flags,\n * returns a plain object with corrected values (or null if no change needed).\n */\nexport function reconcileSelections(\n state: {\n cryptoCurrency: string;\n network: string;\n fiatCurrency: string;\n paymentMethodId: string;\n },\n filtered: {\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n },\n locks: LockFlags,\n): ReconciledSelections | null {\n const result: ReconciledSelections = {};\n let changed = false;\n\n // --- Crypto + Network ---\n if (!locks.cryptoLocked && !locks.networkLocked) {\n // Both unlocked: validate crypto+network pair, correct both if invalid\n const cryptoValid =\n state.cryptoCurrency &&\n filtered.availableCryptos.some(\n (c) =>\n c.code === state.cryptoCurrency &&\n c.networks.some((n) => n.id === state.network),\n );\n if (!cryptoValid && filtered.availableCryptos.length > 0) {\n // Prefer BTC on Bitcoin network as the default\n const btc = filtered.availableCryptos.find((c) => c.code === 'BTC');\n const first = btc || filtered.availableCryptos[0];\n const net =\n first.networks.find((n) => n.isDefault) || first.networks[0];\n if (first.code !== state.cryptoCurrency) {\n result.cryptoCurrency = first.code;\n changed = true;\n }\n if (net && net.id !== state.network) {\n result.network = net.id;\n changed = true;\n }\n }\n } else if (!locks.cryptoLocked && locks.networkLocked) {\n // Network locked, crypto unlocked: pick a crypto that supports the locked network\n const cryptoValid =\n state.cryptoCurrency &&\n filtered.availableCryptos.some(\n (c) =>\n c.code === state.cryptoCurrency &&\n c.networks.some((n) => n.id === state.network),\n );\n if (!cryptoValid) {\n const compatible = filtered.availableCryptos.find((c) =>\n c.networks.some((n) => n.id === state.network),\n );\n if (compatible && compatible.code !== state.cryptoCurrency) {\n result.cryptoCurrency = compatible.code;\n changed = true;\n }\n }\n } else if (locks.cryptoLocked && !locks.networkLocked) {\n // Crypto locked, network unlocked: correct network against locked crypto's available networks\n const lockedCrypto = filtered.availableCryptos.find(\n (c) => c.code === state.cryptoCurrency,\n );\n if (lockedCrypto) {\n const networkValid = lockedCrypto.networks.some(\n (n) => n.id === state.network,\n );\n if (!networkValid && lockedCrypto.networks.length > 0) {\n const net =\n lockedCrypto.networks.find((n) => n.isDefault) ||\n lockedCrypto.networks[0];\n if (net.id !== state.network) {\n result.network = net.id;\n changed = true;\n }\n }\n }\n }\n // Both locked: no corrections possible\n\n // --- Fiat (prefer USD, else first available) ---\n if (!locks.fiatLocked) {\n const fiatValid =\n state.fiatCurrency &&\n filtered.availableFiats.some((f) => f.code === state.fiatCurrency);\n if (!fiatValid && filtered.availableFiats.length > 0) {\n const usd = filtered.availableFiats.find((f) => f.code === 'USD');\n const target = usd || filtered.availableFiats[0];\n if (target.code !== state.fiatCurrency) {\n result.fiatCurrency = target.code;\n changed = true;\n }\n }\n }\n\n // --- Payment Method (prefer card/debit, else first) ---\n const methodValid =\n state.paymentMethodId &&\n filtered.availablePaymentMethods.some(\n (m) => m.id === state.paymentMethodId,\n );\n if (!methodValid && filtered.availablePaymentMethods.length > 0) {\n const card = filtered.availablePaymentMethods.find(\n (m) => m.id.includes('card') || m.id.includes('debit'),\n );\n const target = card || filtered.availablePaymentMethods[0];\n if (target.id !== state.paymentMethodId) {\n result.paymentMethodId = target.id;\n changed = true;\n }\n }\n\n return changed ? result : null;\n}\n\n// =============================================================================\n// Selection Unsupported Check\n// =============================================================================\n\n/**\n * Returns true when a locked selection has no provider support in the current flow.\n * Drives CTA disable + message in the form.\n */\nexport function isSelectionUnsupported(\n config: { cryptos?: SupportedCrypto[]; fiats?: SupportedFiat[] },\n state: { cryptoCurrency: string; network: string; fiatCurrency: string },\n locks: LockFlags,\n filtered: {\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n },\n): boolean {\n // A. Locked crypto+network\n if (locks.cryptoLocked) {\n const crypto = config.cryptos?.find(\n (c) => c.code === state.cryptoCurrency,\n );\n if (!crypto) return true;\n const network = crypto.networks?.find((n) => n.id === state.network);\n if (!network) return true;\n if (network.providers !== undefined && network.providers.length === 0)\n return true;\n // Has explicit providers but no fiats or payment methods overlap\n if (\n network.providers !== undefined &&\n (filtered.availableFiats.length === 0 ||\n filtered.availablePaymentMethods.length === 0)\n )\n return true;\n }\n\n // B. Locked network only (not crypto-locked)\n if (locks.networkLocked && !locks.cryptoLocked) {\n const hasNetworkSupport = filtered.availableCryptos.some((c) =>\n c.networks.some((n) => n.id === state.network),\n );\n if (!hasNetworkSupport) return true;\n }\n\n // C. Locked fiat\n if (locks.fiatLocked) {\n const fiat = config.fiats?.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return true;\n if (fiat.providers !== undefined && fiat.providers.length === 0)\n return true;\n if (\n fiat.providers !== undefined &&\n filtered.availableCryptos.length === 0\n )\n return true;\n }\n\n return false;\n}\n","/**\n * Ramp Context Provider\n * Provides configuration and state management for the ramp form\n */\n\nimport React, { createContext, useContext, useReducer, useCallback, useMemo, useRef } from 'react';\nimport type {\n RampApiConfig,\n OnrampSupported,\n QuotesResponse,\n Quote,\n CheckoutIntent,\n Transaction,\n FieldLocksConfig,\n FlowType,\n SupportedFiat,\n SupportedCrypto,\n SupportedPaymentMethod,\n UnavailableGateway,\n} from '@nowramp/sdk';\nimport {\n useRampConfig,\n useQuotes,\n useCheckoutIntent,\n useTransaction,\n} from '../hooks/useRamp';\nimport { getDefaultFiatForCountry } from '../data/countries';\nimport {\n filterAvailableFiats,\n filterAvailableCryptos,\n filterAvailablePaymentMethods,\n reconcileSelections,\n isSelectionUnsupported,\n} from '../utils/provider-filters';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RampStep =\n | 'confirm' // Confirm pre-filled order (session mode)\n | 'amount' // Select currency and amount\n | 'quotes' // View and compare quotes\n | 'wallet' // Enter wallet address\n | 'checkout' // Provider checkout (iframe/redirect)\n | 'processing' // Waiting for completion\n | 'complete' // Success\n | 'error'; // Error state\n\nexport interface RampFormState {\n step: RampStep;\n flowType: FlowType;\n fiatCurrency: string;\n fiatAmount: string;\n cryptoCurrency: string;\n cryptoAmount: string;\n network: string;\n paymentMethodId: string;\n walletAddress: string;\n walletError: string | null;\n selectedProvider: string | null;\n selectedQuote: Quote | null;\n customerId: string;\n email: string;\n country: string;\n /** How country was set: 'auto' (GeoIP), 'manual' (user pick), or '' (not set) */\n countrySource: 'auto' | 'manual' | '';\n errorMessage: string | null;\n}\n\n/** @internal exported for unit testing */\nexport type RampAction =\n | { type: 'SET_STEP'; step: RampStep }\n | { type: 'SET_FLOW_TYPE'; flowType: FlowType; fieldLocks?: FieldLocksConfig | null }\n | { type: 'SET_FIAT_CURRENCY'; currency: string }\n | { type: 'SET_FIAT_AMOUNT'; amount: string }\n | { type: 'SET_CRYPTO_CURRENCY'; currency: string }\n | { type: 'SET_CRYPTO_AMOUNT'; amount: string }\n | { type: 'SET_NETWORK'; network: string }\n | { type: 'SET_CRYPTO_CHAIN'; chain: string }\n | { type: 'SET_PAYMENT_METHOD'; methodId: string }\n | { type: 'SET_WALLET_ADDRESS'; address: string }\n | { type: 'SET_WALLET_ERROR'; message: string }\n | { type: 'SELECT_QUOTE'; quote: Quote }\n | { type: 'CLEAR_QUOTE' }\n | { type: 'SET_CUSTOMER_ID'; customerId: string }\n | { type: 'SET_EMAIL'; email: string }\n | { type: 'SET_COUNTRY'; country: string }\n | { type: 'SET_COUNTRY_AUTO'; country: string }\n | { type: 'SET_ERROR'; message: string }\n | { type: 'CLEAR_ERROR' }\n | { type: 'RESET' };\n\nexport interface RampContextValue {\n // Configuration\n apiConfig: Pick<RampApiConfig, 'apiUrl' | 'projectId'>;\n /** Base URL for static assets (crypto icons, flags). Empty string = root-relative. */\n assetBaseUrl: string;\n config: OnrampSupported | null;\n configLoading: boolean;\n configError: Error | null;\n\n // Form state\n state: RampFormState;\n dispatch: React.Dispatch<RampAction>;\n\n // Quotes\n quotes: QuotesResponse | null;\n quotesLoading: boolean;\n quotesError: Error | null;\n fetchQuotes: () => void;\n\n // Order\n order: CheckoutIntent | null;\n orderLoading: boolean;\n orderError: Error | null;\n createOrder: () => Promise<void>;\n\n // Order status\n orderStatus: Transaction | null;\n orderStatusLoading: boolean;\n\n // Session-aware props\n fieldLocks: FieldLocksConfig | null;\n defaultGateway: string | null;\n\n // Filtered lists (provider-aware cascading filters)\n availableFiats: SupportedFiat[];\n availableCryptos: SupportedCrypto[];\n availablePaymentMethods: SupportedPaymentMethod[];\n selectionUnsupported: boolean;\n\n // Empty quotes feedback\n quotesEmpty: boolean;\n bestUnavailableReason: string | null;\n\n // Validation\n amountError: string | null;\n\n // Navigation helpers\n goToStep: (step: RampStep) => void;\n goBack: () => void;\n canProceed: boolean;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** Strip trailing zeros and limit decimal places (cleans backend values like \"33.00000000\") */\nfunction normalizeAmount(value: string, maxDecimals: number): string {\n if (!value) return value;\n const dotIndex = value.indexOf('.');\n if (dotIndex === -1) return value;\n let result = value;\n if (result.length - dotIndex - 1 > maxDecimals) {\n result = result.slice(0, dotIndex + maxDecimals + 1);\n }\n result = result.replace(/0+$/, '').replace(/\\.$/, '');\n return result;\n}\n\n/** @internal exported for unit testing */\nexport function isQuotesEmpty(\n quotesLoading: boolean,\n quotes: QuotesResponse | null,\n quoteParams: unknown | null,\n): boolean {\n return !quotesLoading && !!quotes && !quotes.bestQuote && !!quoteParams;\n}\n\n/**\n * Pick the most relevant unavailable-gateway reason to display.\n *\n * `defaultGateway` now receives the server-authoritative `preferredGatewayId`\n * when available, falling back to the frontend heuristic (prop or config\n * value) for older backends that don't return it.\n *\n * @internal exported for unit testing\n */\nexport function pickBestUnavailableReason(\n gateways: UnavailableGateway[],\n defaultGateway: string | null,\n): string | null {\n if (!gateways.length) return null;\n\n // If default/preferred gateway is unavailable, its reason is most relevant\n if (defaultGateway) {\n const match = gateways.find((g) => g.gatewayId === defaultGateway);\n if (match?.reason) return match.reason;\n }\n\n // Rank by reason specificity; explicit index tie-break for cross-engine safety\n const scored = gateways\n .map((g, idx) => ({ reason: g.reason, score: g.reason ? reasonScore(g.reason) : 99, idx }))\n .filter((g) => g.reason);\n\n if (!scored.length) return null;\n scored.sort((a, b) => a.score - b.score || a.idx - b.idx);\n return scored[0].reason;\n}\n\nfunction reasonScore(reason: string): number {\n const r = reason.toLowerCase();\n if (/amount|out of range for|minimum|maximum/.test(r)) return 1;\n if (/currency|pair|network|chain/.test(r)) return 2;\n if (/country|region|location/.test(r)) return 3;\n if (/does not support|unsupported/.test(r)) return 4;\n return 5;\n}\n\n/** Order statuses that represent a terminal (final) state */\nexport const TERMINAL_STATUSES = ['completed', 'failed', 'cancelled', 'expired', 'refunded'];\n\n/** @internal exported for unit testing */\nexport function isTerminalStatus(status: string): boolean {\n return TERMINAL_STATUSES.includes(status);\n}\n\n// =============================================================================\n// Initial State & Reducer\n// =============================================================================\n\n/** @internal exported for unit testing */\nexport const initialState: RampFormState = {\n step: 'amount',\n flowType: 'buy',\n fiatCurrency: 'USD',\n fiatAmount: '',\n cryptoCurrency: '',\n cryptoAmount: '',\n network: '',\n paymentMethodId: '',\n walletAddress: '',\n walletError: null,\n selectedProvider: null,\n selectedQuote: null,\n customerId: '',\n email: '',\n country: '',\n countrySource: '',\n errorMessage: null,\n};\n\n/** @internal exported for unit testing */\nexport function rampReducer(state: RampFormState, action: RampAction): RampFormState {\n switch (action.type) {\n case 'SET_STEP':\n return { ...state, step: action.step, errorMessage: null };\n case 'SET_FLOW_TYPE':\n return {\n ...state,\n flowType: action.flowType,\n fiatAmount: '',\n cryptoAmount: '',\n fiatCurrency: action.fieldLocks?.sourceCurrency?.locked ? state.fiatCurrency : '',\n cryptoCurrency: action.fieldLocks?.destinationCurrency?.locked ? state.cryptoCurrency : '',\n network: (action.fieldLocks?.network?.locked || action.fieldLocks?.destinationCurrency?.locked)\n ? state.network : '',\n paymentMethodId: '',\n selectedQuote: null,\n selectedProvider: null,\n errorMessage: null,\n };\n case 'SET_FIAT_CURRENCY':\n return { ...state, fiatCurrency: action.currency };\n case 'SET_FIAT_AMOUNT':\n return { ...state, fiatAmount: action.amount };\n case 'SET_CRYPTO_CURRENCY':\n return { ...state, cryptoCurrency: action.currency, network: '' };\n case 'SET_CRYPTO_AMOUNT':\n return { ...state, cryptoAmount: action.amount };\n case 'SET_NETWORK':\n return { ...state, network: action.network };\n case 'SET_CRYPTO_CHAIN':\n return { ...state, network: action.chain };\n case 'SET_PAYMENT_METHOD':\n return { ...state, paymentMethodId: action.methodId };\n case 'SET_WALLET_ADDRESS':\n return { ...state, walletAddress: action.address, walletError: null };\n case 'SET_WALLET_ERROR':\n return { ...state, walletError: action.message };\n case 'SELECT_QUOTE':\n return {\n ...state,\n selectedQuote: action.quote,\n selectedProvider: action.quote.gatewayId,\n };\n case 'CLEAR_QUOTE':\n return {\n ...state,\n selectedQuote: null,\n selectedProvider: null,\n };\n case 'SET_CUSTOMER_ID':\n return { ...state, customerId: action.customerId };\n case 'SET_EMAIL':\n return { ...state, email: action.email };\n case 'SET_COUNTRY':\n return { ...state, country: action.country, countrySource: 'manual' };\n case 'SET_COUNTRY_AUTO':\n return { ...state, country: action.country, countrySource: 'auto' };\n case 'SET_ERROR':\n return { ...state, step: 'error', errorMessage: action.message };\n case 'CLEAR_ERROR':\n return { ...state, errorMessage: null };\n case 'RESET':\n return initialState;\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst RampContext = createContext<RampContextValue | null>(null);\n\nexport interface RampProviderProps {\n /** Project ID (required) */\n projectId: string;\n /** API base URL (optional) */\n apiUrl?: string;\n /** Base URL for static assets (crypto icons, flags). Use CDN URL for standalone/IIFE deployments. */\n assetBaseUrl?: string;\n /** Flow type: 'buy' (onramp) or 'sell' (offramp) */\n flowType?: FlowType;\n /** External customer ID */\n customerId?: string;\n /** Brand identifier for metadata tracking (e.g., sub-brand name) */\n brandId?: string;\n /**\n * Initial fiat currency. When explicitly provided (including 'USD'),\n * GeoIP auto-detection and geo fallback will NOT override this value.\n * Manual country selection by the user WILL still update fiat unless\n * fieldLocks.sourceCurrency.locked is true.\n *\n * Passing `defaultFiatCurrency={undefined}` is equivalent to omitting\n * the prop — geo-detection will apply normally.\n *\n * @default 'USD'\n */\n defaultFiatCurrency?: string;\n /** Initial crypto currency */\n defaultCryptoCurrency?: string;\n /** Initial network */\n defaultNetwork?: string;\n /** Initial fiat amount */\n defaultFiatAmount?: string;\n /** Initial crypto amount (used for sell/offramp) */\n defaultCryptoAmount?: string;\n /** Initial wallet address */\n defaultWalletAddress?: string;\n /** Default gateway ID to pre-select. Falls back to project config if not set. */\n defaultGateway?: string;\n /** Default country code (ISO alpha-2). If set, skips GeoIP auto-detection. */\n defaultCountry?: string;\n /** Field locks from session */\n fieldLocks?: FieldLocksConfig;\n /** Partner metadata forwarded to order and webhook payloads (from session metadata) */\n partnerMetadata?: Record<string, unknown>;\n /** Poll interval for order status (ms) */\n statusPollInterval?: number;\n /** Callback when order completes */\n onComplete?: (status: Transaction) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n children: React.ReactNode;\n}\n\nexport function RampProvider(props: RampProviderProps) {\n // Detect if consumer explicitly passed defaultFiatCurrency (even USD)\n // props.defaultFiatCurrency !== undefined distinguishes:\n // <RampForm> → undefined → not protected\n // <RampForm defaultFiatCurrency=\"EUR\"> → 'EUR' → protected\n // <RampForm defaultFiatCurrency=\"USD\"> → 'USD' → protected\n // <RampForm defaultFiatCurrency={undefined}> → undefined → not protected\n const fiatProvidedRef = useRef(props.defaultFiatCurrency !== undefined);\n\n const {\n projectId,\n apiUrl = 'https://api.nowramp.com',\n assetBaseUrl = '',\n flowType = 'buy',\n customerId = '',\n brandId,\n defaultFiatCurrency = 'USD',\n defaultCryptoCurrency = 'BTC',\n defaultNetwork: defaultNetworkProp = '',\n defaultFiatAmount = '',\n defaultCryptoAmount = '',\n defaultWalletAddress = '',\n defaultGateway,\n defaultCountry,\n fieldLocks,\n partnerMetadata,\n statusPollInterval = 5000,\n onComplete,\n onError,\n children,\n } = props;\n\n const apiConfig = useMemo(() => ({ apiUrl, projectId }), [apiUrl, projectId]);\n\n // If no network specified but crypto is, derive a default network.\n // BTC → 'bitcoin' (canonical API ID); others → lowercase ticker (matches Banxa network IDs).\n const defaultNetwork = defaultNetworkProp || (\n defaultCryptoCurrency === 'BTC' ? 'bitcoin'\n : defaultCryptoCurrency ? defaultCryptoCurrency.toLowerCase()\n : ''\n );\n\n // Determine initial step: if all fields are pre-set with a gateway, go to confirm\n // For sell: wallet is optional, so don't require it\n const initialIsSell = flowType === 'sell';\n const hasAmount = initialIsSell ? !!defaultCryptoAmount : !!defaultFiatAmount;\n const hasAllFields = initialIsSell\n ? !!(hasAmount && defaultCryptoCurrency && defaultNetwork)\n : !!(hasAmount && defaultCryptoCurrency && defaultNetwork && defaultWalletAddress);\n const initialStep: RampStep = (hasAllFields && defaultGateway) ? 'confirm' : 'amount';\n\n // Initialize state with defaults\n // Use '250' as default fiat amount for buy if none provided\n const effectiveFiatAmount = defaultFiatAmount || (flowType === 'buy' ? '250' : '');\n const [state, dispatch] = useReducer(rampReducer, {\n ...initialState,\n step: initialStep,\n flowType,\n fiatCurrency: defaultFiatCurrency,\n cryptoCurrency: defaultCryptoCurrency,\n network: defaultNetwork,\n fiatAmount: normalizeAmount(effectiveFiatAmount, 2),\n cryptoAmount: normalizeAmount(defaultCryptoAmount, 6),\n walletAddress: defaultWalletAddress,\n customerId,\n // If defaultCountry is provided, set it immediately with 'manual' source to skip auto-detection\n ...(defaultCountry ? { country: defaultCountry.toLowerCase(), countrySource: 'manual' as const } : {}),\n });\n\n const isSell = state.flowType === 'sell';\n\n // Fetch supported config (pass orderType for sell to get sell-specific currencies/limits)\n // Pass country so backend filters results by region\n const {\n config,\n loading: configLoading,\n error: configError,\n } = useRampConfig(apiConfig, state.flowType, state.country || undefined);\n\n // GeoIP auto-detection: when config loads with detectedCountry and no country is set yet\n const geoAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoAppliedRef.current) return;\n if (!config?.detectedCountry) return;\n // Skip if country already set (defaultCountry prop or manual selection)\n if (state.country) return;\n\n geoAppliedRef.current = true;\n const detected = config.detectedCountry.toLowerCase();\n dispatch({ type: 'SET_COUNTRY_AUTO', country: detected });\n\n // Auto-set fiat currency based on detected country\n const supportedFiats = config.fiats?.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(detected, supportedFiats);\n if (fiat !== state.fiatCurrency && !fieldLocks?.sourceCurrency?.locked && !fiatProvidedRef.current) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [config, state.country, state.fiatCurrency, fieldLocks]);\n\n // When defaultCountry is set and config loads, auto-set fiat for that country\n const defaultCountryAppliedRef = useRef(false);\n React.useEffect(() => {\n if (defaultCountryAppliedRef.current) return;\n if (!defaultCountry || !config?.fiats?.length) return;\n\n defaultCountryAppliedRef.current = true;\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(defaultCountry, supportedFiats);\n if (fiat !== state.fiatCurrency && !fieldLocks?.sourceCurrency?.locked && !fiatProvidedRef.current) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [defaultCountry, config, state.fiatCurrency, fieldLocks]);\n\n // Reset geo-fallback guard when user manually changes country, so the\n // fallback can re-evaluate for the new geo-detected currency\n // Manual country change: auto-update fiat currency when user picks a new country\n const prevCountryRef = useRef(state.country);\n React.useEffect(() => {\n if (state.country === prevCountryRef.current) return;\n prevCountryRef.current = state.country;\n if (state.countrySource === 'manual') {\n geoFallbackAppliedRef.current = false;\n }\n\n // Only auto-switch fiat for manual selections (not initial auto-detection, which is handled above)\n if (state.countrySource !== 'manual') return;\n if (!config?.fiats?.length) return;\n\n const supportedFiats = config.fiats.map((f) => f.code);\n const fiat = getDefaultFiatForCountry(state.country, supportedFiats);\n if (fiat !== state.fiatCurrency && !fieldLocks?.sourceCurrency?.locked) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: fiat });\n }\n }, [state.country, state.countrySource, config, state.fiatCurrency, fieldLocks]);\n\n // When fiat currency changes, ensure the amount meets the new currency's minimum\n // This handles cases like geo-detection switching from USD (250 is fine) to TRY (250 is below min)\n const prevFiatRef = useRef(state.fiatCurrency);\n React.useEffect(() => {\n if (state.fiatCurrency === prevFiatRef.current) return;\n prevFiatRef.current = state.fiatCurrency;\n\n if (isSell || !config?.fiats?.length || !state.fiatAmount) return;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat?.minAmount) return;\n\n const currentAmount = parseFloat(state.fiatAmount);\n const minAmount = parseFloat(fiat.minAmount);\n if (!isNaN(currentAmount) && !isNaN(minAmount) && currentAmount < minAmount) {\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: String(Math.ceil(minAmount)) });\n }\n }, [state.fiatCurrency, state.fiatAmount, config, isSell]);\n\n // --- Cascading provider-aware filters ---\n const { availableFiats, availableCryptos, availablePaymentMethods } = useMemo(() => {\n if (!config) {\n return { availableFiats: [] as SupportedFiat[], availableCryptos: [] as SupportedCrypto[], availablePaymentMethods: [] as SupportedPaymentMethod[] };\n }\n\n // Resolve selected network's providers\n let networkProviders: string[] | undefined;\n if (state.cryptoCurrency && state.network) {\n const crypto = config.cryptos?.find((c) => c.code === state.cryptoCurrency);\n const network = crypto?.networks?.find((n) => n.id === state.network);\n if (!crypto || !network) {\n networkProviders = [];\n } else {\n networkProviders = network.providers;\n }\n }\n\n // Resolve selected fiat's providers\n let fiatProviders: string[] | undefined;\n if (state.fiatCurrency) {\n const fiat = config.fiats?.find((f) => f.code === state.fiatCurrency);\n if (!fiat) {\n fiatProviders = [];\n } else {\n fiatProviders = fiat.providers;\n }\n }\n\n return {\n availableFiats: filterAvailableFiats(config.fiats ?? [], networkProviders),\n availableCryptos: filterAvailableCryptos(config.cryptos ?? [], fiatProviders),\n availablePaymentMethods: filterAvailablePaymentMethods(\n config.paymentMethods ?? [], networkProviders, state.fiatCurrency\n ),\n };\n }, [config, state.cryptoCurrency, state.network, state.fiatCurrency]);\n\n // Derived flag: locked selection has no provider support\n const selectionUnsupported = useMemo(() => {\n if (configLoading || !config) return false;\n return isSelectionUnsupported(\n config,\n { cryptoCurrency: state.cryptoCurrency, network: state.network, fiatCurrency: state.fiatCurrency },\n {\n cryptoLocked: !!fieldLocks?.destinationCurrency?.locked,\n networkLocked: !!fieldLocks?.network?.locked,\n fiatLocked: !!fieldLocks?.sourceCurrency?.locked,\n },\n { availableFiats, availableCryptos, availablePaymentMethods }\n );\n }, [configLoading, config, fieldLocks, state.cryptoCurrency, state.network,\n state.fiatCurrency, availableFiats, availableCryptos, availablePaymentMethods]);\n\n // Reconcile selections when filtered lists change\n React.useEffect(() => {\n if (configLoading) return;\n if (availableFiats.length === 0 && availableCryptos.length === 0) return;\n\n const corrections = reconcileSelections(\n {\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n fiatCurrency: state.fiatCurrency,\n paymentMethodId: state.paymentMethodId,\n },\n { availableFiats, availableCryptos, availablePaymentMethods },\n {\n cryptoLocked: !!fieldLocks?.destinationCurrency?.locked,\n networkLocked: !!fieldLocks?.network?.locked,\n fiatLocked: !!fieldLocks?.sourceCurrency?.locked,\n }\n );\n\n if (!corrections) return;\n\n if (corrections.cryptoCurrency !== undefined) {\n dispatch({ type: 'SET_CRYPTO_CURRENCY', currency: corrections.cryptoCurrency });\n }\n if (corrections.network !== undefined) {\n dispatch({ type: 'SET_NETWORK', network: corrections.network });\n }\n if (corrections.fiatCurrency !== undefined) {\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: corrections.fiatCurrency });\n }\n if (corrections.paymentMethodId !== undefined) {\n dispatch({ type: 'SET_PAYMENT_METHOD', methodId: corrections.paymentMethodId });\n }\n }, [configLoading, availableFiats, availableCryptos, availablePaymentMethods,\n state.cryptoCurrency, state.network, state.fiatCurrency, state.paymentMethodId,\n fieldLocks, dispatch]);\n\n // Amount validation against min/max limits\n // Computed before quoteParams so invalid amounts never trigger a fetch\n // For sell, user enters crypto amount — skip fiat-based validation (backend validates)\n const amountError = useMemo(() => {\n if (isSell) {\n // For sell, basic presence check only — backend validates crypto amount limits\n if (!state.cryptoAmount) return null;\n const amount = parseFloat(state.cryptoAmount);\n if (isNaN(amount) || amount <= 0) return 'Enter a valid amount';\n return null;\n }\n\n if (!config || !state.fiatAmount) return null;\n\n const amount = parseFloat(state.fiatAmount);\n if (isNaN(amount)) return null;\n\n const fiat = config.fiats.find((f) => f.code === state.fiatCurrency);\n if (!fiat) return null;\n\n const min = parseFloat(fiat.minAmount);\n const max = parseFloat(fiat.maxAmount);\n\n if (!isNaN(min) && amount < min) {\n return `Minimum amount is ${fiat.minAmount} ${state.fiatCurrency}`;\n }\n if (!isNaN(max) && amount > max) {\n return `Maximum amount is ${fiat.maxAmount} ${state.fiatCurrency}`;\n }\n return null;\n }, [config, state.fiatAmount, state.fiatCurrency, state.cryptoAmount, isSell]);\n\n // Fetch quotes when form is filled, config loaded, and amount is valid\n // Wait for geo-detection to resolve before fetching (prevents wasted initial fetch\n // that gets cancelled when fiat currency changes from USD to the detected currency)\n const quoteParams = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n if (!config || !hasAmount || !state.fiatCurrency || !state.cryptoCurrency || !state.network) {\n return null;\n }\n if (amountError) {\n return null;\n }\n // If backend detected a country but geo-detection effect hasn't applied yet, wait\n if (config.detectedCountry && state.countrySource === '' && !defaultCountry) {\n return null;\n }\n return {\n fiatCurrency: state.fiatCurrency,\n ...(isSell ? { cryptoAmount: state.cryptoAmount } : { fiatAmount: state.fiatAmount }),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n paymentMethodId: state.paymentMethodId || undefined,\n country: state.country || undefined,\n orderType: state.flowType,\n };\n }, [config, state.fiatCurrency, state.fiatAmount, state.cryptoAmount, state.cryptoCurrency, state.network, state.paymentMethodId, state.country, state.countrySource, amountError, isSell, state.flowType, defaultCountry]);\n\n const {\n quotes,\n loading: quotesLoading,\n error: quotesError,\n refetch: fetchQuotes,\n } = useQuotes(apiConfig, quoteParams);\n\n const quotesEmpty = isQuotesEmpty(quotesLoading, quotes, quoteParams);\n\n // Fallback: if geo-detected fiat returns no quotes for the default crypto, fall back to USD\n // This handles cases where a local currency (e.g. NGN) has no provider pairs with BTC\n // Only triggers when quotes loaded successfully with zero results — never on API errors\n const geoFallbackAppliedRef = useRef(false);\n React.useEffect(() => {\n if (geoFallbackAppliedRef.current) return;\n // Only apply for auto-detected currencies, not manual selections\n if (state.countrySource !== 'auto') return;\n if (fieldLocks?.sourceCurrency?.locked || fiatProvidedRef.current) return;\n // Wait until quotes have actually loaded (not loading, not null params)\n if (quotesLoading || !quoteParams) return;\n // Skip fallback on API errors — only fall back when the response succeeded\n // but contained no quotes (i.e. quotes object exists with no bestQuote)\n if (quotesError || !quotes) return;\n // If we got quotes, no fallback needed\n if (quotes.bestQuote) return;\n // If the fiat is already USD, nothing to fall back to\n if (state.fiatCurrency === 'USD') return;\n\n geoFallbackAppliedRef.current = true;\n dispatch({ type: 'SET_FIAT_CURRENCY', currency: 'USD' });\n dispatch({ type: 'SET_FIAT_AMOUNT', amount: '250' });\n }, [quotes, quotesLoading, quotesError, quoteParams, state.countrySource, state.fiatCurrency]);\n\n // Order creation\n const {\n order,\n loading: orderLoading,\n error: orderError,\n createOrder: createOrderApi,\n } = useCheckoutIntent(apiConfig);\n\n // Order status polling — delay the initial fetch to give the checkout\n // iframe time to load before we start polling. Without this, the first\n // poll can return a 'processing' status from the provider and the\n // CheckoutStep immediately transitions to ProcessingStep before the\n // user even sees the iframe (race condition with iframe-based providers\n // like Banxa that move to 'processing' quickly).\n const CHECKOUT_POLL_INITIAL_DELAY = 15_000; // 15 seconds\n\n const {\n status: orderStatus,\n loading: orderStatusLoading,\n } = useTransaction(\n { apiUrl },\n order?.orderId ?? null,\n { pollInterval: statusPollInterval, initialDelay: CHECKOUT_POLL_INITIAL_DELAY }\n );\n\n // Handle order completion — fire once per order for all terminal statuses\n const terminalFiredForRef = useRef<string | null>(null);\n React.useEffect(() => {\n if (!orderStatus?.status || !onComplete) return;\n if (!TERMINAL_STATUSES.includes(orderStatus.status)) return;\n if (terminalFiredForRef.current === orderStatus.orderId) return;\n terminalFiredForRef.current = orderStatus.orderId;\n onComplete(orderStatus);\n }, [orderStatus?.status, orderStatus?.orderId, onComplete]);\n\n // Handle errors — only propagate config and order errors as fatal.\n // Quote errors are non-fatal (validation rejections, transient failures)\n // and are already surfaced via quotesError in the UI.\n React.useEffect(() => {\n const error = configError || orderError;\n if (error && onError) {\n onError(error);\n }\n }, [configError, orderError, onError]);\n\n // Resolve effective default gateway: explicit prop > project config\n const effectiveDefaultGateway = defaultGateway || config?.defaultGateway || null;\n\n const bestUnavailableReason = useMemo(() => {\n if (!quotesEmpty || !quotes?.unavailableGateways) return null;\n // Prefer server-resolved preferred gateway; fall back to frontend heuristic\n const preferred = quotes.preferredGatewayId || effectiveDefaultGateway;\n return pickBestUnavailableReason(quotes.unavailableGateways, preferred);\n }, [quotesEmpty, quotes, effectiveDefaultGateway]);\n\n // Use refs to avoid stale closures — async data loads mean callbacks may\n // capture earlier null values even with useCallback deps.\n const gatewayRef = useRef(effectiveDefaultGateway);\n gatewayRef.current = effectiveDefaultGateway;\n\n const quotesRef = useRef(quotes);\n quotesRef.current = quotes;\n\n const brandIdRef = useRef(brandId);\n brandIdRef.current = brandId;\n\n // Create order handler\n const createOrder = useCallback(async () => {\n const gateway = state.selectedQuote?.gatewayId || quotesRef.current?.bestQuote?.gatewayId || gatewayRef.current;\n if (!gateway || !state.walletAddress) {\n const missing = [!gateway && 'gateway', !state.walletAddress && 'walletAddress'].filter(Boolean).join(', ');\n dispatch({ type: 'SET_ERROR', message: `Missing required fields: ${missing}` });\n return;\n }\n\n try {\n await createOrderApi({\n gateway,\n customerId: state.customerId || undefined,\n fiatCurrency: state.fiatCurrency,\n ...(isSell\n ? { cryptoAmount: state.cryptoAmount }\n : { fiatAmount: state.fiatAmount }\n ),\n cryptoCurrency: state.cryptoCurrency,\n network: state.network,\n walletAddress: state.walletAddress,\n paymentMethodId: state.paymentMethodId || undefined,\n email: state.email || undefined,\n orderType: state.flowType,\n ...(brandIdRef.current ? { metadata: { brand: brandIdRef.current } } : {}),\n ...(partnerMetadata && Object.keys(partnerMetadata).length > 0 ? { partnerMetadata } : {}),\n });\n\n // Move to checkout step\n dispatch({ type: 'SET_STEP', step: 'checkout' });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create order';\n // Wallet address validation errors stay inline instead of going to error screen\n if (/wallet|address/i.test(message)) {\n dispatch({ type: 'SET_WALLET_ERROR', message: message.replace(/^Failed to create checkout intent:\\s*/i, '') });\n } else {\n dispatch({ type: 'SET_ERROR', message });\n }\n }\n }, [state, createOrderApi, isSell, partnerMetadata]);\n\n // Navigation helpers\n const goToStep = useCallback((step: RampStep) => {\n dispatch({ type: 'SET_STEP', step });\n }, []);\n\n const goBack = useCallback(() => {\n const stepOrder: RampStep[] = ['confirm', 'amount', 'quotes', 'wallet', 'checkout', 'processing', 'complete'];\n const currentIndex = stepOrder.indexOf(state.step);\n if (currentIndex > 0) {\n dispatch({ type: 'SET_STEP', step: stepOrder[currentIndex - 1] });\n }\n }, [state.step, isSell]);\n\n // Check if user can proceed to next step\n const canProceed = useMemo(() => {\n const hasAmount = isSell ? !!state.cryptoAmount : !!state.fiatAmount;\n switch (state.step) {\n case 'confirm':\n return !!(hasAmount && state.cryptoCurrency && state.network && state.walletAddress && !amountError);\n case 'amount':\n return !!(hasAmount && state.cryptoCurrency && state.network && !amountError);\n case 'quotes':\n return !!state.selectedQuote;\n case 'wallet':\n return !!state.walletAddress;\n default:\n return false;\n }\n }, [state, amountError, isSell]);\n\n const value: RampContextValue = {\n apiConfig,\n assetBaseUrl,\n config,\n configLoading,\n configError,\n state,\n dispatch,\n quotes,\n quotesLoading,\n quotesError,\n fetchQuotes,\n order,\n orderLoading,\n orderError,\n createOrder,\n orderStatus,\n orderStatusLoading,\n fieldLocks: fieldLocks || null,\n defaultGateway: effectiveDefaultGateway,\n availableFiats,\n availableCryptos,\n availablePaymentMethods,\n selectionUnsupported,\n quotesEmpty,\n bestUnavailableReason,\n amountError,\n goToStep,\n goBack,\n canProceed,\n };\n\n return (\n <RampContext.Provider value={value}>\n {children}\n </RampContext.Provider>\n );\n}\n\n/**\n * Hook to access ramp context\n */\nexport function useRamp(): RampContextValue {\n const context = useContext(RampContext);\n if (!context) {\n throw new Error('useRamp must be used within a RampProvider');\n }\n return context;\n}\n","/**\n * English (base) translation dictionary.\n * All keys referenced by form components live here.\n * Use {variable} for interpolation placeholders.\n */\nconst en = {\n // ─── Header ───\n 'header.buy': 'Buy',\n 'header.sell': 'Sell',\n\n // ─── SpendCard ───\n 'spend.label': 'You spend',\n 'spend.placeholderFiat': '250',\n 'spend.placeholderCrypto': '0.01',\n\n // ─── ReceiveCard ───\n 'receive.label': 'You get',\n 'receive.fetchingRate': 'Fetching best rate...',\n\n // ─── PaymentCard ───\n 'payment.label': 'Payment method',\n 'payment.select': 'Select',\n 'payment.noneAvailable': 'No payment methods for this pair',\n\n // ─── ProviderCard ───\n 'provider.label': 'By',\n 'provider.select': 'Select',\n\n // ─── WalletCard ───\n 'wallet.label': 'Receiving wallet address',\n 'wallet.placeholderBuy': 'Enter your receiving address',\n 'wallet.placeholderSell': 'Enter your sending address',\n 'wallet.validating': 'Validating address...',\n 'wallet.invalid': 'Enter a valid wallet address',\n 'wallet.invalidServer': 'Invalid wallet address',\n\n // ─── CtaButton ───\n 'cta.buy': 'Buy {crypto}',\n 'cta.sell': 'Sell {crypto}',\n 'cta.gettingPrice': 'Getting best price...',\n 'cta.processing': 'Processing...',\n\n // ─── Footer ───\n 'footer.poweredBy': 'Powered by ',\n 'footer.brand': 'NowRamp',\n\n // ─── Rate Breakdown ───\n 'rate.title': 'Rate breakdown',\n 'rate.close': 'Close',\n 'rate.updatesIn': 'Rate updates in 00:{seconds}',\n 'rate.noQuote': 'No quote available',\n 'rate.exchangeRate': 'Exchange rate',\n 'rate.processingFee': 'Processing fee',\n 'rate.networkFee': 'Network fee',\n 'rate.provider': 'Provider',\n 'rate.updatesInLabel': 'Rate updates in',\n 'rate.networkFeeIncl': 'Network fee incl.',\n 'rate.rateTooltip': 'As the market is highly volatile, we can fix the exchange rate for no longer than 30 seconds.',\n 'rate.networkFeeTooltip': 'Includes a fee charged by blockchain to execute the transaction.',\n 'rate.feeIncluded': '{percentage}% incl.',\n\n // ─── Toast ───\n 'toast.orderCreated': 'Order created',\n 'toast.redirecting': 'Redirecting to checkout...',\n 'toast.orderFailed': 'Order failed',\n 'toast.couldNotCreate': 'Could not create order',\n 'toast.quoteError': 'Quote error',\n 'toast.noProviders': 'No providers',\n 'toast.somethingWrong': 'Something went wrong',\n\n // ─── Form errors ───\n 'error.amountZero': 'Amount should be more than 0',\n 'error.minAmountFiat': 'Minimum amount is {min} {currency}',\n 'error.minAmountCrypto': 'Minimum amount is {min} {currency}',\n 'error.noProviders': 'No providers available for this combination',\n 'error.currencyUnavailableBuy': 'This currency is not available for buy orders',\n 'error.currencyUnavailableSell': 'This currency is not available for sell orders',\n\n // ─── Parity banner ───\n 'parity.info': 'You will be charged for {receiveAmount} {crypto}, the rest up to {spendAmount} {fiat} will be credited to your {partner} account',\n\n // ─── Redirect Screen ───\n 'redirect.secureBadge': 'Secure payment',\n 'redirect.title': 'Continue Payment',\n 'redirect.description': \"You'll be redirected to {gateway} to complete your payment.\",\n 'redirect.countdown': 'Redirecting in {seconds}...',\n 'redirect.openTab': 'Open ACH in new tab',\n 'redirect.cancel': 'Cancel',\n 'redirect.tabHelper': 'If the new tab has not opened, click the button above.',\n\n // ─── Checkout Step ───\n 'checkout.noOrder': 'No order found',\n 'checkout.goBack': 'Go Back',\n 'checkout.expired': 'Checkout expired',\n 'checkout.expiredDesc': 'The session has expired. Please try again.',\n 'checkout.startOver': 'Start over',\n 'checkout.cancel': 'Cancel',\n 'checkout.loading': 'Loading checkout...',\n 'checkout.iframeTitle': 'Provider Checkout',\n 'checkout.widgetTitle': 'Payment Checkout',\n 'checkout.unknownMethod': 'Unknown checkout method',\n\n // ─── Processing Step ───\n 'processing.default': 'Processing your order...',\n 'processing.pending': 'Waiting for payment confirmation...',\n 'processing.active': 'Processing your transaction...',\n 'processing.generic': 'Processing...',\n 'processing.checkingStatus': 'Checking status...',\n 'processing.orderId': 'Order ID',\n 'processing.provider': 'Provider',\n 'processing.amount': 'Amount',\n 'processing.receiving': 'Receiving',\n 'processing.network': 'Network',\n 'processing.toAddress': 'To Address',\n 'processing.usuallyMinutes': 'This usually takes a few minutes.',\n 'processing.safeToClose': \"You can safely close this page - we'll send you an email when complete.\",\n\n // ─── Complete Step ───\n 'complete.buyTitle': 'Purchase Complete!',\n 'complete.sellTitle': 'Sale Complete!',\n 'complete.buyDesc': 'Your {crypto} has been sent to your wallet.',\n 'complete.sellDesc': 'Your {fiat} payout is being processed.',\n 'complete.amountBuy': 'Amount Received',\n 'complete.amountSell': 'Amount Sold',\n 'complete.paidBuy': 'Amount Paid',\n 'complete.paidSell': 'Payout Amount',\n 'complete.network': 'Network',\n 'complete.wallet': 'Wallet',\n 'complete.transaction': 'Transaction',\n 'complete.provider': 'Provider',\n 'complete.orderId': 'Order ID',\n 'complete.completed': 'Completed',\n 'complete.viewExplorer': 'View on Explorer',\n 'complete.done': 'Done',\n\n // ─── Error Step ───\n 'errorStep.failed': 'Payment Failed',\n 'errorStep.cancelled': 'Order Cancelled',\n 'errorStep.expired': 'Order Expired',\n 'errorStep.refunded': 'Order Refunded',\n 'errorStep.unknown': 'Something Went Wrong',\n 'errorStep.failedBuy': 'Your payment could not be processed. Please try again or use a different payment method.',\n 'errorStep.failedSell': 'Your sale could not be processed. Please try again.',\n 'errorStep.cancelledBuy': 'Your order was cancelled. No payment was processed.',\n 'errorStep.cancelledSell': 'Your sale was cancelled. No crypto was transferred.',\n 'errorStep.expiredBuy': 'Your order has expired. Please start a new purchase.',\n 'errorStep.expiredSell': 'Your order has expired. Please start a new sale.',\n 'errorStep.refundedBuy': 'Your payment has been refunded. The funds should appear in your account within 5-10 business days.',\n 'errorStep.refundedSell': 'Your crypto has been returned. The funds should appear in your wallet shortly.',\n 'errorStep.genericDesc': 'An unexpected error occurred. Please try again.',\n 'errorStep.orderId': 'Order ID',\n 'errorStep.tryAgain': 'Try Again',\n 'errorStep.startOver': 'Start Over',\n 'errorStep.return': 'Return',\n 'errorStep.needHelp': 'Need help? Contact ',\n 'errorStep.reference': 'Reference: {orderId}',\n\n // ─── Confirm Step ───\n 'confirm.buyTitle': 'Confirm Purchase',\n 'confirm.sellTitle': 'Confirm Sale',\n 'confirm.loading': 'Loading...',\n 'confirm.provider': 'Provider',\n 'confirm.youPay': 'You pay',\n 'confirm.youSell': 'You sell',\n 'confirm.youReceive': 'You receive',\n 'confirm.wallet': 'Wallet',\n 'confirm.network': 'Network',\n 'confirm.refundAddress': 'Refund address',\n 'confirm.parityNote': 'Charged amount from provider may differ. The rest up to {amount} {crypto} will be credited to your {partner} account.',\n 'confirm.processing': 'Processing...',\n 'confirm.confirmPay': 'Confirm & Pay',\n 'confirm.confirmSell': 'Confirm & Sell',\n 'confirm.payout': '{currency} payout',\n 'confirm.cryptoOnNetwork': '{crypto} on {network}',\n\n // ─── Payment method short names ───\n 'payment.name.card': 'Card',\n 'payment.name.bankTransfer': 'Bank Transfer',\n 'payment.name.ach': 'ACH',\n\n // ─── Modals ───\n 'modal.selectFiat': 'Select fiat currency',\n 'modal.selectCrypto': 'Select crypto currency',\n 'modal.choosePayment': 'Choose payment method',\n 'modal.selectCountry': 'Select your country',\n 'modal.selectLanguage': 'Select language',\n 'modal.popular': 'Popular',\n 'modal.recommended': 'Recommended',\n 'modal.noCurrencies': 'No currencies found',\n 'modal.noPaymentMethods': 'No payment methods found',\n 'modal.noCountries': 'No countries found',\n 'modal.noLanguages': 'No languages found',\n\n // ─── ChooseRampModal ───\n 'modal.chooseRamp': 'Choose Ramp',\n 'modal.bestPrice': 'Best price',\n 'modal.noQuotes': 'No quotes available for this request',\n 'modal.noProvidersFound': 'No providers found',\n\n // ─── PaymentMethodSelector (legacy) ───\n 'payment.unavailableFor': 'No payment methods available for {currency}',\n\n // ─── Skeleton ───\n 'skeleton.poweredBy': 'Powered by NowRamp',\n\n // ─── ConfirmStep (catch fallback) ───\n 'error.createOrderFailed': 'Failed to create order',\n\n // ─── ErrorStep aria-label fallback ───\n 'errorStep.returnToMerchant': 'Return to merchant',\n\n // ─── Settings ───\n 'settings.location': 'Location',\n 'settings.darkMode': 'Dark Mode',\n 'settings.privacy': 'Privacy policy',\n 'settings.terms': 'Terms of use',\n 'settings.language': 'Language',\n} as const;\n\nexport type TranslationKey = keyof typeof en;\nexport type TranslationDict = Record<TranslationKey, string>;\nexport default en;\n","/** Supported language codes */\nexport type LanguageCode =\n | 'en' | 'es' | 'fr' | 'de' | 'pt' | 'it' | 'nl'\n | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'tr'\n | 'pl' | 'vi' | 'th' | 'id' | 'uk' | 'cs'\n | 'bg' | 'hr' | 'da' | 'et' | 'fi' | 'el'\n | 'hu' | 'ga' | 'lv' | 'lt' | 'mt' | 'ro'\n | 'sk' | 'sl' | 'sv'\n | 'ur' | 'fa'\n | 'bn' | 'ta' | 'te' | 'mr' | 'gu' | 'kn' | 'ml';\n\nexport interface LanguageInfo {\n code: LanguageCode;\n /** Native name displayed in language picker */\n name: string;\n /** English name for accessibility */\n english: string;\n}\n\nexport const LANGUAGES: LanguageInfo[] = [\n { code: 'en', name: 'English', english: 'English' },\n { code: 'es', name: 'Español', english: 'Spanish' },\n { code: 'fr', name: 'Français', english: 'French' },\n { code: 'de', name: 'Deutsch', english: 'German' },\n { code: 'pt', name: 'Português', english: 'Portuguese' },\n { code: 'it', name: 'Italiano', english: 'Italian' },\n { code: 'nl', name: 'Nederlands', english: 'Dutch' },\n { code: 'ru', name: 'Русский', english: 'Russian' },\n { code: 'zh', name: '中文', english: 'Chinese' },\n { code: 'ja', name: '日本語', english: 'Japanese' },\n { code: 'ko', name: '한국어', english: 'Korean' },\n { code: 'ar', name: 'العربية', english: 'Arabic' },\n { code: 'hi', name: 'हिन्दी', english: 'Hindi' },\n { code: 'tr', name: 'Türkçe', english: 'Turkish' },\n { code: 'pl', name: 'Polski', english: 'Polish' },\n { code: 'vi', name: 'Tiếng Việt', english: 'Vietnamese' },\n { code: 'th', name: 'ไทย', english: 'Thai' },\n { code: 'id', name: 'Bahasa Indonesia', english: 'Indonesian' },\n { code: 'uk', name: 'Українська', english: 'Ukrainian' },\n { code: 'cs', name: 'Čeština', english: 'Czech' },\n { code: 'bg', name: 'Български', english: 'Bulgarian' },\n { code: 'hr', name: 'Hrvatski', english: 'Croatian' },\n { code: 'da', name: 'Dansk', english: 'Danish' },\n { code: 'et', name: 'Eesti', english: 'Estonian' },\n { code: 'fi', name: 'Suomi', english: 'Finnish' },\n { code: 'el', name: 'Ελληνικά', english: 'Greek' },\n { code: 'hu', name: 'Magyar', english: 'Hungarian' },\n { code: 'ga', name: 'Gaeilge', english: 'Irish' },\n { code: 'lv', name: 'Latviešu', english: 'Latvian' },\n { code: 'lt', name: 'Lietuvių', english: 'Lithuanian' },\n { code: 'mt', name: 'Malti', english: 'Maltese' },\n { code: 'ro', name: 'Română', english: 'Romanian' },\n { code: 'sk', name: 'Slovenčina', english: 'Slovak' },\n { code: 'sl', name: 'Slovenščina', english: 'Slovenian' },\n { code: 'sv', name: 'Svenska', english: 'Swedish' },\n { code: 'ur', name: 'اردو', english: 'Urdu' },\n { code: 'fa', name: 'فارسی', english: 'Persian' },\n { code: 'bn', name: 'বাংলা', english: 'Bengali' },\n { code: 'ta', name: 'தமிழ்', english: 'Tamil' },\n { code: 'te', name: 'తెలుగు', english: 'Telugu' },\n { code: 'mr', name: 'मराठी', english: 'Marathi' },\n { code: 'gu', name: 'ગુજરાતી', english: 'Gujarati' },\n { code: 'kn', name: 'ಕನ್ನಡ', english: 'Kannada' },\n { code: 'ml', name: 'മലയാളം', english: 'Malayalam' },\n];\n","/**\n * i18n Context\n * Provides translation function and language switching.\n */\nimport { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react';\nimport type { TranslationKey, TranslationDict } from './en';\nimport en from './en';\nimport { LANGUAGES, type LanguageCode } from './languages';\n\ninterface I18nContextValue {\n /** Current language code */\n locale: LanguageCode;\n /** Set the active language */\n setLocale: (code: LanguageCode) => void;\n /** Translate a key, with optional interpolation variables */\n t: (key: TranslationKey, vars?: Record<string, string | number>) => string;\n /** List of available languages */\n languages: typeof LANGUAGES;\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\n// Lazy-load translation modules (only English is bundled eagerly)\nconst loaders: Record<LanguageCode, () => Promise<{ default: TranslationDict }>> = {\n en: () => Promise.resolve({ default: en }),\n es: () => import('./translations/es'),\n fr: () => import('./translations/fr'),\n de: () => import('./translations/de'),\n pt: () => import('./translations/pt'),\n it: () => import('./translations/it'),\n nl: () => import('./translations/nl'),\n ru: () => import('./translations/ru'),\n zh: () => import('./translations/zh'),\n ja: () => import('./translations/ja'),\n ko: () => import('./translations/ko'),\n ar: () => import('./translations/ar'),\n hi: () => import('./translations/hi'),\n tr: () => import('./translations/tr'),\n pl: () => import('./translations/pl'),\n vi: () => import('./translations/vi'),\n th: () => import('./translations/th'),\n id: () => import('./translations/id'),\n uk: () => import('./translations/uk'),\n cs: () => import('./translations/cs'),\n bg: () => import('./translations/bg'),\n hr: () => import('./translations/hr'),\n da: () => import('./translations/da'),\n et: () => import('./translations/et'),\n fi: () => import('./translations/fi'),\n el: () => import('./translations/el'),\n hu: () => import('./translations/hu'),\n ga: () => import('./translations/ga'),\n lv: () => import('./translations/lv'),\n lt: () => import('./translations/lt'),\n mt: () => import('./translations/mt'),\n ro: () => import('./translations/ro'),\n sk: () => import('./translations/sk'),\n sl: () => import('./translations/sl'),\n sv: () => import('./translations/sv'),\n ur: () => import('./translations/ur'),\n fa: () => import('./translations/fa'),\n bn: () => import('./translations/bn'),\n ta: () => import('./translations/ta'),\n te: () => import('./translations/te'),\n mr: () => import('./translations/mr'),\n gu: () => import('./translations/gu'),\n kn: () => import('./translations/kn'),\n ml: () => import('./translations/ml'),\n};\n\n// Cache loaded dictionaries\nconst cache: Partial<Record<LanguageCode, TranslationDict>> = { en };\n\nfunction interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const val = vars[key];\n return val !== undefined ? String(val) : `{${key}}`;\n });\n}\n\nexport function I18nProvider({\n defaultLocale = 'en',\n children,\n}: {\n defaultLocale?: LanguageCode;\n children: React.ReactNode;\n}) {\n const [locale, setLocaleState] = useState<LanguageCode>(defaultLocale);\n const [dict, setDict] = useState<TranslationDict>(cache[defaultLocale] || en);\n\n // Sync when defaultLocale prop changes after mount\n useEffect(() => {\n setLocaleState(defaultLocale);\n if (cache[defaultLocale]) {\n setDict(cache[defaultLocale]);\n } else {\n const loader = loaders[defaultLocale];\n if (loader) {\n loader().then((mod) => {\n cache[defaultLocale] = mod.default;\n setDict(mod.default);\n });\n }\n }\n }, [defaultLocale]);\n\n const setLocale = useCallback((code: LanguageCode) => {\n setLocaleState(code);\n if (cache[code]) {\n setDict(cache[code]);\n return;\n }\n const loader = loaders[code];\n if (loader) {\n loader().then((mod) => {\n cache[code] = mod.default;\n setDict(mod.default);\n });\n }\n }, []);\n\n const t = useCallback(\n (key: TranslationKey, vars?: Record<string, string | number>) => {\n const template = dict[key] || en[key] || key;\n return interpolate(template, vars);\n },\n [dict],\n );\n\n const value = useMemo(\n () => ({ locale, setLocale, t, languages: LANGUAGES }),\n [locale, setLocale, t],\n );\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\n/** Hook to access translation function and locale controls */\nexport function useI18n() {\n const ctx = useContext(I18nContext);\n if (!ctx) {\n // Fallback for components used outside provider — returns English\n return {\n locale: 'en' as LanguageCode,\n setLocale: () => {},\n t: (key: TranslationKey, vars?: Record<string, string | number>) =>\n interpolate(en[key] || key, vars),\n languages: LANGUAGES,\n };\n }\n return ctx;\n}\n\n/** Shorthand hook — returns just the `t` function */\nexport function useT() {\n return useI18n().t;\n}\n","import { useT } from '../../i18n';\n\nexport interface RedirectScreenProps {\n gatewayName: string;\n checkoutUrl: string;\n onCancel: () => void;\n redirectCountdown: number | null;\n}\n\nexport function RedirectScreen({\n gatewayName,\n checkoutUrl,\n onCancel,\n redirectCountdown,\n}: RedirectScreenProps) {\n const t = useT();\n return (\n <div\n className=\"flex flex-col items-center justify-center px-8 py-12 text-center flex-1\"\n style={{ background: 'var(--t-redirect-bg)', color: '#ffffff' }}\n >\n {/* Security badge */}\n <div\n className=\"flex items-center gap-1.5 px-3 py-1.5 mb-6\"\n style={{ background: 'rgba(255,255,255,0.2)', borderRadius: 'var(--t-pill-radius)' }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 1L2 3v3c0 2.5 1.7 4.8 4 5.5 2.3-.7 4-3 4-5.5V3L6 1z\" fill=\"#22c55e\" />\n <path d=\"M5 6.5l1 1 2-2.5\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"text-[11px] font-medium\">{t('redirect.secureBadge')}</span>\n </div>\n\n <h3 className=\"text-[20px] font-semibold mb-2\">{t('redirect.title')}</h3>\n <p className=\"text-[14px] mb-2 opacity-90\">\n {t('redirect.description', { gateway: gatewayName })}\n </p>\n {redirectCountdown !== null && (\n <p className=\"text-[13px] mb-6 opacity-70\">\n {t('redirect.countdown', { seconds: String(redirectCountdown) })}\n </p>\n )}\n\n <a\n href={checkoutUrl}\n className=\"w-full font-medium text-[16px] flex items-center justify-center gap-2 transition-all\"\n style={{\n height: 52,\n borderRadius: 'var(--t-cta-radius)',\n background: '#ffffff',\n color: '#000000',\n textDecoration: 'none',\n }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {t('redirect.openTab')}\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M4 1.5h8.5V10M12 2L2 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </a>\n\n <p className=\"text-[11px] mt-2 opacity-60\">\n {t('redirect.tabHelper')}\n </p>\n\n <button\n className=\"w-full font-medium text-[14px] mt-2 transition-all\"\n style={{\n height: 48,\n borderRadius: 'var(--t-cta-radius)',\n background: 'rgba(255,255,255,0.2)',\n color: '#ffffff',\n }}\n onClick={onCancel}\n >\n {t('redirect.cancel')}\n </button>\n </div>\n );\n}\n","export function Spinner({ size = 48 }: { size?: number }) {\n const borderWidth = size <= 14 ? 1.5 : size <= 20 ? 2 : 3;\n return (\n <div\n className=\"shrink-0\"\n style={{\n width: size,\n height: size,\n border: `${borderWidth}px solid var(--t-border)`,\n borderTopColor: 'var(--t-text)',\n borderRadius: '50%',\n animation: 'nramp-spin 0.8s linear infinite',\n display: 'inline-block',\n verticalAlign: 'middle',\n }}\n />\n );\n}\n","/**\n * Checkout Step Component\n * Displays provider checkout iframe or redirect button.\n * Iframe/widget checkouts render in a full-screen portal overlay.\n */\n\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useRamp } from '../context/RampContext';\nimport { RedirectScreen } from './form/RedirectScreen';\nimport { Spinner } from './ui/Spinner';\nimport { useT } from '../i18n';\n\nexport interface CheckoutStepProps {\n\tclassName?: string;\n\tautoRedirect?: boolean;\n\tredirectDelay?: number;\n}\n\nexport function CheckoutStep({\n\tclassName = '',\n\tautoRedirect = false,\n\tredirectDelay = 3000,\n}: CheckoutStepProps) {\n\tconst { order, orderStatus, goToStep, goBack } = useRamp();\n\tconst t = useT();\n\tconst [iframeLoaded, setIframeLoaded] = useState(false);\n\tconst [redirectCountdown, setRedirectCountdown] = useState<number | null>(null);\n\n\tconst isExpired = order?.checkout.expiresAt ? Date.now() > order.checkout.expiresAt : false;\n\n\t// Handle auto-redirect\n\tuseEffect(() => {\n\t\tif (order?.checkout.method === 'redirect' && autoRedirect && !isExpired) {\n\t\t\tsetRedirectCountdown(Math.ceil(redirectDelay / 1000));\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\twindow.location.href = order.checkout.url;\n\t\t\t}, redirectDelay);\n\n\t\t\tconst countdownInterval = setInterval(() => {\n\t\t\t\tsetRedirectCountdown((prev) => (prev && prev > 1 ? prev - 1 : null));\n\t\t\t}, 1000);\n\n\t\t\treturn () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tclearInterval(countdownInterval);\n\t\t\t};\n\t\t}\n\t}, [order, autoRedirect, redirectDelay, isExpired]);\n\n\t// Navigate on terminal statuses\n\tuseEffect(() => {\n\t\tif (!orderStatus) return;\n\t\tif (orderStatus.status === 'completed') {\n\t\t\tgoToStep('complete');\n\t\t} else if (['failed', 'cancelled', 'expired'].includes(orderStatus.status)) {\n\t\t\tgoToStep('error');\n\t\t}\n\t}, [orderStatus?.status, goToStep]);\n\n\tif (!order) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t<p className=\"text-[15px] mb-4\">{t('checkout.noOrder')}</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tborderRadius: 'var(--t-cta-radius, 100px)',\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\t{t('checkout.goBack')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isExpired) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`flex flex-col items-center justify-center p-8 text-center ${className}`}\n\t\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t\t>\n\t\t\t\t{/* <div className=\"text-[48px] mb-4\">&#9200;</div> */}\n\t\t\t\t<h3 className=\"text-[18px] font-semibold mb-2\">{t('checkout.expired')}</h3>\n\t\t\t\t<p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t{t('checkout.expiredDesc')}\n\t\t\t\t</p>\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"w-full font-semibold text-[16px] transition-all\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 60,\n\t\t\t\t\t\tborderRadius: 'var(--t-cta-radius, 100px)',\n\t\t\t\t\t\tbackground: 'var(--t-cta-bg)',\n\t\t\t\t\t\tcolor: 'var(--t-cta-text)',\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={goBack}\n\t\t\t\t>\n\t\t\t\t\t{t('checkout.startOver')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Iframe checkout — full-screen portal overlay\n\tif (order.checkout.method === 'iframe') {\n\t\tconst iframeSrc = order.checkout.url;\n\t\tconst allowAttr =\n\t\t\torder.checkout.allowedFeatures?.join('; ') ||\n\t\t\t'payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share';\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t{t('checkout.cancel')}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Spinner size={32} />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\t{t('checkout.loading')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={iframeSrc}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow={allowAttr}\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle={t('checkout.iframeTitle')}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\t// Redirect checkout\n\tif (order.checkout.method === 'redirect') {\n\t\treturn (\n\t\t\t<RedirectScreen\n\t\t\t\tgatewayName={order.gateway}\n\t\t\t\tcheckoutUrl={order.checkout.url}\n\t\t\t\tonCancel={goBack}\n\t\t\t\tredirectCountdown={redirectCountdown}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Widget checkout — full-screen portal overlay\n\tif (order.checkout.method === 'widget' && order.widgetConfig) {\n\t\tconst widgetUrl = buildWidgetUrl(order.checkout.url, order.widgetConfig);\n\n\t\treturn createPortal(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tinset: 0,\n\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tbackground: '#000',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{/* Top bar with back button */}\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\theight: 48,\n\t\t\t\t\t\tpaddingLeft: 8,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: '#111',\n\t\t\t\t\t\tflexShrink: 0,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={goBack}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\tgap: 6,\n\t\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\tfontSize: 14,\n\t\t\t\t\t\t\tfontWeight: 500,\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tpadding: '8px 12px',\n\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t<path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t{t('checkout.cancel')}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Iframe fills remaining space */}\n\t\t\t\t<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>\n\t\t\t\t\t{!iframeLoaded && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Spinner size={32} />\n\t\t\t\t\t\t\t<p style={{ color: '#888', fontSize: 14, marginTop: 16 }}>\n\t\t\t\t\t\t\t\t{t('checkout.loading')}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc={widgetUrl}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: iframeLoaded ? 'block' : 'none',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tallow=\"payment; camera; microphone; geolocation; clipboard-read; clipboard-write; accelerometer; gyroscope; magnetometer; fullscreen; autoplay; encrypted-media; web-share\"\n\t\t\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t\t\ttitle={t('checkout.widgetTitle')}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>,\n\t\t\tdocument.body\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex flex-col items-center justify-center p-8 ${className}`}\n\t\t\tstyle={{ color: 'var(--t-text)' }}\n\t\t>\n\t\t\t<p className=\"text-[15px] mb-4\">{t('checkout.unknownMethod')}</p>\n\t\t\t<button\n\t\t\t\tclassName=\"font-semibold text-[14px] transition-all\"\n\t\t\t\tstyle={{\n\t\t\t\t\theight: 48,\n\t\t\t\t\tborderRadius: 'var(--t-cta-radius, 100px)',\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tcolor: 'var(--t-text)',\n\t\t\t\t\tpaddingLeft: 24,\n\t\t\t\t\tpaddingRight: 24,\n\t\t\t\t}}\n\t\t\t\tonClick={goBack}\n\t\t\t>\n\t\t\t\t{t('checkout.goBack')}\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nfunction buildWidgetUrl(baseUrl: string, config: Record<string, unknown>): string {\n\tconst url = new URL('/en/partner/widget', baseUrl);\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value != null && value !== '') {\n\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\t}\n\treturn url.toString();\n}\n","/**\n * Processing Step Component\n * Shows order processing status with live updates.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useEffect } from 'react';\nimport { useRamp } from '../context/RampContext';\nimport { Spinner } from './ui/Spinner';\nimport { useT } from '../i18n';\n\nexport interface ProcessingStepProps {\n className?: string;\n}\n\nexport function ProcessingStep({ className = '' }: ProcessingStepProps) {\n const { orderStatus, orderStatusLoading, goToStep } = useRamp();\n const t = useT();\n\n useEffect(() => {\n if (!orderStatus) return;\n if (orderStatus.status === 'completed') {\n goToStep('complete');\n } else if (['failed', 'cancelled', 'expired', 'refunded'].includes(orderStatus.status)) {\n goToStep('error');\n }\n }, [orderStatus?.status, goToStep]);\n\n const getStatusMessage = () => {\n if (!orderStatus) return t('processing.default');\n switch (orderStatus.status) {\n case 'pending':\n return t('processing.pending');\n case 'processing':\n return t('processing.active');\n default:\n return t('processing.generic');\n }\n };\n\n return (\n <div className={`flex flex-col items-center justify-center px-8 py-12 text-center ${className}`}>\n <div className=\"mb-6\" style={{ animation: 'processingPulse 1500ms ease-in-out infinite' }}>\n <Spinner size={64} />\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-3\" style={{ color: 'var(--t-text)' }}>\n {getStatusMessage()}\n </h2>\n\n {orderStatusLoading && (\n <p className=\"text-[13px] mb-4\" style={{ color: 'var(--t-text-muted)' }}>{t('processing.checkingStatus')}</p>\n )}\n\n {orderStatus && (\n <div className=\"w-full mt-6 text-left\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n <DetailRow label={t('processing.orderId')} value={orderStatus.orderId} mono />\n <DetailRow label={t('processing.provider')} value={orderStatus.gateway} />\n <DetailRow\n label={t('processing.amount')}\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow\n label={t('processing.receiving')}\n value={`${orderStatus.cryptoAmount || '...'} ${orderStatus.cryptoCurrency}`}\n />\n <DetailRow label={t('processing.network')} value={orderStatus.network} />\n <DetailRow\n label={t('processing.toAddress')}\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n </div>\n )}\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('processing.usuallyMinutes')}\n </p>\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n {t('processing.safeToClose')}\n </p>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Complete Step Component\n * Success screen with transaction details.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\nimport { useT } from '../i18n';\n\nexport interface CompleteStepProps {\n className?: string;\n explorerUrl?: string;\n onDone?: () => void;\n doneButtonText?: string;\n}\n\nexport function CompleteStep({\n className = '',\n explorerUrl,\n onDone,\n doneButtonText,\n}: CompleteStepProps) {\n const { orderStatus, state, dispatch } = useRamp();\n const t = useT();\n const isSell = state.flowType === 'sell';\n\n const getExplorerUrl = () => {\n if (!orderStatus?.transactionHash) return null;\n if (!explorerUrl) {\n const defaultExplorers: Record<string, string> = {\n ethereum: 'https://etherscan.io/tx/{txHash}',\n polygon: 'https://polygonscan.com/tx/{txHash}',\n arbitrum: 'https://arbiscan.io/tx/{txHash}',\n optimism: 'https://optimistic.etherscan.io/tx/{txHash}',\n base: 'https://basescan.org/tx/{txHash}',\n bitcoin: 'https://mempool.space/tx/{txHash}',\n solana: 'https://solscan.io/tx/{txHash}',\n avalanche: 'https://snowtrace.io/tx/{txHash}',\n fantom: 'https://ftmscan.com/tx/{txHash}',\n };\n const baseUrl = defaultExplorers[state.network] || defaultExplorers.ethereum;\n return baseUrl.replace('{txHash}', orderStatus.transactionHash);\n }\n return explorerUrl.replace('{txHash}', orderStatus.transactionHash);\n };\n\n const handleDone = () => {\n if (onDone) {\n onDone();\n } else {\n dispatch({ type: 'RESET' });\n }\n };\n\n const explorerLink = getExplorerUrl();\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Success icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-success, #10b981)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"none\" stroke=\"white\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path\n d=\"M4.83 12 9 16.17 19.59 5.59\"\n strokeDasharray=\"24\"\n strokeDashoffset=\"0\"\n style={{ animation: 'checkDraw 0.6s ease-out' }}\n />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {isSell ? t('complete.sellTitle') : t('complete.buyTitle')}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {isSell\n ? t('complete.sellDesc', { fiat: orderStatus?.fiatCurrency || state.fiatCurrency })\n : t('complete.buyDesc', { crypto: orderStatus?.cryptoCurrency || state.cryptoCurrency })\n }\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n <DetailRow\n label={isSell ? t('complete.amountSell') : t('complete.amountBuy')}\n value={`${orderStatus.cryptoAmount} ${orderStatus.cryptoCurrency}`}\n highlight\n />\n <DetailRow\n label={isSell ? t('complete.paidSell') : t('complete.paidBuy')}\n value={`${orderStatus.fiatAmount} ${orderStatus.fiatCurrency}`}\n />\n <DetailRow label={t('complete.network')} value={orderStatus.network} />\n <DetailRow\n label={t('complete.wallet')}\n value={`${orderStatus.walletAddress.slice(0, 10)}...${orderStatus.walletAddress.slice(-8)}`}\n mono\n />\n {orderStatus.transactionHash && (\n <DetailRow\n label={t('complete.transaction')}\n value={`${orderStatus.transactionHash.slice(0, 10)}...${orderStatus.transactionHash.slice(-8)}`}\n mono\n />\n )}\n <DetailRow label={t('complete.provider')} value={orderStatus.gateway} />\n <DetailRow label={t('complete.orderId')} value={orderStatus.orderId} mono />\n {orderStatus.completedAt && (\n <DetailRow\n label={t('complete.completed')}\n value={new Date(orderStatus.completedAt).toLocaleString()}\n />\n )}\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n {explorerLink && (\n <a\n href={explorerLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"w-full font-semibold text-[14px] flex items-center justify-center transition-all\"\n style={{ height: 48, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-surface)', color: 'var(--t-text)', textDecoration: 'none' }}\n >\n {t('complete.viewExplorer')}\n </a>\n )}\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleDone}\n >\n {doneButtonText || t('complete.done')}\n </button>\n </div>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div\n className=\"flex justify-between items-center py-2\"\n style={{ borderBottom: '1px solid var(--t-divider)' }}\n >\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","/**\n * Error Step Component\n * Displays error state with retry options.\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useRamp } from '../context/RampContext';\nimport { useT } from '../i18n';\n\nexport interface ErrorStepProps {\n className?: string;\n onRetry?: () => void;\n onDone?: () => void;\n doneButtonText?: string;\n supportEmail?: string;\n}\n\nexport function ErrorStep({\n className = '',\n onRetry,\n onDone,\n doneButtonText,\n supportEmail = 'support@nowramp.com',\n}: ErrorStepProps) {\n const { state, orderStatus, dispatch, goToStep } = useRamp();\n const t = useT();\n const isSell = state.flowType === 'sell';\n\n const getErrorTitle = () => {\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed': return t('errorStep.failed');\n case 'cancelled': return t('errorStep.cancelled');\n case 'expired': return t('errorStep.expired');\n case 'refunded': return t('errorStep.refunded');\n default: return t('errorStep.unknown');\n }\n }\n return t('errorStep.unknown');\n };\n\n const getErrorMessage = () => {\n if (state.errorMessage) return state.errorMessage;\n if (orderStatus) {\n switch (orderStatus.status) {\n case 'failed':\n return isSell\n ? t('errorStep.failedSell')\n : t('errorStep.failedBuy');\n case 'cancelled':\n return isSell\n ? t('errorStep.cancelledSell')\n : t('errorStep.cancelledBuy');\n case 'expired':\n return isSell\n ? t('errorStep.expiredSell')\n : t('errorStep.expiredBuy');\n case 'refunded':\n return isSell\n ? t('errorStep.refundedSell')\n : t('errorStep.refundedBuy');\n default:\n return t('errorStep.genericDesc');\n }\n }\n return t('errorStep.genericDesc');\n };\n\n const handleRetry = () => {\n dispatch({ type: 'CLEAR_ERROR' });\n if (onRetry) {\n onRetry();\n } else {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n }\n };\n\n const handleStartOver = () => {\n dispatch({ type: 'RESET' });\n goToStep('amount');\n };\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 text-center ${className}`}>\n {/* Error icon */}\n <div\n className=\"flex items-center justify-center mb-5\"\n style={{ width: 64, height: 64, borderRadius: '50%', background: 'var(--t-error, #EF4444)' }}\n >\n <svg viewBox=\"0 0 24 24\" width=\"32\" height=\"32\" fill=\"white\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n </svg>\n </div>\n\n <h2 className=\"text-[20px] font-semibold mb-2\" style={{ color: 'var(--t-text)' }}>\n {getErrorTitle()}\n </h2>\n\n <p className=\"text-[14px] mb-6\" style={{ color: 'var(--t-text-secondary)' }}>\n {getErrorMessage()}\n </p>\n\n {orderStatus && (\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n <div className=\"flex justify-between items-center py-2\">\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{t('errorStep.orderId')}</span>\n <span className=\"text-[13px] font-medium font-mono\" style={{ color: 'var(--t-text)' }}>\n {orderStatus.orderId}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"w-full flex flex-col gap-2\">\n <button\n className=\"w-full font-semibold text-[16px] transition-all\"\n style={{ height: 60, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)' }}\n onClick={handleRetry}\n >\n {t('errorStep.tryAgain')}\n </button>\n <button\n className=\"w-full font-semibold text-[14px] transition-all\"\n style={{ height: 48, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-surface)', color: 'var(--t-text)' }}\n onClick={handleStartOver}\n >\n {t('errorStep.startOver')}\n </button>\n {onDone && (\n <button\n className=\"w-full font-semibold text-[14px] transition-all mt-1\"\n style={{ height: 48, borderRadius: 'var(--t-cta-radius, 100px)', background: 'transparent',\n color: 'var(--t-text-secondary)', border: '1px solid var(--t-divider)' }}\n onClick={onDone}\n aria-label={doneButtonText || t('errorStep.returnToMerchant')}\n >\n {doneButtonText || t('errorStep.return')}\n </button>\n )}\n </div>\n\n <div className=\"mt-6\">\n <p className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('errorStep.needHelp')}{' '}\n <a\n href={`mailto:${supportEmail}`}\n className=\"underline\"\n style={{ color: 'var(--t-accent)' }}\n >\n {supportEmail}\n </a>\n </p>\n {orderStatus && (\n <p className=\"text-[12px] mt-1\" style={{ color: 'var(--t-text-muted)' }}>\n {t('errorStep.reference', { orderId: orderStatus.orderId })}\n </p>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Complete Banxa-supported cryptocurrencies and blockchains data.\n * TypeScript conversion of the crypto data module.\n * Icons are stored locally in /crypto-icons/{ticker}.svg\n */\n\n// ── TypeScript interfaces ──\n\nexport interface BlockchainInfo {\n name: string;\n shortName?: string;\n icon: string;\n}\n\nexport interface CryptoCurrency {\n code: string;\n name: string;\n chains: string[];\n popular: boolean;\n}\n\nexport interface FiatCurrency {\n code: string;\n name: string;\n}\n\nexport interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport interface CryptoChainCombo {\n code: string;\n name: string;\n chain: string;\n /** Display name from provider (e.g. \"Ethereum Mainnet\") */\n chainName?: string;\n popular: boolean;\n}\n\n// ── Blockchain / Network definitions ──\n// Maps blockchain codes to display names and their icon ticker\n\nexport const BLOCKCHAINS: Record<string, BlockchainInfo> = {\n // Canonical IDs (returned by the API — lowercase full names)\n // These cover cases where the canonical ID differs from the legacy uppercase key\n ethereum: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n bitcoin: { name: 'Bitcoin', icon: 'btc' },\n solana: { name: 'Solana', icon: 'sol' },\n polygon: { name: 'Polygon', icon: 'pol' },\n arbitrum: { name: 'Arbitrum', icon: 'arb' },\n avalanche: { name: 'Avalanche C-Chain', shortName: 'Avalanche', icon: 'avax' },\n litecoin: { name: 'Litecoin', icon: 'ltc' },\n tezos: { name: 'Tezos', icon: 'xtz' },\n sei: { name: 'SEI', icon: 'sei' },\n imx: { name: 'Immutable X', shortName: 'Immutable', icon: 'imx' },\n galachain: { name: 'Gala', icon: 'gala' },\n zksync2: { name: 'zkSync Era', shortName: 'zkSync', icon: 'zksync' },\n zks: { name: 'zkSpace', icon: 'zks' },\n 'flow-evm': { name: 'Flow (EVM)', shortName: 'Flow', icon: 'flow' },\n vara: { name: 'Vara', icon: 'vara' },\n venom: { name: 'Venom', icon: 'venom' },\n hsk: { name: 'HashKey Chain', shortName: 'HashKey', icon: 'hsk' },\n mck: { name: 'MCK', icon: 'mck' },\n peer: { name: 'Peer', icon: 'peer' },\n // Testnets (fallback display names)\n goerli: { name: 'Goerli Testnet', shortName: 'Goerli', icon: 'eth' },\n hbartestnet: { name: 'Hedera Testnet', shortName: 'Hedera', icon: 'hbar' },\n arbitrumrinkeby: { name: 'Arbitrum Testnet', shortName: 'Arbitrum', icon: 'arb' },\n dydxtestnet: { name: 'dYdX Testnet', shortName: 'dYdX', icon: 'stark' },\n 'zksync-rinkeby': { name: 'zkSync Testnet', shortName: 'zkSync', icon: 'zksync' },\n\n // Legacy uppercase keys (used by local crypto data and older integrations)\n ETH: { name: 'Ethereum (ERC20)', shortName: 'Ethereum', icon: 'eth' },\n BSC: { name: 'Binance Smart Chain (BEP20)', shortName: 'Binance', icon: 'bnb' },\n BTC: { name: 'Bitcoin', icon: 'btc' },\n SOL: { name: 'Solana', icon: 'sol' },\n MATIC: { name: 'Polygon', icon: 'pol' },\n ARB: { name: 'Arbitrum', icon: 'arb' },\n BASE: { name: 'Base', icon: 'base' },\n OPTIMISM: { name: 'Optimism', icon: 'op' },\n AVAX_C: { name: 'Avalanche C-Chain', shortName: 'Avalanche C', icon: 'avax' },\n AVAX_X: { name: 'Avalanche X-Chain', shortName: 'Avalanche X', icon: 'avax' },\n ADA: { name: 'Cardano', icon: 'ada' },\n DOT: { name: 'Polkadot', icon: 'dot' },\n TRON: { name: 'Tron (TRC20)', shortName: 'Tron', icon: 'trx' },\n XRP: { name: 'Ripple', icon: 'xrp' },\n XLM: { name: 'Stellar', icon: 'xlm' },\n ALGO: { name: 'Algorand', icon: 'algo' },\n ATOM: { name: 'Cosmos', icon: 'atom' },\n NEAR: { name: 'NEAR Protocol', shortName: 'NEAR', icon: 'near' },\n SUI: { name: 'Sui', icon: 'sui' },\n APT: { name: 'Aptos', icon: 'apt' },\n TON: { name: 'Ton', icon: 'ton' },\n FIL: { name: 'Filecoin', icon: 'fil' },\n FLOW: { name: 'Flow', icon: 'flow' },\n HBAR: { name: 'Hedera Hashgraph', shortName: 'Hedera', icon: 'hbar' },\n INJ: { name: 'Injective', icon: 'inj' },\n SEI_EVM: { name: 'SEI (EVM)', shortName: 'SEI', icon: 'sei' },\n ZKSYNC: { name: 'zkSync', icon: 'zksync' },\n LINEA: { name: 'Linea', icon: 'linea' },\n STARK: { name: 'StarkNet', icon: 'strk' },\n LN: { name: 'Lightning', icon: 'btc' },\n CELO: { name: 'Celo', icon: 'celo' },\n CRO: { name: 'Cronos', icon: 'cro' },\n FTM: { name: 'Fantom', icon: 'ftm' },\n GLMR: { name: 'Moonbeam', icon: 'glmr' },\n MOVR: { name: 'Moonriver', icon: 'movr' },\n KSM: { name: 'Kusama', icon: 'ksm' },\n EOS: { name: 'EOS', icon: 'eos' },\n ETC: { name: 'Ethereum Classic', shortName: 'ETH Classic', icon: 'etc' },\n LTC: { name: 'Litecoin', icon: 'ltc' },\n BCH: { name: 'Bitcoin Cash', shortName: 'BTC Cash', icon: 'bch' },\n DOGE: { name: 'Dogecoin', icon: 'doge' },\n BNB: { name: 'Binance Chain (BEP2)', shortName: 'Binance', icon: 'bnb' },\n ONE: { name: 'Harmony', icon: 'one' },\n KLAY: { name: 'Kaia', icon: 'kaia' },\n RON: { name: 'Ronin', icon: 'ron' },\n LRC: { name: 'Loopring', icon: 'lrc' },\n ICP: { name: 'Internet Computer', shortName: 'ICP', icon: 'icp' },\n EGLD: { name: 'MultiversX', icon: 'egld' },\n FLUX: { name: 'Flux', icon: 'flux' },\n KDA: { name: 'Kadena', icon: 'kda' },\n WAVES: { name: 'Waves', icon: 'waves' },\n XTZ: { name: 'Tezos', icon: 'xtz' },\n ACA: { name: 'Acala', icon: 'aca' },\n ALEO: { name: 'Aleo', icon: 'aleo' },\n ALPH: { name: 'Alephium', icon: 'alph' },\n APE: { name: 'ApeChain', icon: 'ape' },\n ASTR: { name: 'Astar', icon: 'astr' },\n AZERO: { name: 'Aleph Zero', icon: 'azero' },\n AZERO_EVM: { name: 'Aleph Zero EVM', shortName: 'Aleph Zero', icon: 'azero' },\n BAJU: { name: 'Bajun Network', shortName: 'Bajun', icon: 'baju' },\n BNCPOLKA: { name: 'Bifrost Polkadot', shortName: 'Bifrost', icon: 'bnc' },\n BNC: { name: 'Bifrost Kusama', shortName: 'Bifrost', icon: 'bnc' },\n BOBA: { name: 'Boba Network', shortName: 'Boba', icon: 'boba' },\n BSX: { name: 'Basilisk', icon: 'bsx' },\n CHZ: { name: 'Chiliz', icon: 'chz' },\n VIC: { name: 'Viction', icon: 'vic' },\n CCD: { name: 'Concordium', icon: 'ccd' },\n COREUM: { name: 'Coreum', icon: 'coreum' },\n DINGO: { name: 'Dingocoin', icon: 'dingo' },\n HDX: { name: 'Hydration', icon: 'hdx' },\n PLMC: { name: 'Polimec', icon: 'plmc' },\n MNT: { name: 'Mantle', icon: 'mnt' },\n ERG: { name: 'Ergo', icon: 'erg' },\n ECLIPSE: { name: 'Eclipse', icon: 'eclipse' },\n FUEL: { name: 'Fuel Ignition', shortName: 'Fuel', icon: 'fuel' },\n INK: { name: 'Ink', icon: 'ink' },\n SOPHON: { name: 'Sophon', icon: 'sophon' },\n UNICHAIN: { name: 'Unichain', icon: 'unichain' },\n WLD: { name: 'Worldchain', icon: 'wld' },\n ETHERLINK: { name: 'Etherlink', icon: 'etherlink' },\n MOB: { name: 'MobileCoin', icon: 'mob' },\n GALA: { name: 'Gala', icon: 'gala' },\n GUNZ: { name: 'Gunz', icon: 'gun' },\n HNT: { name: 'Helium', icon: 'hnt' },\n BITKUB: { name: 'BitKub', icon: 'kub' },\n IMMUTABLE_ZKEVM: { name: 'Immutable-zkEVM', shortName: 'Immutable', icon: 'imx' },\n INIT: { name: 'Initia', icon: 'init' },\n INTR: { name: 'Interlay', icon: 'intr' },\n KINESIS: { name: 'Kinesis', icon: 'kag' },\n KAR: { name: 'Karura', icon: 'kar' },\n KCC: { name: 'KuCoin Community Chain', shortName: 'KuCoin', icon: 'kcs' },\n KILT: { name: 'KILT Spiritnet', shortName: 'KILT', icon: 'kilt' },\n KINT: { name: 'Kintsugi', icon: 'kint' },\n KMD: { name: 'Komodo', icon: 'kmd' },\n LSK: { name: 'Lisk', icon: 'lsk' },\n METIS: { name: 'Metis Andromeda', shortName: 'Metis', icon: 'metis' },\n MYTH: { name: 'Myth', icon: 'myth' },\n OAS: { name: 'Oasys', icon: 'oas' },\n PEAQ_EVM: { name: 'Peaq (EVM)', shortName: 'Peaq', icon: 'peaq' },\n PEN: { name: 'Pendulum', icon: 'pen' },\n PI: { name: 'Pi', icon: 'pi' },\n POLYX: { name: 'Polymesh', icon: 'polyx' },\n Q: { name: 'QuantumCoin', icon: 'q' },\n QRL: { name: 'Quantum Resistant Ledger', shortName: 'QRL', icon: 'qrl' },\n QUBIC: { name: 'Qubic', icon: 'qubic' },\n RBX: { name: 'ReserveBlock', icon: 'rbx' },\n ROLLUX: { name: 'Rollux', icon: 'rollux' },\n THORCHAIN: { name: 'Thorchain', icon: 'rune' },\n S: { name: 'Sonic', icon: 's' },\n SONIC: { name: 'Sonic', icon: 's' },\n TERNOA: { name: 'Ternoa', icon: 'caps' },\n SX: { name: 'SX Network', icon: 'sol' },\n WAX: { name: 'WAX', icon: 'waxp' },\n XCH: { name: 'Chia Chain', icon: 'xch' },\n XPRT: { name: 'Persistence', icon: 'xprt' },\n ZETACHAIN: { name: 'ZetaChain', icon: 'zeta' },\n ZTG: { name: 'Zeitgeist', icon: 'ztg' },\n PLS: { name: 'Pulsechain', icon: 'pulsechain' },\n MEZO: { name: 'Mezo', icon: 'mezo' },\n BSV: { name: 'Bitcoin SV', shortName: 'BTC SV', icon: 'btc' },\n MONAD: { name: 'Monad', icon: 'mon' },\n SUPRA: { name: 'Supra', icon: 'supra' },\n SOMI: { name: 'Somnia', icon: 'somi' },\n VERIFIEDX: { name: 'VerifiedX', icon: 'vfx' },\n MOVE: { name: 'Movement', icon: 'move' },\n FLR: { name: 'Flare', icon: 'flr' },\n ASSETHUB: { name: 'Asset Hub Polkadot', shortName: 'Asset Hub', icon: 'dot' },\n BOB: { name: 'BOB', icon: 'btc' },\n GLUE: { name: 'Glue', icon: 'eth' },\n DYDX: { name: 'StarkEx', icon: 'stark' },\n OKC: { name: 'OKX Chain', icon: 'eth' },\n UNI_CHAIN: { name: 'UNI', icon: 'uni' },\n ZEC: { name: 'ZCash', icon: 'zec' },\n};\n\n// ── Full Banxa-supported cryptocurrencies ──\n// Each entry: { code, name, chains[], popular }\n// chains[] lists the blockchain codes this crypto is available on\n\nexport const CRYPTO_CURRENCIES: CryptoCurrency[] = [\n // --- Popular / Top coins ---\n { code: 'BTC', name: 'Bitcoin', chains: ['BTC', 'LN'], popular: true },\n { code: 'ETH', name: 'Ethereum', chains: ['ETH', 'ARB', 'BASE', 'BSC', 'OPTIMISM', 'LINEA', 'ZKSYNC', 'LRC', 'STARK', 'APE', 'ECLIPSE', 'FUEL', 'INK', 'SOPHON', 'UNICHAIN', 'WLD'], popular: true },\n { code: 'USDC', name: 'USD Coin', chains: ['ETH', 'SOL', 'ARB', 'BASE', 'BSC', 'MATIC', 'OPTIMISM', 'AVAX_C', 'ALGO', 'APT', 'CELO', 'FLOW', 'HBAR', 'LINEA', 'LRC', 'ZKSYNC', 'STARK', 'SUI', 'XLM', 'ECLIPSE', 'HDX', 'INK', 'LSK', 'METIS', 'MONAD', 'SEI_EVM', 'SONIC', 'SOPHON', 'SX', 'UNICHAIN', 'APE', 'BNCPOLKA', 'GLMR', 'PEAQ_EVM', 'PLMC', 'RON', 'UNI_CHAIN', 'WLD', 'BITKUB', 'BOB', 'DYDX', 'ETHERLINK', 'GLUE', 'ASSETHUB'], popular: true },\n { code: 'USDT', name: 'Tether', chains: ['ETH', 'BSC', 'TRON', 'ARB', 'MATIC', 'AVAX_C', 'SOL', 'OPTIMISM', 'ZKSYNC', 'STARK', 'APT', 'CELO', 'KLAY', 'LRC', 'LSK', 'ECLIPSE', 'ETHERLINK', 'OKC', 'PEAQ_EVM', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC', 'VIC', 'ASSETHUB'], popular: true },\n { code: 'SOL', name: 'Solana', chains: ['SOL'], popular: true },\n { code: 'XRP', name: 'Ripple', chains: ['XRP'], popular: true },\n { code: 'ADA', name: 'Cardano', chains: ['ADA'], popular: true },\n { code: 'DOGE', name: 'Dogecoin', chains: ['DOGE'], popular: true },\n { code: 'DOT', name: 'Polkadot', chains: ['DOT', 'BSC', 'BNCPOLKA', 'GLMR', 'HDX', 'PLMC'], popular: true },\n { code: 'AVAX', name: 'Avalanche', chains: ['AVAX_C', 'AVAX_X', 'BSC'], popular: true },\n { code: 'LINK', name: 'ChainLink', chains: ['ETH', 'BSC'], popular: true },\n { code: 'LTC', name: 'Litecoin', chains: ['LTC'], popular: true },\n\n // --- Major altcoins ---\n { code: 'AAVE', name: 'Aave', chains: ['ETH', 'BSC'], popular: false },\n { code: 'ACA', name: 'Acala', chains: ['ACA'], popular: false },\n { code: 'ALEO', name: 'Aleo', chains: ['ALEO'], popular: false },\n { code: 'ALGO', name: 'Algorand', chains: ['ALGO'], popular: false },\n { code: 'ALPH', name: 'Alephium', chains: ['ALPH'], popular: false },\n { code: 'APE', name: 'ApeCoin', chains: ['APE', 'ETH'], popular: false },\n { code: 'APT', name: 'Aptos', chains: ['APT'], popular: false },\n { code: 'ARB', name: 'Arbitrum', chains: ['ARB'], popular: false },\n { code: 'ASTR', name: 'Astar', chains: ['ASTR'], popular: false },\n { code: 'ATOM', name: 'Cosmos', chains: ['ATOM'], popular: false },\n { code: 'AUDD', name: 'Novatti Australian Digital Dollar', chains: ['ETH'], popular: false },\n { code: 'AVT', name: 'Aventus', chains: ['ETH'], popular: false },\n { code: 'AXS', name: 'Axie Infinity', chains: ['ETH', 'RON'], popular: false },\n { code: 'AZERO', name: 'Aleph Zero', chains: ['AZERO', 'AZERO_EVM'], popular: false },\n { code: 'BAJU', name: 'Bajun Network', chains: ['BAJU'], popular: false },\n { code: 'BARSIK', name: \"Hasbulla's Cat\", chains: ['SOL'], popular: false },\n { code: 'BAT', name: 'Basic Attention Token', chains: ['ETH', 'BSC'], popular: false },\n { code: 'BCH', name: 'Bitcoin Cash', chains: ['BCH'], popular: false },\n { code: 'BNB', name: 'Binance Coin', chains: ['BNB', 'BSC'], popular: false },\n { code: 'BNC', name: 'Bifrost Native Coin', chains: ['BNC', 'BNCPOLKA'], popular: false },\n { code: 'BOBA', name: 'Boba Network', chains: ['BOBA', 'ETH'], popular: false },\n { code: 'BORA', name: 'Bora', chains: ['KLAY'], popular: false },\n { code: 'BRETT', name: 'Brett', chains: ['BASE'], popular: false },\n { code: 'BSX', name: 'Basilisk', chains: ['BSX'], popular: false },\n { code: 'BZR', name: 'Bazaars', chains: ['ETH'], popular: false },\n { code: 'CAGA', name: 'Crypto Asset Governance Alliance', chains: ['ETH'], popular: false },\n { code: 'CAKE', name: 'PancakeSwap', chains: ['BSC'], popular: false },\n { code: 'CAPS', name: 'Caps', chains: ['TERNOA'], popular: false },\n { code: 'CELO', name: 'Celo', chains: ['CELO'], popular: false },\n { code: 'CHZ', name: 'Chiliz', chains: ['CHZ', 'BNB', 'ETH'], popular: false },\n { code: 'C98', name: 'Coin98', chains: ['VIC'], popular: false },\n { code: 'CCD', name: 'Concordium', chains: ['CCD'], popular: false },\n { code: 'COMP', name: 'Compound', chains: ['ETH', 'BSC'], popular: false },\n { code: 'COREUM', name: 'Coreum', chains: ['COREUM', 'XRP'], popular: false },\n { code: 'CRO', name: 'Cronos', chains: ['CRO'], popular: false },\n { code: 'CUSD', name: 'Celo Dollar', chains: ['CELO'], popular: false },\n { code: 'CVC', name: 'Civic', chains: ['ETH'], popular: false },\n { code: 'DAI', name: 'Dai', chains: ['ETH', 'BASE', 'MATIC'], popular: false },\n { code: 'DINGO', name: 'Dingocoin', chains: ['DINGO'], popular: false },\n { code: 'EGLD', name: 'MultiversX', chains: ['EGLD'], popular: false },\n { code: 'EMBER', name: 'Ember Sword', chains: ['MNT'], popular: false },\n { code: 'EOS', name: 'EOS', chains: ['EOS'], popular: false },\n { code: 'ERG', name: 'Ergo', chains: ['ERG'], popular: false },\n { code: 'ETC', name: 'Ethereum Classic', chains: ['ETC', 'BSC'], popular: false },\n { code: 'EUR', name: 'EURC', chains: ['BASE'], popular: false },\n { code: 'EUROC', name: 'Euro Coin', chains: ['ETH'], popular: false },\n { code: 'EURQ', name: 'Quantoz EURQ', chains: ['ETH'], popular: false },\n { code: 'EURR', name: 'StablR EUR', chains: ['ETH'], popular: false },\n { code: 'EUSD', name: 'Electronic USD', chains: ['MOB'], popular: false },\n { code: 'EXIT', name: 'EXIT - Designer Token', chains: ['BSC'], popular: false },\n { code: 'FDUSD', name: 'First Digital USD', chains: ['SUI'], popular: false },\n { code: 'FIL', name: 'Filecoin', chains: ['FIL', 'BSC'], popular: false },\n { code: 'FLOW', name: 'Flow', chains: ['FLOW'], popular: false },\n { code: 'FLR', name: 'Flare', chains: ['FLR'], popular: false },\n { code: 'FLUX', name: 'Flux', chains: ['FLUX'], popular: false },\n { code: 'FTM', name: 'Fantom', chains: ['FTM', 'ETH', 'BSC'], popular: false },\n { code: 'GALA', name: 'Gala', chains: ['GALA'], popular: false },\n { code: 'GLMR', name: 'Moonbeam', chains: ['GLMR'], popular: false },\n { code: 'GMX', name: 'GMX', chains: ['ARB'], popular: false },\n { code: 'GNUS', name: 'Genius AI', chains: ['ETH'], popular: false },\n { code: 'GRT', name: 'The Graph', chains: ['ETH', 'ARB'], popular: false },\n { code: 'GUN', name: 'Gunz', chains: ['GUNZ'], popular: false },\n { code: 'HBAR', name: 'Hedera', chains: ['HBAR'], popular: false },\n { code: 'HDX', name: 'HydraDX', chains: ['HDX'], popular: false },\n { code: 'HNT', name: 'Helium', chains: ['HNT'], popular: false },\n { code: 'HTP', name: 'HowToPay', chains: ['BSC'], popular: false },\n { code: 'HVLO', name: 'Hivello', chains: ['SOL'], popular: false },\n { code: 'ICP', name: 'Internet Computer', chains: ['ICP'], popular: false },\n { code: 'IMX', name: 'Immutable X', chains: ['ETH'], popular: false },\n { code: 'INIT', name: 'Initia', chains: ['INIT'], popular: false },\n { code: 'INJ', name: 'Injective', chains: ['INJ'], popular: false },\n { code: 'INTR', name: 'Interlay', chains: ['INTR'], popular: false },\n { code: 'JAM', name: 'Jam Tune.FM', chains: ['HBAR'], popular: false },\n { code: 'KAG', name: 'Silver', chains: ['KINESIS'], popular: false },\n { code: 'KAIA', name: 'Kaia', chains: ['KLAY'], popular: false },\n { code: 'KAR', name: 'Karura', chains: ['KAR'], popular: false },\n { code: 'KAU', name: 'Gold', chains: ['KINESIS'], popular: false },\n { code: 'KCS', name: 'KuCoin Token', chains: ['ETH', 'KCC'], popular: false },\n { code: 'KDA', name: 'Kadena', chains: ['KDA'], popular: false },\n { code: 'KILT', name: 'KILT', chains: ['KILT'], popular: false },\n { code: 'KINT', name: 'Kintsugi', chains: ['KINT'], popular: false },\n { code: 'KLV', name: 'Klever', chains: ['TRON'], popular: false },\n { code: 'KMD', name: 'Komodo', chains: ['KMD'], popular: false },\n { code: 'KSM', name: 'Kusama', chains: ['KSM'], popular: false },\n { code: 'KUB', name: 'Bitkub Coin', chains: ['BITKUB'], popular: false },\n { code: 'LOOKS', name: 'LooksRare', chains: ['ETH'], popular: false },\n { code: 'LRC', name: 'Loopring', chains: ['ETH', 'LRC'], popular: false },\n { code: 'LSK', name: 'Lisk', chains: ['LSK'], popular: false },\n { code: 'MANA', name: 'Decentraland', chains: ['ETH'], popular: false },\n { code: 'MBX', name: 'Marblex', chains: ['IMMUTABLE_ZKEVM', 'KLAY'], popular: false },\n { code: 'MELANIA', name: 'Melania', chains: ['SOL'], popular: false },\n { code: 'METAMASKUSD', name: 'Metamask USD', chains: ['ETH', 'LINEA'], popular: false },\n { code: 'METIS', name: 'Metis', chains: ['METIS'], popular: false },\n { code: 'MEZOUSD', name: 'MUSD', chains: ['ETH', 'MEZO'], popular: false },\n { code: 'MKR', name: 'Maker', chains: ['ETH', 'BSC'], popular: false },\n { code: 'MNEE', name: 'MNEE', chains: ['BSV', 'ETH'], popular: false },\n { code: 'MNT', name: 'Mantle', chains: ['ETH', 'MNT'], popular: false },\n { code: 'MOB', name: 'MobileCoin', chains: ['MOB'], popular: false },\n { code: 'MON', name: 'Monad', chains: ['MONAD'], popular: false },\n { code: 'MOVE', name: 'Movement', chains: ['MOVE'], popular: false },\n { code: 'MOVR', name: 'Moonriver', chains: ['MOVR'], popular: false },\n { code: 'MYTH', name: 'Myth', chains: ['MYTH'], popular: false },\n { code: 'NEAR', name: 'NEAR Protocol', chains: ['NEAR', 'BSC'], popular: false },\n { code: 'NEIRO', name: 'NEIRO Ethereum', chains: ['ETH'], popular: false },\n { code: 'OAS', name: 'Oasys', chains: ['OAS'], popular: false },\n { code: 'OMG', name: 'OmiseGo', chains: ['ETH'], popular: false },\n { code: 'OMUSD', name: 'Open Money USD', chains: ['ETH'], popular: false },\n { code: 'ONE', name: 'Harmony', chains: ['ONE', 'BNB', 'ETH'], popular: false },\n { code: 'OP', name: 'Optimism', chains: ['OPTIMISM'], popular: false },\n { code: 'ORDER', name: 'Orderly Network', chains: ['ETH'], popular: false },\n { code: 'PEAQ', name: 'Peaq', chains: ['PEAQ_EVM'], popular: false },\n { code: 'PEN', name: 'Pendulum', chains: ['PEN'], popular: false },\n { code: 'PERC', name: 'Perion', chains: ['ETH'], popular: false },\n { code: 'PI', name: 'Pi', chains: ['PI'], popular: false },\n { code: 'PLMC', name: 'Polimec', chains: ['PLMC'], popular: false },\n { code: 'POL', name: 'Polygon', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'POLYX', name: 'Polymesh', chains: ['POLYX'], popular: false },\n { code: 'PROPC', name: 'Propchain', chains: ['ETH'], popular: false },\n { code: 'PSTAKE', name: 'pSTAKE Finance', chains: ['ETH'], popular: false },\n { code: 'Q', name: 'QuantumCoin', chains: ['Q'], popular: false },\n { code: 'QRDO', name: 'Qredo', chains: ['ETH'], popular: false },\n { code: 'QRL', name: 'Quantum Resistant Ledger', chains: ['QRL'], popular: false },\n { code: 'QUBIC', name: 'QUBIC', chains: ['QUBIC'], popular: false },\n { code: 'RBX', name: 'ReserveBlock', chains: ['RBX'], popular: false },\n { code: 'REVU', name: 'Revuto', chains: ['ADA'], popular: false },\n { code: 'RITE', name: 'Ritestream', chains: ['BSC'], popular: false },\n { code: 'RLUSD', name: 'Ripple USD', chains: ['ETH'], popular: false },\n { code: 'RON', name: 'Ronin', chains: ['RON'], popular: false },\n { code: 'RUNE', name: 'THORChain', chains: ['THORCHAIN'], popular: false },\n { code: 'S', name: 'Sonic', chains: ['S'], popular: false },\n { code: 'SAND', name: 'The Sandbox', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SEI', name: 'SEI', chains: ['SEI_EVM'], popular: false },\n { code: 'SNX', name: 'Synthetix', chains: ['ETH'], popular: false },\n { code: 'SOIL', name: 'Sun Minimeal', chains: ['PLS'], popular: false },\n { code: 'SOLO', name: 'Sologenic', chains: ['XRP'], popular: false },\n { code: 'SOMI', name: 'Somnia', chains: ['SOMI'], popular: false },\n { code: 'STRK', name: 'Starknet', chains: ['STARK'], popular: false },\n { code: 'SUI', name: 'Sui', chains: ['SUI'], popular: false },\n { code: 'SUPR', name: 'SuperDapp', chains: ['ROLLUX'], popular: false },\n { code: 'SUPRA', name: 'Supra', chains: ['SUPRA'], popular: false },\n { code: 'SUSHI', name: 'SushiSwap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'SYS', name: 'Syscoin', chains: ['ROLLUX'], popular: false },\n { code: 'TBTC', name: 'tBTC', chains: ['SUI', 'STARK'], popular: false },\n { code: 'TON', name: 'Toncoin', chains: ['TON'], popular: false },\n { code: 'TRUMP', name: 'TRUMP', chains: ['SOL'], popular: false },\n { code: 'TRX', name: 'Tron', chains: ['TRON', 'BSC'], popular: false },\n { code: 'TWT', name: 'Trust Wallet Token', chains: ['BSC'], popular: false },\n { code: 'UNI', name: 'Uniswap', chains: ['ETH', 'BSC'], popular: false },\n { code: 'URANIUM', name: 'Uranium', chains: ['ETHERLINK'], popular: false },\n { code: 'USD0', name: 'Usual USD', chains: ['ETH'], popular: false },\n { code: 'USD1', name: 'World Liberty Financial USD', chains: ['SOL'], popular: false },\n { code: 'USDE', name: 'Ethena USDe', chains: ['ETH'], popular: false },\n { code: 'USDP', name: 'Pax Dollar', chains: ['ETH'], popular: false },\n { code: 'USDQ', name: 'Quantoz USDQ', chains: ['ETH'], popular: false },\n { code: 'USDR', name: 'StablR USD', chains: ['ETH'], popular: false },\n { code: 'USDT0', name: 'USDT0', chains: ['INK'], popular: false },\n { code: 'VFX', name: 'VerifiedX', chains: ['VERIFIEDX'], popular: false },\n { code: 'VERSE', name: 'Verse', chains: ['ETH', 'MATIC'], popular: false },\n { code: 'VIC', name: 'Viction', chains: ['VIC'], popular: false },\n { code: 'WAL', name: 'Walrus', chains: ['SUI'], popular: false },\n { code: 'WAVES', name: 'Waves', chains: ['WAVES'], popular: false },\n { code: 'WAXP', name: 'WAX', chains: ['WAX'], popular: false },\n { code: 'WBTC', name: 'Wrapped Bitcoin', chains: ['ETH', 'STARK'], popular: false },\n { code: 'WETH', name: 'Wrapped Ether', chains: ['ETHERLINK'], popular: false },\n { code: 'WLD', name: 'Worldcoin', chains: ['WLD'], popular: false },\n { code: 'WLFI', name: 'World Liberty Financial', chains: ['ETH'], popular: false },\n { code: 'WOLF', name: 'LandWolf', chains: ['ETH'], popular: false },\n { code: 'WOMBAT', name: 'Wombat', chains: ['MATIC'], popular: false },\n { code: 'XCH', name: 'Chia', chains: ['XCH'], popular: false },\n { code: 'XLM', name: 'Stellar Lumens', chains: ['XLM', 'BSC'], popular: false },\n { code: 'XPRT', name: 'Persistence', chains: ['XPRT'], popular: false },\n { code: 'XTZ', name: 'Tezos', chains: ['XTZ', 'ETHERLINK'], popular: false },\n { code: 'YFI', name: 'yearn.finance', chains: ['ETH'], popular: false },\n { code: 'ZBU', name: 'Zeebu', chains: ['BSC'], popular: false },\n { code: 'ZEC', name: 'ZCash', chains: ['ZEC'], popular: false },\n { code: 'ZCHF', name: 'Frankencoin', chains: ['ETH'], popular: false },\n { code: 'ZETA', name: 'Zeta', chains: ['ETH', 'ZETACHAIN'], popular: false },\n { code: 'ZTG', name: 'Zeitgeist', chains: ['ZTG'], popular: false },\n];\n\n// ── Crypto code -> name lookup (for API data that only has codes) ──\nexport const CRYPTO_NAMES: Record<string, string> = Object.fromEntries(\n CRYPTO_CURRENCIES.map(c => [c.code, c.name])\n);\n\n// ── Fiat currency code -> ISO country code for flag lookup ──\n\nexport const FIAT_TO_COUNTRY: Record<string, string> = {\n AED: 'ae',\n ALL: 'al',\n ARS: 'ar',\n AUD: 'au',\n BRL: 'br',\n CAD: 'ca',\n CHF: 'ch',\n CLP: 'cl',\n CZK: 'cz',\n DKK: 'dk',\n EUR: 'eu',\n GBP: 'gb',\n HKD: 'hk',\n IDR: 'id',\n INR: 'in',\n JPY: 'jp',\n KRW: 'kr',\n MXN: 'mx',\n NGN: 'ng',\n NOK: 'no',\n NZD: 'nz',\n PHP: 'ph',\n PLN: 'pl',\n QAR: 'qa',\n SAR: 'sa',\n SEK: 'se',\n SGD: 'sg',\n THB: 'th',\n TRY: 'tr',\n TWD: 'tw',\n USD: 'us',\n VND: 'vn',\n ZAR: 'za',\n};\n\n// ── Icon URL helpers ──\n\n/**\n * Get the icon URL for a crypto ticker.\n * Icons are stored as SVGs in /crypto-icons/{ticker}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getCryptoIconUrl(ticker: string, baseUrl = ''): string {\n return `${baseUrl}/crypto-icons/${ticker.toLowerCase()}.svg`;\n}\n\n/**\n * Get the flag URL for a fiat currency code.\n * Flags are stored as SVGs in /flags/{country_code}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getFiatFlagUrl(currencyCode: string, baseUrl = ''): string {\n const country = FIAT_TO_COUNTRY[currencyCode] || 'us';\n return `${baseUrl}/flags/${country}.svg`;\n}\n\n/**\n * Get the icon URL for a blockchain/chain.\n * Uses the chain's native token icon.\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\n/** Lookup a chain in BLOCKCHAINS, handling canonical ids, legacy codes, and separator differences */\nexport function getChainInfo(chainCode: string): BlockchainInfo | undefined {\n return BLOCKCHAINS[chainCode]\n || BLOCKCHAINS[chainCode.toLowerCase()]\n || BLOCKCHAINS[chainCode.toUpperCase()]\n || BLOCKCHAINS[chainCode.toUpperCase().replace(/-/g, '_')]\n || BLOCKCHAINS[chainCode.toLowerCase().replace(/-/g, '_')];\n}\n\n/**\n * Get the icon URL for a provider/gateway.\n * Icons are stored as SVGs in /provider-icons/{id}.svg\n * @param baseUrl Optional base URL prefix (e.g. CDN URL). Defaults to root-relative.\n */\nexport function getProviderIconUrl(gatewayId: string, baseUrl = ''): string {\n return `${baseUrl}/provider-icons/${gatewayId.toLowerCase()}.svg`;\n}\n\nexport function getChainIconUrl(chainCode: string, baseUrl = ''): string {\n const chain = getChainInfo(chainCode);\n if (chain) return `${baseUrl}/crypto-icons/${chain.icon}.svg`;\n return `${baseUrl}/crypto-icons/${chainCode.toLowerCase()}.svg`;\n}\n\n// ── Fiat currencies ──\n\nexport const FIAT_CURRENCIES: FiatCurrency[] = [\n { code: 'ALL', name: 'Albania Lek' },\n { code: 'ARS', name: 'Argentina Peso' },\n { code: 'AUD', name: 'Australian Dollar' },\n { code: 'BRL', name: 'Brazilian Real' },\n { code: 'CAD', name: 'Canadian Dollar' },\n { code: 'EUR', name: 'Euro' },\n { code: 'GBP', name: 'British Pound' },\n { code: 'JPY', name: 'Japanese Yen' },\n { code: 'USD', name: 'US Dollar' },\n { code: 'CHF', name: 'Swiss Franc' },\n { code: 'MXN', name: 'Mexican Peso' },\n { code: 'INR', name: 'Indian Rupee' },\n];\n\n// ── Skin presets ──\n\nexport const SKINS: Skin[] = [\n { id: 'blue', name: 'Blue', accent: '#0077FF' },\n { id: 'violet', name: 'Violet', accent: '#7C3AED' },\n { id: 'green', name: 'Green', accent: '#10B981' },\n { id: 'orange', name: 'Orange', accent: '#F59E0B' },\n { id: 'rose', name: 'Rose', accent: '#F43F5E' },\n { id: 'mono', name: 'Mono', accent: null },\n];\n\n// ── Mock rates ──\n\nexport const MOCK_RATES: Record<string, Record<string, number>> = {\n USDC: { USD: 0.9962, EUR: 1.0814, GBP: 1.2573, JPY: 0.00667, CAD: 0.7198, AUD: 0.6384, BRL: 0.1726, CHF: 1.1306, MXN: 0.0487, INR: 0.01187, ARS: 0.000855, ALL: 0.01058 },\n USDT: { USD: 0.9958, EUR: 1.0810, GBP: 1.2568, JPY: 0.00666, CAD: 0.7194, AUD: 0.6380, BRL: 0.1724, CHF: 1.1301, MXN: 0.0486, INR: 0.01186, ARS: 0.000854, ALL: 0.01057 },\n BTC: { USD: 0.0000104, EUR: 0.00001129, GBP: 0.00001313, JPY: 0.0000000696, CAD: 0.00000751, AUD: 0.00000666, BRL: 0.0000018, CHF: 0.0000118, MXN: 0.000000508, INR: 0.000000124, ARS: 0.00000000892, ALL: 0.00000011 },\n ETH: { USD: 0.000316, EUR: 0.000343, GBP: 0.000399, JPY: 0.00000211, CAD: 0.000228, AUD: 0.000202, BRL: 0.0000547, CHF: 0.000358, MXN: 0.0000154, INR: 0.00000376, ARS: 0.000000271, ALL: 0.00000335 },\n SOL: { USD: 0.00424, EUR: 0.004607, GBP: 0.005356, JPY: 0.0000284, CAD: 0.003063, AUD: 0.002716, BRL: 0.000734, CHF: 0.004812, MXN: 0.000207, INR: 0.0000505, ARS: 0.00000364, ALL: 0.000045 },\n XRP: { USD: 0.4081, EUR: 0.4432, GBP: 0.5153, JPY: 0.00273, CAD: 0.2948, AUD: 0.2614, BRL: 0.0707, CHF: 0.4630, MXN: 0.01992, INR: 0.00486, ARS: 0.000350, ALL: 0.00433 },\n DOGE: { USD: 3.896, EUR: 4.232, GBP: 4.920, JPY: 0.02607, CAD: 2.815, AUD: 2.496, BRL: 0.6750, CHF: 4.421, MXN: 0.1902, INR: 0.04641, ARS: 0.003345, ALL: 0.04134 },\n ADA: { USD: 1.333, EUR: 1.448, GBP: 1.683, JPY: 0.00892, CAD: 0.963, AUD: 0.854, BRL: 0.2309, CHF: 1.512, MXN: 0.0651, INR: 0.01588, ARS: 0.001145, ALL: 0.01414 },\n};\n\n// ── Stablecoin detection ──\n\nconst STABLECOINS = new Set([\n 'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'FDUSD', 'PYUSD',\n 'USDP', 'USDE', 'USDQ', 'USDR', 'USDT0', 'RLUSD',\n 'CUSD', 'EUSD', 'OMUSD', 'MEZOUSD', 'METAMASKUSD',\n 'USD0', 'USD1', 'AUDD', 'EUROC', 'EURQ', 'EURR', 'ZCHF',\n]);\n\n/** Check if a crypto code is a known stablecoin */\nexport function isStablecoin(code: string): boolean {\n return STABLECOINS.has(code.toUpperCase());\n}\n\n// ── Helper functions ──\n\nexport function getMockRate(crypto: string, fiat: string): number {\n return MOCK_RATES[crypto]?.[fiat] ?? MOCK_RATES['USDC']?.[fiat] ?? 1;\n}\n\nexport function parseAmount(str: string): number {\n return parseFloat(str.replace(/,/g, '')) || 0;\n}\n\nexport function formatOutput(num: number): string {\n if (num === 0) return '0';\n if (num >= 1000) return num.toLocaleString('en-US', { maximumFractionDigits: 2 });\n if (num >= 1) return num.toFixed(2);\n if (num >= 0.01) return num.toFixed(4);\n const s = num.toPrecision(4);\n return parseFloat(s).toString();\n}\n\nexport const isValidHex = (str: string): boolean => /^#([0-9A-Fa-f]{3}){1,2}$/.test(str);\n\n// ── Validation constants ──\n\nexport const MIN_FIAT_AMOUNT = 10;\nexport const MIN_CRYPTO_AMOUNT = 0.0001;\n\n// ── Pre-built flat list of every crypto+chain combination ──\n\nexport const CRYPTO_CHAIN_COMBOS: CryptoChainCombo[] = (() => {\n const list: CryptoChainCombo[] = [];\n for (const c of CRYPTO_CURRENCIES) {\n for (const chain of c.chains) {\n list.push({ code: c.code, name: c.name, chain, popular: c.popular });\n }\n }\n return list;\n})();\n","/**\n * Confirm Step Component\n * Shown when all fields are pre-configured (session mode).\n * Restyled with NowRamp theme tokens.\n */\n\nimport { useState } from 'react';\nimport { useRamp } from '../context/RampContext';\nimport { isStablecoin, formatOutput } from '../data/cryptoData';\nimport { Spinner } from './ui/Spinner';\nimport { useT } from '../i18n';\n\nexport interface ConfirmStepProps {\n className?: string;\n stablecoinParity?: boolean;\n partnerName?: string;\n}\n\nfunction truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-6)}`;\n}\n\nexport function ConfirmStep({ className = '', stablecoinParity, partnerName }: ConfirmStepProps) {\n const {\n config,\n configLoading,\n state,\n defaultGateway,\n quotes,\n fetchQuotes,\n createOrder,\n orderLoading,\n } = useRamp();\n const t = useT();\n\n const isSell = state.flowType === 'sell';\n const [error, setError] = useState<string | null>(null);\n\n const gatewayInfo = config?.gateways.find((g) => g.id === defaultGateway);\n\n // Parity display for confirm step: stablecoin equivalent of fiat (partner absorbs fees)\n const exchangeRate = quotes?.bestQuote?.exchangeRate ? parseFloat(quotes.bestQuote.exchangeRate) : null;\n const fiatNumeric = parseFloat(state.fiatAmount) || 0;\n const confirmParityActive = !!(stablecoinParity && partnerName && !isSell && isStablecoin(state.cryptoCurrency) && exchangeRate);\n const confirmSamePeg = confirmParityActive && state.cryptoCurrency.toUpperCase().includes(state.fiatCurrency.toUpperCase());\n const confirmParityAmount = confirmParityActive && fiatNumeric > 0\n ? formatOutput(confirmSamePeg ? fiatNumeric : fiatNumeric / exchangeRate)\n : null;\n\n const handleConfirm = async () => {\n setError(null);\n try {\n fetchQuotes();\n await createOrder();\n } catch (err) {\n const message = err instanceof Error ? err.message : t('error.createOrderFailed');\n setError(message);\n }\n };\n\n if (configLoading) {\n return (\n <div className={`flex flex-col items-center justify-center p-12 ${className}`}>\n <Spinner size={32} />\n <p className=\"text-[14px] mt-4\" style={{ color: 'var(--t-text-secondary)' }}>{t('confirm.loading')}</p>\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col items-center px-8 py-12 ${className}`}>\n <h2 className=\"text-[20px] font-semibold mb-6\" style={{ color: 'var(--t-text)' }}>\n {isSell ? t('confirm.sellTitle') : t('confirm.buyTitle')}\n </h2>\n\n <div className=\"w-full text-left mb-6\" style={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius, 20px)', padding: 16 }}>\n {gatewayInfo && (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{t('confirm.provider')}</span>\n <span className=\"flex items-center gap-2\">\n {gatewayInfo.logo && (\n <img src={gatewayInfo.logo} alt={gatewayInfo.name} width={20} height={20} style={{ borderRadius: 4 }} />\n )}\n <span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>{gatewayInfo.name}</span>\n </span>\n </div>\n )}\n\n {isSell ? (\n <>\n <DetailRow label={t('confirm.youSell')} value={`${state.cryptoAmount} ${state.cryptoCurrency}`} highlight />\n <DetailRow label={t('confirm.youReceive')} value={t('confirm.payout', { currency: state.fiatCurrency })} />\n </>\n ) : (\n <>\n <DetailRow label={t('confirm.youPay')} value={`${state.fiatAmount} ${state.fiatCurrency}`} highlight />\n <DetailRow\n label={t('confirm.youReceive')}\n value={confirmParityAmount ? `${confirmParityAmount} ${state.cryptoCurrency}` : t('confirm.cryptoOnNetwork', { crypto: state.cryptoCurrency, network: state.network })}\n />\n <DetailRow label={t('confirm.wallet')} value={truncateAddress(state.walletAddress)} mono />\n {confirmParityActive && confirmParityAmount && (\n <div className=\"py-2 text-[11px]\" style={{ color: 'var(--t-text-muted)', lineHeight: '15px' }}>\n {t('confirm.parityNote', { amount: confirmParityAmount, crypto: state.cryptoCurrency, partner: partnerName })}\n </div>\n )}\n </>\n )}\n\n <DetailRow label={t('confirm.network')} value={state.network} />\n\n {isSell && state.walletAddress && (\n <DetailRow label={t('confirm.refundAddress')} value={truncateAddress(state.walletAddress)} mono />\n )}\n </div>\n\n {error && (\n <p className=\"text-[12px] mb-4\" style={{ color: '#EF4444' }}>{error}</p>\n )}\n\n <button\n className=\"w-full font-semibold text-[16px] transition-all flex items-center justify-center gap-2\"\n style={{ height: 60, borderRadius: 'var(--t-cta-radius, 100px)', background: 'var(--t-cta-bg)', color: 'var(--t-cta-text)', opacity: orderLoading ? 0.7 : 1 }}\n disabled={orderLoading}\n onClick={handleConfirm}\n >\n {orderLoading ? (\n <>\n <Spinner size={18} />\n {t('confirm.processing')}\n </>\n ) : (\n isSell ? t('confirm.confirmSell') : t('confirm.confirmPay')\n )}\n </button>\n </div>\n );\n}\n\nfunction DetailRow({ label, value, mono, highlight }: { label: string; value: string; mono?: boolean; highlight?: boolean }) {\n return (\n <div className=\"flex justify-between items-center py-2\" style={{ borderBottom: '1px solid var(--t-divider)' }}>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>{label}</span>\n <span\n className={`text-[13px] font-medium ${mono ? 'font-mono' : ''}`}\n style={{ color: highlight ? 'var(--t-success, #10b981)' : 'var(--t-text)' }}\n >\n {value}\n </span>\n </div>\n );\n}\n","import type React from 'react';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function Modal({\n isOpen,\n onClose,\n children,\n variant = 'bottom',\n}: {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode | ((close: () => void) => React.ReactNode);\n /** Animation direction: 'bottom' slides up (default), 'right' slides from right */\n variant?: 'bottom' | 'right';\n}) {\n const [mounted, setMounted] = useState(false);\n const [animating, setAnimating] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setMounted(true);\n requestAnimationFrame(() => requestAnimationFrame(() => setAnimating(true)));\n } else if (mounted) {\n setAnimating(false);\n const t = setTimeout(() => setMounted(false), 250);\n return () => clearTimeout(t);\n }\n }, [isOpen]);\n\n const handleClose = useCallback(() => {\n setAnimating(false);\n setTimeout(() => onClose(), 250);\n }, [onClose]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [isOpen, handleClose]);\n\n if (!mounted) return null;\n\n const closedTransform = variant === 'right' ? 'translateX(100%)' : 'translateY(24px)';\n const openTransform = 'translate(0)';\n\n return (\n <div\n className=\"absolute inset-0 z-20 transition-opacity duration-250\"\n style={{ opacity: animating ? 1 : 0, backdropFilter: 'blur(4px)', WebkitBackdropFilter: 'blur(4px)' }}\n >\n <div\n className=\"absolute inset-0 flex flex-col transition-transform duration-250 ease-out\"\n style={{ background: 'var(--t-modal-bg)', borderRadius: 'var(--t-container-radius)', transform: animating ? openTransform : closedTransform }}\n >\n {typeof children === 'function' ? children(handleClose) : children}\n </div>\n </div>\n );\n}\n","export function Skeleton({\n w,\n h,\n className = '',\n}: {\n w: number | string;\n h: number | string;\n className?: string;\n}) {\n return <div className={`skeleton ${className}`} style={{ width: w, height: h }} />;\n}\n\nimport { useT } from '../../i18n';\n\nexport function FormSkeleton() {\n const t = useT();\n return (\n <div className=\"flex-1 px-5 flex flex-col\">\n <div className=\"px-[18px] pt-[14px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5 }}>\n <Skeleton w={70} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={120} h={32} />\n <Skeleton w={75} h={32} />\n </div>\n </div>\n <div className=\"px-[18px] pt-[12px] pb-[18px]\" style={{ background: 'var(--t-surface)', borderRadius: 5, marginTop: 4 }}>\n <Skeleton w={50} h={14} className=\"mb-3\" />\n <div className=\"flex justify-between items-center\">\n <Skeleton w={180} h={32} />\n <Skeleton w={85} h={32} />\n </div>\n </div>\n <div className=\"flex justify-between mt-3 px-[2px]\">\n <Skeleton w={140} h={12} />\n <Skeleton w={90} h={12} />\n </div>\n <div className=\"mt-8\">\n <Skeleton w={65} h={14} className=\"mb-2.5\" />\n <Skeleton w=\"100%\" h={47} />\n </div>\n <div className=\"flex-1\" />\n <Skeleton w=\"100%\" h={60} className=\"mb-2\" />\n <div className=\"text-center py-3\">\n <span className=\"text-[11px]\" style={{ color: 'var(--t-text-tertiary)' }}>{t('skeleton.poweredBy')}</span>\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { useState, useCallback, useRef } from 'react';\nimport { getCryptoIconUrl, getFiatFlagUrl } from '../../data/cryptoData';\n\n/* ───────────── icon helpers ───────────── */\n\n/** Lazy-loaded image with placeholder and fallback */\nfunction LazyIcon({\n src,\n alt,\n size,\n className = '',\n background,\n}: {\n src: string;\n alt: string;\n size: number;\n className?: string;\n /** Background color for transparent icons */\n background?: string;\n}) {\n const [loaded, setLoaded] = useState(false);\n const [error, setError] = useState(false);\n const currentSrc = useRef(src);\n\n // Reset state when src changes, using ref to avoid race with onLoad\n if (currentSrc.current !== src) {\n currentSrc.current = src;\n setLoaded(false);\n setError(false);\n }\n\n const handleLoad = useCallback(() => setLoaded(true), []);\n const handleError = useCallback(() => setError(true), []);\n\n return (\n <div\n className={`relative rounded-full shrink-0 ${className}`}\n style={{ width: size, height: size, background }}\n >\n {/* Placeholder while loading */}\n {!loaded && !error && (\n <div\n className=\"absolute inset-0 rounded-full animate-pulse\"\n style={{ background: 'var(--t-pill-bg, #333)' }}\n />\n )}\n {/* Fallback for broken images */}\n {error ? (\n <div\n className=\"absolute inset-0 rounded-full flex items-center justify-center font-bold\"\n style={{\n background: 'var(--t-pill-bg, #333)',\n color: 'var(--t-text-muted)',\n fontSize: Math.max(8, size * 0.35),\n }}\n >\n {alt.slice(0, 3)}\n </div>\n ) : (\n <img\n src={src}\n alt={alt}\n width={size}\n height={size}\n onLoad={handleLoad}\n onError={handleError}\n className={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n style={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n />\n )}\n </div>\n );\n}\n\nexport function CryptoIcon({ ticker, size = 32, baseUrl = '' }: { ticker: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getCryptoIconUrl(ticker, baseUrl)}\n alt={ticker}\n size={size}\n background=\"#ffffff\"\n />\n );\n}\n\nexport function FiatFlag({ currencyCode, size = 16, baseUrl = '' }: { currencyCode: string; size?: number; baseUrl?: string }) {\n return (\n <LazyIcon\n src={getFiatFlagUrl(currencyCode, baseUrl)}\n alt={currencyCode}\n size={size}\n />\n );\n}\n\nexport function GenericCoinIcon({ size = 32, color = '#888' }: { size?: number; color?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\">\n <circle cx=\"16\" cy=\"16\" r=\"16\" fill={color} />\n <circle cx=\"16\" cy=\"16\" r=\"8\" stroke=\"white\" strokeWidth=\"1.5\" fill=\"none\" />\n </svg>\n );\n}\n\nexport function BankIcon({ size = 24 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-card-icon-bg)' }}\n >\n <svg width={size * 0.6} height={size * 0.58} viewBox=\"0 0 25 24\" fill=\"none\">\n <path d=\"M23.292 7.5H1.70801L12.5 0.592773L23.292 7.5Z\" stroke=\"var(--t-card-icon-stroke)\" strokeWidth=\"1\" />\n <rect x=\"3\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"9\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"15\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect x=\"21\" y=\"10\" width=\"1.5\" height=\"11\" fill=\"var(--t-card-icon-stroke)\" />\n <rect y=\"23\" width=\"25\" height=\"1\" fill=\"var(--t-card-icon-stroke)\" />\n </svg>\n </div>\n );\n}\n\nexport function RevolutIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center text-white font-semibold shrink-0\"\n style={{ width: size, height: size, backgroundColor: '#333', fontSize: size * 0.45 }}\n >\n R\n </div>\n );\n}\n\nexport function ApplePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#000', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.288} viewBox=\"0 0 50 20\" fill=\"none\">\n <path\n d=\"M9.14529 2.57901C8.55528 3.25398 7.61984 3.7887 6.68351 3.70976C6.56186 2.7971 7.02999 1.82591 7.55883 1.23105C8.14846 0.535892 9.166 0.0403839 9.9999 0C10.1017 0.952461 9.71518 1.88488 9.14529 2.57901ZM9.98932 3.88805C10.5171 3.92756 12.0384 4.08587 13.0125 5.48951C12.9312 5.54899 11.2066 6.51813 11.2267 8.55562C11.247 10.9883 13.4176 11.7995 13.4379 11.8193C13.4176 11.8787 13.0939 12.9667 12.3023 14.0939C11.6126 15.083 10.902 16.052 9.76606 16.0717C8.67023 16.0915 8.30483 15.4389 7.04742 15.4389C5.78949 15.4389 5.38394 16.052 4.34875 16.0915C3.25329 16.1307 2.42185 15.0429 1.73195 14.054C0.310872 12.0564 -0.764097 8.41705 0.696758 5.96431C1.40722 4.73809 2.70553 3.96677 4.10507 3.94695C5.18064 3.92756 6.17501 4.63962 6.82446 4.63962C7.47376 4.63962 8.62918 3.80889 9.98932 3.88805ZM23.544 1.13133C26.4989 1.13133 28.5569 3.11593 28.5569 6.00514C28.5569 8.90473 26.4567 10.8997 23.4702 10.8997H20.1987V15.9694H17.8349V1.13133H23.544ZM20.1987 8.96648H22.9108C24.9692 8.96648 26.1402 7.88694 26.1402 6.01552C26.1402 4.14448 24.9688 3.07467 22.9212 3.07467H20.1987V8.96648ZM29.1434 12.8945C29.1434 10.9923 30.6314 9.90226 33.375 9.7378L36.3194 9.56295V8.74027C36.3194 7.53753 35.5071 6.87939 34.0613 6.87939C32.8683 6.87939 32.0028 7.47564 31.8242 8.39042H29.6919C29.7556 6.46802 31.6126 5.06972 34.1246 5.06972C36.8262 5.06972 38.5886 6.44746 38.5886 8.58634V15.969H36.4042V14.1901H36.3515C35.7287 15.3518 34.3565 16.0817 32.8683 16.0817C30.6734 16.0817 29.1434 14.8072 29.1434 12.8945ZM36.3195 11.9385V11.1054L33.6918 11.27C32.2138 11.3624 31.4442 11.897 31.4442 12.8325C31.4442 13.7375 32.2459 14.3238 33.5018 14.3238C35.1055 14.3238 36.3195 13.3262 36.3195 11.9385ZM40.597 19.9377V18.1592C40.7449 18.1794 41.1032 18.1999 41.2935 18.1999C42.3381 18.1999 42.9291 17.7688 43.288 16.6575L43.4992 15.9997L39.4992 5.20338H41.9686L44.7548 13.9638H44.8077L47.5936 5.20338H50L45.8524 16.5445C44.9024 19.1463 43.8155 20 41.515 20C41.3354 20 40.7549 19.9793 40.597 19.9377Z\"\n fill=\"white\"\n />\n </svg>\n </div>\n );\n}\n\nexport function GooglePayIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#3C4043', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.296} viewBox=\"0 0 51 21\" fill=\"none\">\n <path d=\"M50.9156 5.87122L44.6406 20.2837H42.6992L45.0289 15.2416L40.9009 5.87122H42.9451L45.929 13.0573H45.9689L48.8714 5.87122H50.9156Z\" fill=\"white\" />\n <path d=\"M39.3906 6.65832C38.5866 5.91563 37.4895 5.54547 36.0995 5.54547C34.314 5.54547 32.9657 6.19816 32.0513 7.50532L33.7084 8.54664C34.3211 7.66089 35.1512 7.21951 36.2011 7.21951C36.8967 7.21951 37.5008 7.44661 38.0194 7.9023C38.538 8.35948 38.7964 8.91352 38.7964 9.5665V9.99507C38.0751 9.58796 37.1536 9.38381 36.0366 9.38381C34.7297 9.38381 33.6839 9.68959 32.8998 10.3023C32.1172 10.9151 31.7256 11.738 31.7256 12.7706C31.7256 13.8033 32.0969 14.5675 32.8396 15.2216C33.5808 15.8758 34.5065 16.2016 35.6092 16.2016C36.9033 16.2016 37.9389 15.6302 38.7147 14.4876H38.7976V15.8761H40.5944V9.70955C40.5944 8.4167 40.1944 7.39982 39.3903 6.65862L39.3906 6.65832ZM37.8665 13.6501C37.2451 14.2343 36.5424 14.5272 35.7511 14.5272C35.1926 14.5272 34.7068 14.3645 34.2913 14.0387C33.8741 13.7103 33.6673 13.3032 33.6673 12.8132C33.6673 12.2675 33.923 11.8134 34.4344 11.4462C34.9443 11.079 35.5815 10.8948 36.3442 10.8948C37.3926 10.8948 38.211 11.1249 38.7967 11.5889C38.7967 12.3775 38.4867 13.0645 37.8668 13.6501H37.8665Z\" fill=\"white\" />\n <path d=\"M30.4166 2.52282C29.5296 1.67999 28.4552 1.25739 27.1883 1.25739H22.2017V15.8758H24.0813V9.95362H27.188C28.4678 9.95362 29.5448 9.53936 30.4163 8.70815C31.3175 7.87962 31.7661 6.84397 31.7661 5.60565C31.7661 4.36733 31.3175 3.36744 30.4163 2.52312L30.4166 2.52282ZM29.0895 7.40248C28.598 7.90525 27.9781 8.15798 27.2297 8.15798H24.0816V3.05272H27.2297C27.9781 3.05272 28.5983 3.31141 29.0895 3.82849C29.5937 4.33276 29.845 4.92554 29.845 5.60535C29.845 6.28516 29.5934 6.8994 29.0895 7.40218V7.40248Z\" fill=\"white\" />\n <path d=\"M16.2663 11.4026C15.8887 12.6964 15.1901 13.9058 14.2131 14.8354C14.1815 14.8655 14.1496 14.895 14.1178 14.9245C14.116 14.9263 14.1148 14.9277 14.113 14.9292C13.1524 15.8144 11.9487 16.4295 10.6737 16.7272C10.6621 16.7302 10.6502 16.7329 10.6385 16.7356C10.2484 16.8241 9.85204 16.8888 9.45357 16.929C8.81668 16.9928 8.17293 16.9928 7.53723 16.9222C7.22102 16.8873 6.9063 16.8348 6.59546 16.7639C6.49293 16.7407 6.39101 16.7156 6.28938 16.6882C5.16759 16.3884 4.11256 15.8564 3.20476 15.1337C3.0018 14.971 2.80599 14.7987 2.61823 14.6184C2.61257 14.613 2.60721 14.6077 2.60154 14.6026C1.93962 13.9657 1.38081 13.22 0.956413 12.4034C0.938829 12.3691 0.921246 12.3352 0.90396 12.3009C0.717393 11.9319 0.559138 11.5493 0.429793 11.1574C0.364822 10.9618 0.307302 10.7634 0.257233 10.5631C0.226834 10.443 0.199117 10.3226 0.174678 10.2013C0.141299 10.0397 0.112986 9.87702 0.0894411 9.714C-0.0509314 8.75165 -0.0267907 7.76517 0.166929 6.81118C0.176168 6.76468 0.185705 6.71879 0.195838 6.6723C0.345748 5.97997 0.582981 5.31 0.903662 4.67698C1.53102 3.42525 2.48025 2.33983 3.62498 1.53514H3.62528C3.73704 1.45616 3.85029 1.38076 3.96533 1.30775C3.99424 1.28957 4.02345 1.27169 4.05206 1.25351C4.11018 1.21774 4.16889 1.18257 4.2276 1.148C4.34562 1.07945 4.46513 1.01329 4.58643 0.950111C4.64723 0.918519 4.70773 0.887822 4.76912 0.858018C5.0755 0.707811 5.39111 0.576975 5.71418 0.466108C5.77021 0.446438 5.82624 0.427961 5.88227 0.409781C5.96661 0.38266 6.05095 0.356731 6.13619 0.332292C6.19312 0.315603 6.25064 0.300106 6.30786 0.284906C6.36448 0.269707 6.4217 0.255401 6.47863 0.241393C6.51111 0.233346 6.5433 0.225895 6.57579 0.218146C6.62764 0.206225 6.6792 0.194901 6.73136 0.183874C6.73464 0.183278 6.73762 0.182681 6.7406 0.181787C6.90481 0.147216 7.06992 0.117711 7.23593 0.093273C7.25262 0.0905907 7.2693 0.088205 7.28629 0.0861187C8.67482 -0.111774 10.114 0.0309834 11.4319 0.518561C12.4443 0.889311 13.3712 1.47882 14.1651 2.21048C13.899 2.4957 13.6138 2.76661 13.3378 3.04705C12.8151 3.56533 12.2971 4.08807 11.774 4.60605C11.7734 4.60545 11.7723 4.60486 11.7717 4.60367L11.7645 4.61082C11.2465 4.11639 10.6192 3.74564 9.9346 3.53642C9.1314 3.29412 8.26652 3.26044 7.44425 3.43658C7.14741 3.49946 6.85772 3.59066 6.57847 3.70779C6.57519 3.70898 6.57221 3.71047 6.56893 3.71166C5.95231 3.97393 5.38843 4.36047 4.92022 4.83881C4.3638 5.39941 3.94089 6.09352 3.68906 6.83979C3.68727 6.8386 3.68548 6.83711 3.68369 6.83591C3.31831 7.89571 3.32308 9.07889 3.68399 10.1384C3.68191 10.1402 3.67982 10.1417 3.67773 10.1435C3.67833 10.1446 3.67863 10.1458 3.67893 10.147C3.68071 10.1461 3.6822 10.1446 3.68399 10.1435C4.03567 11.1892 4.72501 12.1158 5.62835 12.7482C6.19371 13.1473 6.84014 13.428 7.51995 13.5654C8.18545 13.6987 8.87927 13.6844 9.54477 13.5705C10.2103 13.4564 10.8519 13.209 11.4128 12.8338C11.4128 12.8338 11.413 12.834 11.4134 12.8344C11.4164 12.8326 11.4194 12.8308 11.4221 12.8287C12.3081 12.2294 12.9301 11.2691 13.1095 10.2147H8.48467V6.90178H8.48944V6.89701H16.4797C16.7458 8.38955 16.6889 9.94378 16.2657 11.4029L16.2663 11.4026Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PayPalIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#003087' }}\n >\n <span className=\"text-white font-bold\" style={{ fontSize: size * 0.38 }}>P</span>\n </div>\n );\n}\n\nexport function VisaIcon({ size = 32 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: '#1A1F71', borderRadius: size * 0.2 }}\n >\n <svg width={size * 0.72} height={size * 0.234} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function MastercardIcon({ size = 32 }: { size?: number }) {\n const s = size * 0.8;\n return (\n <div\n className=\"flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <svg width={s} height={s * 0.625} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n );\n}\n\nexport function CardIcon({ size = 32 }: { size?: number }) {\n const markW = size * 0.56;\n const markH = markW * 0.65;\n const r = Math.max(2, markW * 0.1);\n const overlap = markW * 0.2;\n return (\n <div className=\"flex items-center justify-center shrink-0\" style={{ width: size, height: size }}>\n {/* Visa mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#1A1F71',\n borderRadius: r,\n position: 'relative',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width={markW * 0.7} height={markH * 0.35} viewBox=\"0 0 43 14\" fill=\"none\">\n <path d=\"M18.3629 13.5165H14.9302L17.0772 0.240662H20.5097L18.3629 13.5165Z\" fill=\"white\" />\n <path d=\"M12.0629 0.240662L8.70119 9.29349L8.33383 7.45747C7.71232 5.33894 5.76311 3.03721 3.58789 1.89272L6.66713 13.5024H10.2971L15.6927 0.240662H12.0629Z\" fill=\"white\" />\n <path d=\"M5.57939 0.240662H0.0565013L0 0.508903C4.3082 1.61059 7.16143 4.26616 8.3337 7.45803L7.13309 1.35661C6.93542 0.508715 6.32798 0.268631 5.57939 0.240662Z\" fill=\"white\" />\n <path d=\"M30.806 0.565203C30.1289 0.296586 29.055 0 27.7271 0C24.3372 0 21.95 1.80767 21.9354 4.3921C21.9072 6.29889 23.6445 7.35796 24.9439 7.99375C26.2719 8.64342 26.7234 9.06747 26.7234 9.64656C26.7099 10.5359 25.6502 10.9459 24.6619 10.9459C23.2914 10.9459 22.5571 10.7345 21.4412 10.2397L20.9891 10.0276L20.5088 13.0077C21.3139 13.3745 22.7972 13.7 24.3372 13.7143C27.939 13.7143 30.2839 11.9346 30.3117 9.18047C30.3254 7.66919 29.4081 6.51119 27.4303 5.56493C26.2297 4.95749 25.4944 4.54791 25.4944 3.92639C25.5085 3.36137 26.1163 2.78265 27.4716 2.78265C28.5876 2.75431 29.4075 3.02255 30.0286 3.29098L30.3391 3.43195L30.806 0.565203Z\" fill=\"white\" />\n <path d=\"M35.3681 8.81332C35.6508 8.05064 36.7386 5.09886 36.7386 5.09886C36.7243 5.1272 37.0207 4.3221 37.1902 3.82785L37.4301 4.97178C37.4301 4.97178 38.0802 8.14956 38.2213 8.81332C37.6848 8.81332 36.0461 8.81332 35.3681 8.81332ZM39.6053 0.240662H36.9501C36.1313 0.240662 35.5092 0.480559 35.156 1.34216L30.0571 13.5163H33.659C33.659 13.5163 34.2519 11.8777 34.3794 11.5248C34.7745 11.5248 38.2784 11.5248 38.7867 11.5248C38.8853 11.9909 39.1963 13.5163 39.1963 13.5163H42.3747L39.6053 0.240662Z\" fill=\"white\" />\n </svg>\n </div>\n {/* Mastercard mark */}\n <div\n style={{\n width: markW,\n height: markH,\n background: '#252525',\n borderRadius: r,\n marginLeft: -overlap,\n position: 'relative',\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <svg width={markH * 0.85} height={markH * 0.6} viewBox=\"0 0 48 30\" fill=\"none\">\n <circle cx=\"18\" cy=\"15\" r=\"14\" fill=\"#EB001B\" />\n <circle cx=\"30\" cy=\"15\" r=\"14\" fill=\"#F79E1B\" />\n <path d=\"M24 2.35A14 14 0 0 1 24 27.65A14 14 0 0 1 24 2.35Z\" fill=\"#FF5F00\" />\n </svg>\n </div>\n </div>\n );\n}\n\nexport function CoinifyIcon({ size = 18 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full bg-white flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <span className=\"text-black font-bold\" style={{ fontSize: size * 0.55 }}>C</span>\n </div>\n );\n}\n\nexport function ChevronDown() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function ChevronRight() {\n return (\n <svg width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\">\n <path d=\"M1 1L7 7L1 13\" stroke=\"var(--t-icon-stroke)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function MenuIcon({ onClick }: { onClick: () => void }) {\n return (\n <button onClick={onClick} className=\"hover:opacity-70 transition-opacity\">\n <svg width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path\n d=\"M22.4004 12V4C22.4004 2.67452 21.3255 1.59961 20 1.59961H6.7998V14.4004H20V16H4V14.4004H5.2002V1.59961H4C2.67452 1.59961 1.59961 2.67452 1.59961 4V12C1.59961 13.3255 2.67452 14.4004 4 14.4004V16L3.79395 15.9951C1.68056 15.8879 0 14.14 0 12V4C0 1.79086 1.79086 6.44266e-08 4 0H20C22.2091 0 24 1.79086 24 4V12L23.9951 12.2061C23.8913 14.2512 22.2512 15.8913 20.2061 15.9951L20 16V14.4004C21.3255 14.4004 22.4004 13.3255 22.4004 12Z\"\n fill=\"var(--t-icon-stroke)\"\n />\n </svg>\n </button>\n );\n}\n\nexport function DarkModeIcon({ size = 40 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-surface)' }}\n >\n <svg width={size * 0.5} height={size * 0.5} viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" stroke=\"var(--t-text)\" strokeWidth=\"1.5\" />\n <path d=\"M10 2.5A7.5 7.5 0 0 1 10 17.5\" fill=\"var(--t-text)\" />\n </svg>\n </div>\n );\n}\n\n/* ───────────── V2 circular payment icons ───────────── */\n\nexport function PaymentBankIcon({ size = 20 }: { size?: number }) {\n const iconSize = size * 0.6;\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={iconSize} height={iconSize} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M11 3.5H1L6 0.5L11 3.5Z\" stroke=\"white\" strokeWidth=\"0.8\" />\n <rect x=\"1.5\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"4.2\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"6.9\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"9.6\" y=\"4.5\" width=\"0.8\" height=\"5\" fill=\"white\" />\n <rect x=\"0.5\" y=\"10.5\" width=\"11\" height=\"0.5\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PaymentCardsIcon({ size = 20 }: { size?: number }) {\n const iconSize = size * 0.6;\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={iconSize} height={iconSize * 0.75} viewBox=\"0 0 12 9\" fill=\"none\">\n <rect x=\"0.5\" y=\"0.5\" width=\"11\" height=\"8\" rx=\"1.5\" stroke=\"white\" strokeWidth=\"0.8\" fill=\"none\" />\n <rect x=\"0.5\" y=\"2.5\" width=\"11\" height=\"1.5\" fill=\"white\" />\n <rect x=\"2\" y=\"5.5\" width=\"3\" height=\"1\" rx=\"0.5\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PaymentAppleIcon({ size = 20 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={10} height={12} viewBox=\"0 0 10 12\" fill=\"none\">\n <path d=\"M8.32 6.32C8.31 5.1 9.32 4.5 9.37 4.47C8.77 3.59 7.83 3.47 7.5 3.46C6.73 3.38 5.99 3.93 5.6 3.93C5.2 3.93 4.59 3.47 3.94 3.48C3.1 3.5 2.32 3.99 1.89 4.74C1.01 6.27 1.66 8.52 2.5 9.76C2.93 10.37 3.43 11.05 4.08 11.03C4.71 11 4.95 10.63 5.71 10.63C6.46 10.63 6.69 11.03 7.34 11.02C8.02 11 8.45 10.4 8.87 9.79C9.36 9.09 9.56 8.41 9.57 8.37C9.55 8.37 8.33 7.88 8.32 6.32Z\" fill=\"white\" />\n <path d=\"M7.13 2.57C7.49 2.12 7.74 1.5 7.67 0.88C7.15 0.91 6.51 1.24 6.13 1.68C5.79 2.08 5.5 2.72 5.58 3.32C6.16 3.37 6.76 3.02 7.13 2.57Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\nexport function PaymentGoogleIcon({ size = 20 }: { size?: number }) {\n return (\n <div\n className=\"rounded-full flex items-center justify-center shrink-0\"\n style={{ width: size, height: size, background: 'var(--t-payment-icon-bg)' }}\n >\n <svg width={10} height={10} viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M9.68 5.11C9.68 4.76 9.65 4.42 9.6 4.09H5V6.02H7.62C7.52 6.58 7.2 7.05 6.73 7.37V8.5H8.26C9.14 7.69 9.68 6.51 9.68 5.11Z\" fill=\"white\" />\n <path d=\"M5 9.58C6.28 9.58 7.35 9.14 8.26 8.5L6.73 7.37C6.33 7.64 5.81 7.79 5 7.79C3.78 7.79 2.73 6.97 2.38 5.87H0.8V7.04C1.71 8.84 3.22 9.58 5 9.58Z\" fill=\"white\" />\n <path d=\"M2.38 5.87C2.28 5.57 2.22 5.25 2.22 4.93C2.22 4.6 2.28 4.28 2.38 3.98V2.82H0.8C0.46 3.49 0.27 4.24 0.27 5.03C0.27 5.73 0.44 6.4 0.73 7L2.38 5.87Z\" fill=\"white\" />\n <path d=\"M5 2.07C5.74 2.07 6.39 2.32 6.91 2.82L8.29 1.45C7.35 0.57 6.28 0.07 5 0.07C3.22 0.07 1.71 1.14 0.8 2.82L2.38 3.98C2.73 2.88 3.78 2.07 5 2.07Z\" fill=\"white\" />\n </svg>\n </div>\n );\n}\n\n/* ───────────── Additional V2 icons ───────────── */\n\nexport function NRLogoIcon({ size = 24 }: { size?: number }) {\n const w = size * (46 / 40);\n return (\n <svg width={w} height={size} viewBox=\"0 0 48 32\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\">\n <path d=\"M0 0H5.76C11.0619 0 15.36 4.47715 15.36 10V32H0V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M16.32 0H22.08C27.3819 0 31.68 4.47715 31.68 10V32H16.32V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M32.64 8C32.64 3.58172 36.0785 0 40.32 0C44.5615 0 48 3.58172 48 8C48 12.4183 44.5615 16 40.32 16C36.0785 16 32.64 12.4183 32.64 8Z\" fill=\"var(--t-text)\" />\n </svg>\n );\n}\n\nexport function InfoIcon({ size = 12 }: { size?: number }) {\n return (\n <div\n className=\"flex items-center justify-center rounded-full shrink-0\"\n style={{\n width: size,\n height: size,\n background: 'var(--t-text-secondary)',\n }}\n >\n <span\n style={{\n fontSize: size * 0.75,\n fontWeight: 500,\n lineHeight: 1,\n letterSpacing: '0.18px',\n color: 'var(--t-bg)',\n }}\n >\n i\n </span>\n </div>\n );\n}\n\nexport function MoreDotsIcon({ onClick }: { onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n className=\"flex items-center justify-center rounded-full transition-opacity hover:opacity-70\"\n style={{ width: 40, height: 40 }}\n >\n <svg width=\"20\" height=\"4\" viewBox=\"0 0 20 4\" fill=\"none\">\n <circle cx=\"2\" cy=\"2\" r=\"2\" fill=\"var(--t-text)\" />\n <circle cx=\"10\" cy=\"2\" r=\"2\" fill=\"var(--t-text)\" />\n <circle cx=\"18\" cy=\"2\" r=\"2\" fill=\"var(--t-text)\" />\n </svg>\n </button>\n );\n}\n\nexport function SearchIcon({ size = 16 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"5.25\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" />\n <path d=\"M11 11l3.5 3.5\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function ArrowUpIcon({ size = 12 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 10V2M6 2L2.5 5.5M6 2l3.5 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function CheckmarkIcon({ size = 14 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M11.5 3.5L5.5 10.5L2.5 7.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function XIcon({ size = 12 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 2l8 8M10 2l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function getPaymentIcon(type: string, size?: number, theme?: 'dark' | 'light'): React.ReactNode;\nexport function getPaymentIcon(type: string, size = 32, _theme?: 'dark' | 'light'): React.ReactNode {\n switch (type) {\n case 'bank': return <PaymentBankIcon size={size} />;\n case 'card': return <PaymentCardsIcon size={size} />;\n case 'applepay': return <PaymentAppleIcon size={size} />;\n case 'googlepay': return <PaymentGoogleIcon size={size} />;\n case 'revolut': return <RevolutIcon size={size} />;\n case 'paypal': return <PayPalIcon size={size} />;\n case 'visa': return <VisaIcon size={size} />;\n case 'mastercard': return <MastercardIcon size={size} />;\n default: return <GenericCoinIcon size={size} />;\n }\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { CheckmarkIcon, XIcon } from './icons';\n\nexport interface ToastProps {\n type: 'success' | 'error';\n title: string;\n description?: string;\n visible: boolean;\n onDismiss: () => void;\n}\n\nexport function Toast({ type, title, description, visible, onDismiss }: ToastProps) {\n const [mounted, setMounted] = useState(false);\n const [exiting, setExiting] = useState(false);\n\n const startExit = useCallback(() => {\n setExiting(true);\n setTimeout(() => {\n setMounted(false);\n setExiting(false);\n onDismiss();\n }, 200);\n }, [onDismiss]);\n\n useEffect(() => {\n if (visible) {\n setMounted(true);\n setExiting(false);\n }\n }, [visible]);\n\n useEffect(() => {\n if (!visible || !mounted) return;\n const t = setTimeout(startExit, 5000);\n return () => clearTimeout(t);\n }, [visible, mounted, startExit]);\n\n if (!mounted) return null;\n\n const bg = type === 'success' ? 'var(--t-toast-success-bg)' : 'var(--t-toast-error-bg)';\n\n return (\n <div\n className=\"absolute top-0 left-0 right-0 z-[25] px-3 pt-3\"\n style={{ animation: exiting ? 'slideUpToastOut 0.2s ease-in forwards' : 'slideDownToast 0.3s ease-out both' }}\n >\n <div\n className=\"flex items-start gap-2.5 rounded-2xl px-4 py-3\"\n style={{ background: bg, color: '#ffffff' }}\n >\n <span className=\"mt-0.5 shrink-0\">\n {type === 'success' ? <CheckmarkIcon size={14} /> : <XIcon size={12} />}\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[13px] font-medium leading-tight\">{title}</div>\n {description && (\n <div className=\"text-[12px] leading-snug mt-0.5 opacity-90\">{description}</div>\n )}\n </div>\n <button\n onClick={startExit}\n className=\"shrink-0 opacity-80 hover:opacity-100 transition-opacity mt-0.5\"\n >\n <XIcon size={10} />\n </button>\n </div>\n </div>\n );\n}\n","export function NRLogo({ width = 46 }: { width?: number }) {\n const h = width * (40 / 46);\n return (\n <svg width={width} height={h} viewBox=\"0 0 48 32\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\">\n <path d=\"M0 0H5.76C11.0619 0 15.36 4.47715 15.36 10V32H0V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M16.32 0H22.08C27.3819 0 31.68 4.47715 31.68 10V32H16.32V0Z\" fill=\"var(--t-text)\" />\n <path d=\"M32.64 8C32.64 3.58172 36.0785 0 40.32 0C44.5615 0 48 3.58172 48 8C48 12.4183 44.5615 16 40.32 16C36.0785 16 32.64 12.4183 32.64 8Z\" fill=\"var(--t-text)\" />\n </svg>\n );\n}\n","import { NRLogo } from '../ui/NRLogo';\n\nexport function LoadingScreen() {\n return (\n <div\n className=\"flex-1 flex items-center justify-center\"\n style={{ animation: 'fadeInScale 0.5s ease-out both' }}\n >\n <NRLogo width={90} />\n </div>\n );\n}\n","import type React from 'react';\n\nexport interface BottomSheetProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nexport function BottomSheet({ isOpen, onClose, children }: BottomSheetProps) {\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 z-[30] transition-opacity duration-300\"\n style={{\n background: 'rgba(0,0,0,0.4)',\n opacity: isOpen ? 1 : 0,\n pointerEvents: isOpen ? 'auto' : 'none',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n onClick={onClose}\n />\n {/* Panel */}\n <div\n className=\"absolute bottom-0 left-0 right-0 z-[31] transition-transform duration-300 ease-out sheet-inverted\"\n style={{\n transform: isOpen ? 'translateY(0)' : 'translateY(100%)',\n borderRadius: 20,\n background: 'var(--t-bg)',\n maxHeight: '70%',\n overflow: 'visible',\n marginBottom: 12,\n marginLeft: 12,\n marginRight: 12,\n }}\n >\n {children}\n </div>\n </>\n );\n}\n","export function CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n onClick={onClick}\n className=\"flex items-center justify-center shrink-0 opacity-60 hover:opacity-100 transition-opacity\"\n style={{ width: 40, height: 40 }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3 3L11 11M11 3L3 11\" stroke=\"var(--t-text)\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n );\n}\n","export function SearchInput({\n value,\n onChange,\n placeholder = '',\n inline = false,\n}: {\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n /** When true, removes outer margin so it sits flush inside a parent container */\n inline?: boolean;\n}) {\n return (\n <div\n className={`flex items-center ${inline ? '' : 'mx-5 mb-5'}`}\n style={{\n height: 48,\n borderRadius: 100,\n backgroundColor: 'var(--t-surface)',\n paddingLeft: 16,\n paddingRight: 12,\n gap: 10,\n }}\n >\n {/* Search icon */}\n <div className=\"shrink-0 flex items-center justify-center\" style={{ color: 'var(--t-text-secondary)' }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"6.25\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"M13.5 13.5l4 4\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </div>\n <input\n type=\"text\"\n value={value}\n onChange={e => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"flex-1 min-w-0 focus-visible:outline-none\"\n style={{\n height: '100%',\n border: 'none',\n outline: 'none',\n boxShadow: 'none',\n color: 'var(--t-text)',\n fontSize: 14,\n backgroundColor: 'transparent',\n }}\n />\n {value && (\n <button\n onClick={() => onChange('')}\n className=\"shrink-0 flex items-center justify-center\"\n style={{ width: 20, height: 20 }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M2 2l8 8M10 2l-8 8\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","/**\n * Fiat Currency Selector Modal\n * Searchable list of fiat currencies with flag icons.\n * Uses API currencies if provided, falls back to static FIAT_CURRENCIES data.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { FiatFlag } from '../ui/icons';\nimport { FIAT_CURRENCIES, type FiatCurrency } from '../../data/cryptoData';\nimport { useT } from '../../i18n';\n\nconst POPULAR_FIATS = ['USD', 'EUR', 'GBP'];\n\nexport interface FiatCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string) => void;\n\t/** Currencies from API config — takes precedence over static fallback */\n\tcurrencies?: Array<{ code: string; name?: string }>;\n\t/** Base URL for static assets (fiat flags) */\n\tassetBaseUrl?: string;\n\t/** Currently selected currency code */\n\tselectedCode?: string;\n}\n\nexport function FiatCurrencyModal({\n\tonClose,\n\tonSelect,\n\tcurrencies,\n\tassetBaseUrl = '',\n\tselectedCode,\n}: FiatCurrencyModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\t// Merge API data with static fallback for display names\n\tconst currencyList = useMemo<FiatCurrency[]>(() => {\n\t\tif (!currencies || currencies.length === 0) return FIAT_CURRENCIES;\n\n\t\t// Build a lookup from static data for display names\n\t\tconst staticMap = new Map(FIAT_CURRENCIES.map((c) => [c.code, c.name]));\n\n\t\treturn currencies.map((c) => ({\n\t\t\tcode: c.code,\n\t\t\tname: c.name || staticMap.get(c.code) || c.code,\n\t\t}));\n\t}, [currencies]);\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode) {\n\t\t\t\tconst selected = currencyList.find((c) => c.code === selectedCode);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = currencyList.filter((c) => c.code !== selectedCode);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn currencyList;\n\t\t}\n\n\t\treturn currencyList.filter(\n\t\t\t(c) => c.code.toLowerCase().includes(raw) || c.name.toLowerCase().includes(raw)\n\t\t);\n\t}, [currencyList, search, selectedCode]);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Modal header — 128px with blurred bg */}\n\t\t\t<div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n\t\t\t\t<div className=\"absolute\" style={{ left: 12, top: 20 }}>\n\t\t\t\t\t<NRLogo width={46} />\n\t\t\t\t</div>\n\t\t\t\t<p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n\t\t\t\t\t{t('modal.selectFiat')}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"absolute\" style={{ right: 12, top: 20 }}>\n\t\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n\t\t\t\t\t<SearchInput value={search} onChange={setSearch} inline />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n\t\t\t\t{filtered.map((c, i) => {\n\t\t\t\t\tconst isSelected = selectedCode === c.code;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={c.code}\n\t\t\t\t\t\t\tonClick={() => onSelect(c.code)}\n\t\t\t\t\t\t\tclassName=\"flex items-center w-full card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\tstyle={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<FiatFlag currencyCode={c.code} size={32} baseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t<div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n\t\t\t\t\t\t\t\t<span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n\t\t\t\t\t\t\t\t\t{c.code}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{POPULAR_FIATS.includes(c.code) && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ border: '1.5px solid var(--t-card-border)', borderRadius: 100, paddingLeft: 8, paddingRight: 8, color: 'var(--t-text-secondary)', lineHeight: '20px', letterSpacing: '0.22px' }}>\n\t\t\t\t\t\t\t\t\t\t{t('modal.popular')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{t('modal.noCurrencies')}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Crypto Currency + Chain Selector Modal\n * Searchable list of crypto+chain combinations with compound icons (crypto icon + chain badge).\n * Smart search ranking: exact code > starts with > popular > other.\n * Uses API data if provided, falls back to static CRYPTO_CHAIN_COMBOS.\n */\n\nimport { useState, useMemo, useCallback, useRef } from 'react';\nimport { useT } from '../../i18n';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport {\n\tCRYPTO_CHAIN_COMBOS,\n\tgetCryptoIconUrl,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\tCRYPTO_NAMES,\n\ttype CryptoChainCombo,\n} from '../../data/cryptoData';\n\nconst POPULAR_CRYPTOS = ['BTC', 'ETH', 'SOL'];\n\n/** Image component with loading state and error fallback */\nfunction CryptoImage({ src, alt, size, className, style }: {\n\tsrc: string;\n\talt: string;\n\tsize: number;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}) {\n\tconst [loaded, setLoaded] = useState(false);\n\tconst [error, setError] = useState(false);\n\tconst currentSrc = useRef(src);\n\n\t// Reset state when src changes, using ref to avoid race with onLoad\n\tif (currentSrc.current !== src) {\n\t\tcurrentSrc.current = src;\n\t\tsetLoaded(false);\n\t\tsetError(false);\n\t}\n\n\tconst handleLoad = useCallback(() => setLoaded(true), []);\n\tconst handleError = useCallback(() => setError(true), []);\n\n\treturn (\n\t\t<div className={className} style={{ ...style, width: size, height: size, position: 'relative' }}>\n\t\t\t{/* Placeholder shown while loading */}\n\t\t\t{!loaded && !error && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full animate-pulse\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{/* Fallback for broken images */}\n\t\t\t{error ? (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 rounded-full flex items-center justify-center text-[10px] font-bold\"\n\t\t\t\t\tstyle={{ background: 'var(--t-pill-bg, #333)', color: 'var(--t-text-muted)' }}\n\t\t\t\t>\n\t\t\t\t\t{alt.slice(0, 3)}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<img\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={alt}\n\t\t\t\t\twidth={size}\n\t\t\t\t\theight={size}\n\t\t\t\t\tonLoad={handleLoad}\n\t\t\t\t\tonError={handleError}\n\t\t\t\t\tclassName={`rounded-full ${loaded ? 'opacity-100' : 'opacity-0'}`}\n\t\t\t\t\tstyle={{ width: size, height: size, transition: 'opacity 0.15s ease-in' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport interface CryptoCurrencyModalProps {\n\tonClose: () => void;\n\tonSelect: (code: string, chain: string) => void;\n\t/** Crypto data from API config — takes precedence over static fallback */\n\tcryptos?: Array<{\n\t\tcode: string;\n\t\tname?: string;\n\t\tnetworks?: Array<{ code: string; id?: string; name?: string }>;\n\t}>;\n\t/** Base URL for static assets (crypto icons) */\n\tassetBaseUrl?: string;\n\t/** Currently selected crypto code */\n\tselectedCode?: string;\n\t/** Currently selected chain/network */\n\tselectedChain?: string;\n}\n\nexport function CryptoCurrencyModal({ onClose, onSelect, cryptos, assetBaseUrl = '', selectedCode, selectedChain }: CryptoCurrencyModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\t// Build flat combo list from API data or fall back to static data\n\tconst comboList = useMemo<CryptoChainCombo[]>(() => {\n\t\tif (!cryptos || cryptos.length === 0) return CRYPTO_CHAIN_COMBOS;\n\n\t\tconst list: CryptoChainCombo[] = [];\n\t\tfor (const c of cryptos) {\n\t\t\tconst networks = c.networks || [];\n\t\t\t// Get name from API, fallback to CRYPTO_NAMES lookup, then code\n\t\t\tconst cryptoName = c.name || CRYPTO_NAMES[c.code] || c.code;\n\t\t\tif (networks.length === 0) {\n\t\t\t\t// No networks listed — add a single entry with the code as chain\n\t\t\t\tlist.push({ code: c.code, name: cryptoName, chain: c.code, popular: POPULAR_CRYPTOS.includes(c.code) });\n\t\t\t} else {\n\t\t\t\tfor (const net of networks) {\n\t\t\t\t\tconst chainCode = net.code || net.id || net.name || c.code;\n\t\t\t\t\tlist.push({\n\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\tname: cryptoName,\n\t\t\t\t\t\tchain: chainCode,\n\t\t\t\t\t\tchainName: net.name,\n\t\t\t\t\t\tpopular: POPULAR_CRYPTOS.includes(c.code),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}, [cryptos]);\n\n\t// Check if an item is currently selected\n\tconst isSelected = useCallback((code: string, chain: string) => {\n\t\treturn selectedCode === code && selectedChain === chain;\n\t}, [selectedCode, selectedChain]);\n\n\t// Filtered and ranked results\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedCode && selectedChain) {\n\t\t\t\tconst selected = comboList.find(c => c.code === selectedCode && c.chain === selectedChain);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = comboList.filter(c => !(c.code === selectedCode && c.chain === selectedChain));\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn comboList;\n\t\t}\n\n\t\tconst terms = raw.split(/\\s+/);\n\t\tconst scored: Array<{ item: CryptoChainCombo; score: number }> = [];\n\n\t\tfor (const c of comboList) {\n\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\tconst chainName = chain ? chain.name.toLowerCase() : '';\n\t\t\tconst chainShort = chain?.shortName?.toLowerCase() || '';\n\t\t\tconst chainCode = c.chain.toLowerCase();\n\t\t\tconst code = c.code.toLowerCase();\n\t\t\tconst name = c.name.toLowerCase();\n\t\t\tconst fields = [code, name, chainName, chainShort, chainCode];\n\n\t\t\t// All search terms must match at least one field\n\t\t\tconst allMatch = terms.every((t) => fields.some((f) => f.includes(t)));\n\t\t\tif (!allMatch) continue;\n\n\t\t\t// Scoring: exact code match > starts with > chain match bonus > popular\n\t\t\tlet score = 0;\n\t\t\tif (code === raw) score += 100;\n\t\t\telse if (code.startsWith(terms[0])) score += 50;\n\t\t\tif (c.popular) score += 10;\n\t\t\tif (\n\t\t\t\tterms.length > 1 &&\n\t\t\t\t(chainName.includes(terms[1]) ||\n\t\t\t\t\tchainShort.includes(terms[1]) ||\n\t\t\t\t\tchainCode.includes(terms[1]))\n\t\t\t) {\n\t\t\t\tscore += 25;\n\t\t\t}\n\t\t\tscored.push({ item: c, score });\n\t\t}\n\n\t\tscored.sort((a, b) => b.score - a.score);\n\t\treturn scored.map((s) => s.item);\n\t}, [comboList, search, selectedCode, selectedChain]);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Modal header — 128px with blurred bg */}\n\t\t\t<div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n\t\t\t\t<div className=\"absolute\" style={{ left: 12, top: 20 }}>\n\t\t\t\t\t<NRLogo width={46} />\n\t\t\t\t</div>\n\t\t\t\t<p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n\t\t\t\t\t{t('modal.selectCrypto')}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"absolute\" style={{ right: 12, top: 20 }}>\n\t\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n\t\t\t\t\t<SearchInput value={search} onChange={setSearch} inline />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n\t\t\t\t{filtered.map((c, i) => {\n\t\t\t\t\tconst chain = getChainInfo(c.chain);\n\t\t\t\t\tconst chainName = chain?.name || c.chainName || c.chain;\n\t\t\t\t\tconst itemSelected = isSelected(c.code, c.chain);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={`${c.code}-${c.chain}`}\n\t\t\t\t\t\t\tonClick={() => onSelect(c.code, c.chain)}\n\t\t\t\t\t\t\tclassName=\"flex items-center w-full card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\tstyle={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Compound icon: crypto icon + chain badge */}\n\t\t\t\t\t\t\t<div className=\"relative shrink-0\" style={{ width: 40, height: 40 }}>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 left-0\"\n\t\t\t\t\t\t\t\t\tstyle={{ background: '#ffffff', borderRadius: '50%' }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\tsrc={getCryptoIconUrl(c.code, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\talt={c.code}\n\t\t\t\t\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"absolute\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\t\t\t\tborder: '1.5px solid var(--t-chain-border, var(--t-surface, #1C1C22))',\n\t\t\t\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\t\t\t\tbackground: '#ffffff',\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CryptoImage\n\t\t\t\t\t\t\t\t\t\tsrc={getChainIconUrl(c.chain, assetBaseUrl)}\n\t\t\t\t\t\t\t\t\t\talt={c.chain}\n\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n\t\t\t\t\t\t\t\t<span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n\t\t\t\t\t\t\t\t\t{c.code}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"text-[15px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t{chainName}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{c.popular && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ border: '1.5px solid var(--t-card-border)', borderRadius: 100, paddingLeft: 8, paddingRight: 8, color: 'var(--t-text-secondary)', lineHeight: '20px', letterSpacing: '0.22px' }}>\n\t\t\t\t\t\t\t\t\t\t{t('modal.popular')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{itemSelected && (\n\t\t\t\t\t\t\t\t\t<div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{t('modal.noCurrencies')}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * PaymentMethodSelector\n * Inline row that opens a modal to choose a payment method.\n * Styled to match the exchange rate row in the form.\n */\n\nimport { useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { getPaymentIcon, GenericCoinIcon, ChevronDown } from './ui/icons';\nimport { useT, type TranslationKey } from '../i18n';\n\n// Map Banxa payment-method IDs to icon keys used by getPaymentIcon\nconst ICON_KEY_MAP: Record<string, string> = {\n\t'debit-credit-card': 'card',\n\t'bank-transfer': 'bank',\n\t'ach-bank-transfer': 'bank',\n\t'payid-bank-transfer': 'bank',\n\t'sepa-bank-transfer': 'bank',\n\tsepa: 'bank',\n\t'apple-pay': 'applepay',\n\t'google-pay': 'googlepay',\n\tpaypal: 'paypal',\n\trevolut: 'revolut',\n};\n\n// Localizable short names (non-brand)\nconst LOCALIZABLE_SHORT_NAMES: Record<string, TranslationKey> = {\n\t'debit-credit-card': 'payment.name.card',\n\t'bank-transfer': 'payment.name.bankTransfer',\n\t'ach-bank-transfer': 'payment.name.ach',\n};\n\n// Brand names that stay in English\nconst BRAND_NAME_MAP: Record<string, string> = {\n\t'apple-pay': 'Apple Pay',\n\t'google-pay': 'Google Pay',\n\t'payid-bank-transfer': 'PayID',\n\tpaypal: 'PayPal',\n\trevolut: 'Revolut',\n};\n\n// Compact names for inline card display (where space is tight)\nconst SHORT_NAME_MAP: Record<string, string> = {\n\t'sepa-bank-transfer': 'SEPA',\n\tsepa: 'SEPA',\n\t'bank-transfer': 'Bank',\n\t'ach-bank-transfer': 'ACH',\n};\n\nexport function getMethodDisplayName(\n\tid: string,\n\tfullName: string,\n\tt?: (key: TranslationKey) => string,\n\tshort = false,\n): string {\n\tif (short) {\n\t\tconst compact = SHORT_NAME_MAP[id];\n\t\tif (compact) return compact;\n\t}\n\tconst brand = BRAND_NAME_MAP[id];\n\tif (brand) return brand;\n\tconst key = LOCALIZABLE_SHORT_NAMES[id];\n\tif (key && t) return t(key);\n\t// Fallback: English defaults for when t is not provided\n\tif (key) {\n\t\tconst fallbacks: Record<string, string> = {\n\t\t\t'debit-credit-card': 'Card',\n\t\t\t'bank-transfer': 'Bank Transfer',\n\t\t\t'ach-bank-transfer': 'ACH',\n\t\t};\n\t\treturn fallbacks[id] || fullName;\n\t}\n\treturn fullName;\n}\n\nexport function getMethodIcon(methodId: string, icon?: string, size = 24): React.ReactNode {\n\tconst iconKey = ICON_KEY_MAP[methodId];\n\tif (iconKey) return getPaymentIcon(iconKey, size);\n\tif (icon) return <img src={icon} alt=\"\" width={size} height={size} style={{ borderRadius: '50%' }} />;\n\treturn <GenericCoinIcon size={size} />;\n}\n\nexport interface PaymentMethodSelectorProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonOpenModal: () => void;\n\tfiatCurrency: string;\n}\n\nexport function PaymentMethodSelector({\n\tmethods,\n\tselectedId,\n\tonOpenModal,\n\tfiatCurrency,\n}: PaymentMethodSelectorProps) {\n\tconst t = useT();\n\tconst filtered = useMemo(\n\t\t() => methods.filter((m) => m.supportedFiats.includes(fiatCurrency)),\n\t\t[methods, fiatCurrency]\n\t);\n\n\tconst selected = filtered.find((m) => m.id === selectedId) || filtered[0];\n\n\tif (filtered.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center justify-between px-[18px] pt-[12px] pb-[14px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t{t('payment.unavailableFor', { currency: fiatCurrency })}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\trole=\"button\"\n\t\t\t\ttabIndex={0}\n\t\t\t\tonClick={onOpenModal}\n\t\t\t\tonKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n\t\t\t\tclassName=\"flex items-center justify-between w-full px-[18px] transition-colors\"\n\t\t\t\tstyle={{\n\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\tborderBottomLeftRadius: 5,\n\t\t\t\t\tborderBottomRightRadius: 5,\n\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\theight: 42,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t{t('payment.label')}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n\t\t\t\t\t\t{selected && getMethodIcon(selected.id, selected.icon, 20)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-[13px] font-medium\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t{selected ? getMethodDisplayName(selected.id, selected.name, t) : t('payment.select')}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown />\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","/**\n * Payment Method Modal\n * Searchable list of payment methods with icons.\n * Follows the same pattern as FiatCurrencyModal / CryptoCurrencyModal.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { SupportedPaymentMethod } from '@nowramp/sdk';\nimport { useT } from '../../i18n';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { getMethodIcon, getMethodDisplayName } from '../PaymentMethodSelector';\n\nexport interface PaymentMethodModalProps {\n\tmethods: SupportedPaymentMethod[];\n\tselectedId: string;\n\tonSelect: (id: string) => void;\n\tonClose: () => void;\n}\n\nexport function PaymentMethodModal({\n\tmethods,\n\tselectedId,\n\tonSelect,\n\tonClose,\n}: PaymentMethodModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\t// The first method from the API is the recommended one (before reordering)\n\tconst recommendedId = methods.length > 0 ? methods[0].id : '';\n\n\tconst filtered = useMemo(() => {\n\t\tconst raw = search.trim().toLowerCase();\n\n\t\t// If no search, put selected item first\n\t\tif (!raw) {\n\t\t\tif (selectedId) {\n\t\t\t\tconst selected = methods.find((m) => m.id === selectedId);\n\t\t\t\tif (selected) {\n\t\t\t\t\tconst rest = methods.filter((m) => m.id !== selectedId);\n\t\t\t\t\treturn [selected, ...rest];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn methods;\n\t\t}\n\n\t\treturn methods.filter(\n\t\t\t(m) =>\n\t\t\t\tm.id.toLowerCase().includes(raw) ||\n\t\t\t\tm.name.toLowerCase().includes(raw) ||\n\t\t\t\t(m.description && m.description.toLowerCase().includes(raw))\n\t\t);\n\t}, [methods, search, selectedId]);\n\n\treturn (\n\t\t<>\n\t\t\t{/* Modal header — 128px with blurred bg */}\n\t\t\t<div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n\t\t\t\t<div className=\"absolute\" style={{ left: 12, top: 20 }}>\n\t\t\t\t\t<NRLogo width={46} />\n\t\t\t\t</div>\n\t\t\t\t<p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n\t\t\t\t\t{t('modal.choosePayment')}\n\t\t\t\t</p>\n\t\t\t\t<div className=\"absolute\" style={{ right: 12, top: 20 }}>\n\t\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n\t\t\t\t\t<SearchInput value={search} onChange={setSearch} inline />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n\t\t\t\t{filtered.map((m, i) => {\n\t\t\t\t\tconst isSelected = m.id === selectedId;\n\t\t\t\t\tconst shortName = getMethodDisplayName(m.id, m.name, t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={m.id}\n\t\t\t\t\t\t\tonClick={() => onSelect(m.id)}\n\t\t\t\t\t\t\tclassName=\"flex items-center w-full card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\tstyle={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0\"\n\t\t\t\t\t\t\t\tstyle={{ width: 32, height: 32 }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{getMethodIcon(m.id, m.icon, 32)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n\t\t\t\t\t\t\t\t<span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n\t\t\t\t\t\t\t\t\t{shortName}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{m.id === recommendedId && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ border: '1.5px solid var(--t-card-border)', borderRadius: 100, paddingLeft: 8, paddingRight: 8, color: 'var(--t-text-secondary)', lineHeight: '20px', letterSpacing: '0.22px' }}>\n\t\t\t\t\t\t\t\t\t\t{t('modal.recommended')}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t<div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n\t\t\t\t\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M13.5 4.5L6 12L2.5 8.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"var(--t-success, #4CD964)\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t\t{filtered.length === 0 && (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{t('modal.noPaymentMethods')}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","export function ToggleSwitch({\n checked,\n onChange,\n accentColor,\n}: {\n checked: boolean;\n onChange: (v: boolean) => void;\n accentColor?: string;\n}) {\n return (\n <button\n onClick={() => onChange(!checked)}\n className=\"relative shrink-0 transition-colors duration-200\"\n style={{\n width: 64,\n height: 28,\n borderRadius: 14,\n backgroundColor: checked ? (accentColor || 'var(--t-toggle-on)') : 'var(--t-toggle-off)',\n }}\n >\n <div\n className=\"absolute top-[2px] bg-white shadow\"\n style={{\n width: 39,\n height: 24,\n borderRadius: 13,\n transform: checked ? 'translateX(23px)' : 'translateX(2px)',\n transition: 'transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1)',\n }}\n />\n </button>\n );\n}\n","/**\n * Settings Screen Modal\n * Location selector, dark mode toggle, and links (Privacy Policy, Terms of Use).\n * Each row is a rounded surface card matching the Figma V2 design.\n */\n\nimport { useState } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { NRLogo } from '../ui/NRLogo';\nimport { ChevronDown, ChevronRight } from '../ui/icons';\nimport { ToggleSwitch } from '../ui/ToggleSwitch';\nimport { useI18n } from '../../i18n';\n\nconst SETTINGS_LINK_KEYS = [\n { key: 'settings.privacy' as const, href: 'https://nowramp.com/privacy-policy' },\n { key: 'settings.terms' as const, href: 'https://nowramp.com/terms-and-conditions' },\n];\n\nconst cardStyle = {\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n} as const;\n\nexport interface SettingsScreenProps {\n onClose: () => void;\n darkMode: boolean;\n onToggleDarkMode: (v: boolean) => void;\n skinId: string;\n onSelectSkin: (id: string) => void;\n /** Show dark mode toggle (default: true) */\n showThemeToggle?: boolean;\n /** Currently detected/selected country code */\n country?: string;\n /** Display name for the country */\n countryName?: string;\n /** Callback when location row is pressed */\n onLocationPress?: () => void;\n /** Callback when language row is pressed (opens language picker modal) */\n onLanguagePress?: () => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n}\n\nexport function SettingsScreen({\n onClose,\n darkMode,\n onToggleDarkMode,\n skinId: _skinId,\n onSelectSkin: _onSelectSkin,\n showThemeToggle = true,\n country,\n countryName,\n onLocationPress,\n onLanguagePress,\n assetBaseUrl = '',\n}: SettingsScreenProps) {\n void _skinId;\n void _onSelectSkin;\n\n const { t, locale, languages } = useI18n();\n const [flagError, setFlagError] = useState(false);\n\n return (\n <>\n {/* Modal header — 80px with blurred bg */}\n <div className=\"relative shrink-0\" style={{ height: 80, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n <div className=\"absolute\" style={{ left: 12, top: 20 }}>\n <NRLogo width={46} />\n </div>\n <div className=\"absolute\" style={{ right: 12, top: 20 }}>\n <CloseButton onClick={onClose} />\n </div>\n </div>\n <div className=\"px-3 flex-1 pt-4 overflow-y-auto custom-scroll\" style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {/* Location card — label inside, flag + country + chevron */}\n {onLocationPress && (\n <button\n onClick={onLocationPress}\n className=\"w-full text-left transition-colors card-press modal-item-in\"\n style={{ ...cardStyle, backgroundColor: 'var(--t-surface)', color: 'inherit', border: 'none', cursor: 'pointer', padding: '12px 16px' }}\n >\n <span className=\"text-[13px] block mb-1.5\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('settings.location')}\n </span>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {country && !flagError ? (\n <img\n src={`${assetBaseUrl}/flags/${country.toLowerCase()}.svg`}\n alt={country}\n width={28}\n height={28}\n style={{ width: 28, height: 28, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setFlagError(true)}\n />\n ) : (\n <GlobeIcon size={28} />\n )}\n <span className=\"text-[15px] font-medium\" style={{ color: 'var(--t-text)' }}>\n {countryName || country}\n </span>\n </div>\n <ChevronDown />\n </div>\n </button>\n )}\n\n {/* Dark mode card */}\n {showThemeToggle && (\n <div\n className=\"flex items-center justify-between w-full px-4 modal-item-in\"\n style={{ ...cardStyle, paddingTop: 14, paddingBottom: 14, animationDelay: '60ms' }}\n >\n <span className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n {t('settings.darkMode')}\n </span>\n <ToggleSwitch checked={darkMode} onChange={onToggleDarkMode} />\n </div>\n )}\n\n {/* Language card */}\n {onLanguagePress && (\n <button\n onClick={onLanguagePress}\n className=\"flex items-center justify-between w-full transition-colors card-press modal-item-in\"\n style={{ ...cardStyle, backgroundColor: 'var(--t-surface)', color: 'inherit', border: 'none', cursor: 'pointer', padding: '14px 16px', margin: 0, textAlign: 'left', animationDelay: '120ms' }}\n >\n <span className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n {t('settings.language')}\n </span>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {languages.find(l => l.code === locale)?.name || locale}\n </span>\n </button>\n )}\n\n {/* Links: Privacy Policy, Terms of Use — each in its own card */}\n {SETTINGS_LINK_KEYS.map((item, i) => (\n <a\n key={item.key}\n href={item.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-between w-full px-4 transition-colors card-press modal-item-in\"\n style={{ ...cardStyle, textDecoration: 'none', color: 'inherit', paddingTop: 14, paddingBottom: 14, animationDelay: `${180 + i * 60}ms` }}\n >\n <span className=\"font-medium text-[15px]\" style={{ color: 'var(--t-text)' }}>\n {t(item.key)}\n </span>\n <ChevronRight />\n </a>\n ))}\n </div>\n </>\n );\n}\n\nfunction GlobeIcon({ size = 28 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\">\n <circle cx=\"20\" cy=\"20\" r=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <ellipse cx=\"20\" cy=\"20\" rx=\"9\" ry=\"18\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" fill=\"none\" />\n <line x1=\"2\" y1=\"20\" x2=\"38\" y2=\"20\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.5\" />\n <path d=\"M5 12h30M5 28h30\" stroke=\"var(--t-text-secondary)\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n","/**\n * Country Picker Modal\n * Searchable list of countries with flag icons.\n * Follows the FiatCurrencyModal pattern.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { COUNTRIES, COUNTRY_MAP } from '../../data/countries';\nimport { useT } from '../../i18n';\n\nexport interface CountryPickerModalProps {\n onClose: () => void;\n onSelect: (countryCode: string) => void;\n /** Base URL for static assets (flags) */\n assetBaseUrl?: string;\n /** Currently selected country code */\n selectedCode?: string;\n}\n\nexport function CountryPickerModal({\n onClose,\n onSelect,\n assetBaseUrl = '',\n selectedCode,\n}: CountryPickerModalProps) {\n const t = useT();\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n const raw = search.trim().toLowerCase();\n\n // If no search, put selected item first\n if (!raw) {\n if (selectedCode) {\n const normalizedCode = selectedCode.toLowerCase();\n const selected = COUNTRY_MAP[normalizedCode];\n if (selected) {\n const rest = COUNTRIES.filter((c) => c.code !== normalizedCode);\n return [selected, ...rest];\n }\n }\n return COUNTRIES;\n }\n\n return COUNTRIES.filter(\n (c) =>\n c.name.toLowerCase().includes(raw) ||\n c.code.includes(raw) ||\n c.defaultFiat.toLowerCase().includes(raw)\n );\n }, [search, selectedCode]);\n\n return (\n <>\n {/* Modal header — 128px with blurred bg */}\n <div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n <div className=\"absolute\" style={{ left: 12, top: 20 }}>\n <NRLogo width={46} />\n </div>\n <p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n {t('modal.selectCountry')}\n </p>\n <div className=\"absolute\" style={{ right: 12, top: 20 }}>\n <CloseButton onClick={onClose} />\n </div>\n <div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n <SearchInput value={search} onChange={setSearch} inline />\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n {filtered.map((c, i) => {\n const isSelected = selectedCode?.toLowerCase() === c.code;\n return (\n <button\n key={c.code}\n onClick={() => onSelect(c.code)}\n className=\"flex items-center w-full card-press hover-item modal-item-in\"\n style={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n >\n <CountryFlag code={c.code} size={32} baseUrl={assetBaseUrl} />\n <div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, gap: 10 }}>\n <span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n {c.name}\n </span>\n {isSelected && (\n <div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"var(--t-success, #4CD964)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n </button>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n {t('modal.noCountries')}\n </div>\n )}\n </div>\n </>\n );\n}\n\n/** Country flag image using the /flags/{code}.svg pattern */\nfunction CountryFlag({ code, size = 32, baseUrl = '' }: { code: string; size?: number; baseUrl?: string }) {\n const [error, setError] = useState(false);\n\n if (error) {\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: '50%',\n background: 'var(--t-pill-bg, #333)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: size * 0.4,\n color: 'var(--t-text-muted)',\n }}\n >\n {code.toUpperCase().slice(0, 2)}\n </div>\n );\n }\n\n return (\n <img\n src={`${baseUrl}/flags/${code}.svg`}\n alt={code}\n width={size}\n height={size}\n style={{ width: size, height: size, borderRadius: '50%', objectFit: 'cover' }}\n onError={() => setError(true)}\n />\n );\n}\n","/**\n * Language Picker Modal\n * Searchable list of languages.\n * Follows the CountryPickerModal pattern.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { NRLogo } from '../ui/NRLogo';\nimport { LANGUAGES, type LanguageCode } from '../../i18n/languages';\nimport { useT } from '../../i18n';\n\nexport interface LanguagePickerModalProps {\n onClose: () => void;\n onSelect: (code: LanguageCode) => void;\n /** Currently selected language code */\n selectedCode?: string;\n}\n\nexport function LanguagePickerModal({\n onClose,\n onSelect,\n selectedCode,\n}: LanguagePickerModalProps) {\n const t = useT();\n const [search, setSearch] = useState('');\n\n const filtered = useMemo(() => {\n const raw = search.trim().toLowerCase();\n\n // If no search, put selected item first\n if (!raw) {\n if (selectedCode) {\n const selected = LANGUAGES.find((l) => l.code === selectedCode);\n if (selected) {\n const rest = LANGUAGES.filter((l) => l.code !== selectedCode);\n return [selected, ...rest];\n }\n }\n return LANGUAGES;\n }\n\n return LANGUAGES.filter(\n (l) =>\n l.name.toLowerCase().includes(raw) ||\n l.english.toLowerCase().includes(raw) ||\n l.code.includes(raw)\n );\n }, [search, selectedCode]);\n\n return (\n <>\n {/* Modal header — 128px with blurred bg */}\n <div className=\"relative shrink-0\" style={{ height: 128, background: 'var(--t-header-bg)', backdropFilter: 'blur(var(--t-header-blur))', WebkitBackdropFilter: 'blur(var(--t-header-blur))' }}>\n <div className=\"absolute\" style={{ left: 12, top: 20 }}>\n <NRLogo width={46} />\n </div>\n <p className=\"absolute text-[16px] text-center truncate\" style={{ top: 28, left: 64, right: 64, color: 'var(--t-text)', lineHeight: '24px' }}>\n {t('modal.selectLanguage')}\n </p>\n <div className=\"absolute\" style={{ right: 12, top: 20 }}>\n <CloseButton onClick={onClose} />\n </div>\n <div className=\"absolute\" style={{ bottom: 8, left: 12, right: 12 }}>\n <SearchInput value={search} onChange={setSearch} inline />\n </div>\n </div>\n <div className=\"flex-1 overflow-y-auto custom-scroll px-3\">\n {filtered.map((lang, i) => {\n const isSelected = selectedCode === lang.code;\n return (\n <button\n key={lang.code}\n onClick={() => onSelect(lang.code)}\n className=\"flex items-center w-full card-press hover-item modal-item-in\"\n style={{ gap: 16, animationDelay: `${Math.min(i * 45, 350)}ms` }}\n >\n <div className=\"flex-1 flex items-center\" style={{ borderBottom: '1px solid var(--t-card-border)', paddingTop: 20, paddingBottom: 20, paddingLeft: 4, gap: 10 }}>\n <span className=\"flex-1 text-[18px] text-left\" style={{ color: 'var(--t-text)', lineHeight: '20px' }}>\n {lang.name}\n </span>\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>\n {lang.english}\n </span>\n {isSelected && (\n <div style={{ width: 40, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"var(--t-success, #4CD964)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n </button>\n );\n })}\n {filtered.length === 0 && (\n <div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n {t('modal.noLanguages')}\n </div>\n )}\n </div>\n </>\n );\n}\n","import { NRLogo } from '../ui/NRLogo';\nimport { MoreDotsIcon } from '../ui/icons';\nimport { useT } from '../../i18n';\n\nexport interface HeaderBarProps {\n tab: 'buy' | 'sell';\n onTabSwitch: (tab: 'buy' | 'sell') => void;\n showFlowToggle: boolean;\n showSettings: boolean;\n onOpenSettings: () => void;\n darkMode: boolean;\n}\n\nexport function HeaderBar({\n tab,\n onTabSwitch,\n showFlowToggle,\n showSettings,\n onOpenSettings,\n}: HeaderBarProps) {\n const t = useT();\n return (\n <div\n className=\"absolute top-0 left-0 right-0 z-10 flex items-center justify-between px-3\"\n style={{\n height: 80,\n background: 'var(--t-header-bg)',\n backdropFilter: `blur(var(--t-header-blur))`,\n WebkitBackdropFilter: `blur(var(--t-header-blur))`,\n }}\n >\n {/* Left: NR logo */}\n <div style={{ width: 46, display: 'flex', alignItems: 'center', justifyContent: 'flex-start' }}>\n <NRLogo width={46} />\n </div>\n\n {/* Center: pill tab switcher */}\n {showFlowToggle ? (\n <div\n className=\"relative flex\"\n style={{\n border: '1.5px solid var(--t-tab-border)',\n borderRadius: 'var(--t-pill-radius)',\n padding: 4,\n gap: 4,\n }}\n >\n {/* Sliding indicator */}\n <div\n style={{\n position: 'absolute',\n top: 4,\n left: 4,\n width: 88,\n height: 32,\n borderRadius: 'var(--t-pill-radius)',\n background: 'var(--t-tab-active-bg)',\n transform: tab === 'buy' ? 'translateX(0)' : 'translateX(92px)',\n transition: 'transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n zIndex: 0,\n }}\n />\n <button\n onClick={() => onTabSwitch('buy')}\n className={`text-[13px] font-medium transition-colors duration-200 tab-pill${tab === 'buy' ? ' tab-pill-active' : ''}`}\n style={{\n position: 'relative',\n zIndex: 1,\n width: 88,\n height: 32,\n borderRadius: 'var(--t-pill-radius)',\n color: tab === 'buy' ? 'var(--t-tab-active-text)' : 'var(--t-tab-inactive-text)',\n }}\n >\n {t('header.buy')}\n </button>\n <button\n onClick={() => onTabSwitch('sell')}\n className={`text-[13px] font-medium transition-colors duration-200 tab-pill${tab === 'sell' ? ' tab-pill-active' : ''}`}\n style={{\n position: 'relative',\n zIndex: 1,\n width: 88,\n height: 32,\n borderRadius: 'var(--t-pill-radius)',\n color: tab === 'sell' ? 'var(--t-tab-active-text)' : 'var(--t-tab-inactive-text)',\n }}\n >\n {t('header.sell')}\n </button>\n </div>\n ) : (\n <div />\n )}\n\n {/* Right: menu dots */}\n <div style={{ width: 40, display: 'flex', alignItems: 'center', justifyContent: 'flex-end' }}>\n {showSettings ? (\n <MoreDotsIcon onClick={onOpenSettings} />\n ) : (\n <div style={{ width: 40 }} />\n )}\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { CryptoIcon, FiatFlag, ChevronDown } from '../ui/icons';\nimport { useT } from '../../i18n';\nimport type { FieldLocksConfig } from '@nowramp/sdk';\n\ntype MaybeFieldLocks = FieldLocksConfig | null | undefined;\n\nexport interface SpendCardProps {\n amount: string;\n onAmountChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n currencyCode: string;\n isBuy: boolean;\n onOpenModal: () => void;\n assetBaseUrl: string;\n error?: string;\n fieldLocks?: MaybeFieldLocks;\n onBlur: () => void;\n inputRef?: React.Ref<HTMLInputElement>;\n /** Chain code for sell mode crypto display */\n chainCode?: string;\n chainDisplay?: string;\n getChainIconUrl?: (chain: string, base: string) => string;\n shaking?: boolean;\n onFocus?: () => void;\n}\n\nexport function SpendCard({\n amount,\n onAmountChange,\n currencyCode,\n isBuy,\n onOpenModal,\n assetBaseUrl,\n error,\n fieldLocks,\n onBlur,\n inputRef,\n chainCode,\n chainDisplay,\n getChainIconUrl,\n shaking,\n onFocus,\n}: SpendCardProps) {\n const t = useT();\n return (\n <>\n <div\n className={`flex flex-col gap-[20px] p-4 card-hover${shaking ? ' error-shake' : ''}`}\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n ...(error ? { border: '1px solid var(--t-error)' } : {}),\n }}\n >\n <div className=\"text-[16px]\" style={{ color: 'var(--t-text-secondary)', lineHeight: '16px' }}>\n {t('spend.label')}\n </div>\n <div className=\"flex items-center justify-between\">\n <input\n ref={inputRef}\n type=\"text\"\n value={amount}\n onChange={onAmountChange}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={isBuy ? t('spend.placeholderFiat') : t('spend.placeholderCrypto')}\n className=\"bg-transparent outline-none w-0 flex-1 mr-3\"\n style={{\n color: 'var(--t-text)',\n fontSize: 24,\n fontWeight: 500,\n lineHeight: '32px',\n padding: 0,\n border: 'none',\n borderRadius: 0,\n backgroundColor: 'transparent',\n height: 'auto',\n width: 0,\n }}\n inputMode=\"decimal\"\n disabled={!!fieldLocks?.sourceAmount?.locked}\n />\n {isBuy ? (\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] shrink-0 transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.sourceCurrency?.locked}\n >\n <FiatFlag currencyCode={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n ) : (\n <div className=\"flex flex-col items-end shrink-0\">\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.destinationCurrency?.locked}\n >\n <CryptoIcon ticker={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n {chainCode && getChainIconUrl && (\n <div className=\"flex items-center gap-1 mt-1.5 mr-0.5\">\n <div className=\"rounded-full\" style={{ width: 14, height: 14, background: '#ffffff' }}>\n <img\n src={getChainIconUrl(chainCode, assetBaseUrl)}\n alt={chainCode}\n width={14}\n height={14}\n className=\"rounded-full\"\n style={{ width: 14, height: 14 }}\n />\n </div>\n <span className=\"text-[12px]\" style={{ color: 'var(--t-text-secondary)' }}>\n {chainDisplay}\n </span>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n {error && (\n <div className=\"text-[12px] mt-1.5 text-center\" style={{ color: 'var(--t-error)' }}>\n {error}\n </div>\n )}\n </>\n );\n}\n","import type React from 'react';\n\nexport function AnimatedDigit({ char, height = 38 }: { char: string; height?: number }) {\n const digits = '0123456789';\n const idx = digits.indexOf(char);\n if (idx === -1) return <span style={{ display: 'inline-block', textAlign: 'center' }}>{char}</span>;\n return (\n <span className=\"digit-slot\" style={{ height, lineHeight: `${height}px`, textAlign: 'center' }}>\n <span className=\"digit-slot-inner block\" style={{ transform: `translateY(-${idx * height}px)` }}>\n {digits.split('').map(d => (\n <span key={d} className=\"block\" style={{ height, lineHeight: `${height}px` }}>{d}</span>\n ))}\n </span>\n </span>\n );\n}\n\nexport function AnimatedNumber({\n value,\n height = 38,\n className = '',\n style = {},\n}: {\n value: string;\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}) {\n return (\n <span className={className} style={{ display: 'inline-flex', fontVariantNumeric: 'tabular-nums', ...style }}>\n {value.split('').map((ch, i) => (\n <AnimatedDigit key={i} char={ch} height={height} />\n ))}\n </span>\n );\n}\n","import { CryptoIcon, FiatFlag, ChevronDown, InfoIcon } from '../ui/icons';\nimport { useT } from '../../i18n';\nimport { AnimatedNumber } from '../ui/AnimatedNumber';\nimport { Spinner } from '../ui/Spinner';\nimport type { FieldLocksConfig } from '@nowramp/sdk';\n\ntype MaybeFieldLocks = FieldLocksConfig | null | undefined;\n\nexport interface ReceiveCardProps {\n amount: string;\n currencyCode: string;\n chainCode?: string;\n chainDisplay?: string;\n isBuy: boolean;\n onOpenModal: () => void;\n displayRate: string;\n assetBaseUrl: string;\n quotesLoading: boolean;\n onOpenRateBreakdown: () => void;\n fieldLocks?: MaybeFieldLocks;\n spendNumeric: number;\n getChainIconUrl?: (chain: string, base: string) => string;\n autoSelectPending?: boolean;\n rateFlash?: boolean;\n}\n\nexport function ReceiveCard({\n amount,\n currencyCode,\n chainCode,\n chainDisplay,\n isBuy,\n onOpenModal,\n displayRate,\n assetBaseUrl,\n quotesLoading,\n onOpenRateBreakdown,\n fieldLocks,\n spendNumeric,\n getChainIconUrl,\n autoSelectPending,\n rateFlash,\n}: ReceiveCardProps) {\n const t = useT();\n return (\n <div\n className=\"p-4 card-hover\"\n style={{\n borderRadius: 'var(--t-card-radius)',\n border: '1.5px solid var(--t-card-border)',\n background: 'transparent',\n }}\n >\n <div className=\"flex flex-col gap-[20px]\">\n <div className=\"text-[16px]\" style={{ color: 'var(--t-text-secondary)', lineHeight: '16px' }}>\n {t('receive.label')}\n </div>\n <div className=\"flex flex-col gap-[8px]\">\n <div className=\"flex items-start justify-between\">\n <div className={rateFlash ? 'rate-flash' : ''}>\n <AnimatedNumber\n value={spendNumeric > 0 ? amount : '0'}\n height={32}\n className=\"font-medium\"\n style={{\n color: spendNumeric > 0 ? 'var(--t-text)' : 'var(--t-text-muted)',\n fontSize: 24,\n }}\n />\n </div>\n {isBuy ? (\n <div className=\"flex flex-col items-end shrink-0\">\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.destinationCurrency?.locked}\n >\n <CryptoIcon ticker={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n </div>\n ) : (\n <button\n onClick={onOpenModal}\n className=\"flex items-center gap-[4px] shrink-0 transition-colors\"\n style={{\n background: 'var(--t-pill-solid-bg)',\n borderRadius: 'var(--t-pill-radius)',\n paddingLeft: 4,\n paddingRight: 8,\n paddingTop: 4,\n paddingBottom: 4,\n border: '1px solid var(--t-pill-solid-border)',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n }}\n disabled={!!fieldLocks?.sourceCurrency?.locked}\n >\n <FiatFlag currencyCode={currencyCode} size={24} baseUrl={assetBaseUrl} />\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '24px' }}>\n {currencyCode}\n </span>\n <ChevronDown />\n </button>\n )}\n </div>\n\n {/* Bottom row: rate + chain info */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-[4px]\">\n {quotesLoading && !autoSelectPending ? (\n <>\n <Spinner size={12} />\n <span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-text-muted)', letterSpacing: '0.22px', lineHeight: '12px' }}>\n {t('receive.fetchingRate')}\n </span>\n </>\n ) : (\n <>\n <span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-text-muted)', letterSpacing: '0.22px', lineHeight: '12px' }}>\n {displayRate || '\\u00A0'}\n </span>\n {displayRate && (\n <button\n onClick={onOpenRateBreakdown}\n className=\"flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity\"\n >\n <InfoIcon size={12} />\n </button>\n )}\n </>\n )}\n </div>\n {isBuy && chainCode && getChainIconUrl && (\n <div className=\"flex items-center gap-1\">\n <div className=\"rounded-full\" style={{ width: 12, height: 12, background: '#ffffff' }}>\n <img\n src={getChainIconUrl(chainCode, assetBaseUrl)}\n alt={chainCode}\n width={12}\n height={12}\n className=\"rounded-full\"\n style={{ width: 12, height: 12 }}\n />\n </div>\n <span className=\"text-[11px]\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.22px', lineHeight: '12px' }}>\n {chainDisplay}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { ChevronDown } from '../ui/icons';\nimport { useT } from '../../i18n';\n\nexport interface PaymentCardProps {\n selectedMethod?: { id: string; name: string; icon?: string };\n onOpenModal: () => void;\n darkMode: boolean;\n getMethodIcon: (id: string, icon: string | undefined, size: number) => React.ReactNode;\n getMethodDisplayName: (id: string, name: string) => string;\n}\n\nexport function PaymentCard({\n selectedMethod,\n onOpenModal,\n getMethodIcon,\n getMethodDisplayName,\n}: PaymentCardProps) {\n const t = useT();\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpenModal}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n className=\"flex items-center gap-[4px] p-4 transition-colors cursor-pointer card-press card-hover\"\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n }}\n >\n <span className=\"text-[13px] flex-1\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.13px', lineHeight: '20px' }}>\n {t('payment.label')}\n </span>\n <span className=\"flex items-center gap-[6px]\">\n {selectedMethod && (\n <>\n <span className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n {getMethodIcon(selectedMethod.id, selectedMethod.icon, 20)}\n </span>\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '16px' }}>\n {getMethodDisplayName(selectedMethod.id, selectedMethod.name)}\n </span>\n </>\n )}\n {!selectedMethod && (\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>{t('payment.select')}</span>\n )}\n <ChevronDown />\n </span>\n </div>\n );\n}\n","import { ChevronDown } from '../ui/icons';\nimport { useT } from '../../i18n';\nimport { getProviderIconUrl } from '../../data/cryptoData';\nimport type { Quote } from '@nowramp/sdk';\n\nexport interface ProviderCardProps {\n selectedQuote: Quote | null;\n quotesLoading: boolean;\n onOpenModal: () => void;\n assetBaseUrl?: string;\n}\n\nexport function ProviderCard({\n selectedQuote,\n quotesLoading,\n onOpenModal,\n assetBaseUrl = '',\n}: ProviderCardProps) {\n const t = useT();\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpenModal}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onOpenModal(); }}\n className=\"flex items-center gap-[4px] p-4 transition-colors cursor-pointer card-press card-hover\"\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n }}\n >\n <span className=\"text-[13px] flex-1\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.13px', lineHeight: '20px' }}>\n {t('provider.label')}\n </span>\n <span className=\"flex items-center gap-[6px]\">\n {quotesLoading && !selectedQuote && (\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>...</span>\n )}\n {!quotesLoading && !selectedQuote && (\n <span className=\"text-[13px]\" style={{ color: 'var(--t-text-muted)' }}>{t('provider.select')}</span>\n )}\n {selectedQuote && (\n <>\n <span className=\"flex items-center justify-center overflow-hidden rounded-full\" style={{ width: 20, height: 20 }}>\n <img\n src={getProviderIconUrl(selectedQuote.gatewayId, assetBaseUrl)}\n alt=\"\"\n width={20}\n height={20}\n className=\"rounded-full\"\n style={{ width: 20, height: 20, objectFit: 'cover' }}\n onError={(e) => {\n if (selectedQuote.gatewayLogo && (e.target as HTMLImageElement).src !== selectedQuote.gatewayLogo) {\n (e.target as HTMLImageElement).src = selectedQuote.gatewayLogo;\n }\n }}\n />\n </span>\n <span className=\"text-[14px] font-semibold\" style={{ color: 'var(--t-text)', letterSpacing: '0.14px', lineHeight: '16px' }}>\n {selectedQuote.gatewayName}\n </span>\n </>\n )}\n <ChevronDown />\n </span>\n </div>\n );\n}\n","/**\n * Choose Ramp (Provider) Modal\n * Displays REAL quotes from the aggregation engine in a ranked list.\n * Selected item gets an accent border outline, others get surface background.\n * Shows loading skeletons while quotes load, and an empty state if no quotes available.\n */\n\nimport { useState, useMemo } from 'react';\nimport { CloseButton } from '../ui/CloseButton';\nimport { SearchInput } from '../ui/SearchInput';\nimport { Skeleton } from '../ui/Skeleton';\nimport { useT } from '../../i18n';\nimport { getProviderIconUrl } from '../../data/cryptoData';\nimport type { Quote, QuotesResponse } from '@nowramp/sdk';\n\nexport interface ChooseRampModalProps {\n\tonClose: () => void;\n\tonSelect: (quote: Quote) => void;\n\t/** Real quotes from the aggregation engine */\n\tquotes: QuotesResponse | null;\n\t/** Whether quotes are still loading */\n\tquotesLoading: boolean;\n\t/** The selected crypto currency code (for display) */\n\tcryptoCurrency: string;\n\t/** Currently selected gateway ID (outline border) */\n\tselectedGatewayId?: string | null;\n\t/** Base URL for static assets */\n\tassetBaseUrl?: string;\n}\n\nfunction BestPriceIcon() {\n\treturn (\n\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n\t\t\t<path d=\"M8 1l2.12 4.3 4.74.69-3.43 3.34.81 4.72L8 11.77l-4.24 2.28.81-4.72L1.14 5.99l4.74-.69L8 1z\" fill=\"var(--t-success)\" />\n\t\t</svg>\n\t);\n}\n\nfunction RecommendedIcon() {\n\treturn (\n\t\t<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n\t\t\t<path d=\"M14 7.5a6 6 0 11-12 0 6 6 0 0112 0z\" stroke=\"var(--t-accent)\" strokeWidth=\"1.5\" />\n\t\t\t<path d=\"M5.5 8l2 2 3.5-4\" stroke=\"var(--t-accent)\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n\t\t</svg>\n\t);\n}\n\nfunction QuoteTag({ quote }: { quote: Quote }) {\n\tconst t = useT();\n\tif (quote.isBestRate) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t<BestPriceIcon />\n\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-success)' }}>\n\t\t\t\t\t{t('modal.bestPrice')}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.isRecommended) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t<RecommendedIcon />\n\t\t\t\t<span className=\"text-[11px] font-medium\" style={{ color: 'var(--t-accent)' }}>\n\t\t\t\t\t{t('modal.recommended')}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\tif (quote.rank && quote.rank <= 3) {\n\t\treturn (\n\t\t\t<div className=\"text-[11px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t#{quote.rank}\n\t\t\t</div>\n\t\t);\n\t}\n\treturn null;\n}\n\nfunction ProviderIcon({ gatewayId, gatewayLogo, assetBaseUrl = '' }: { gatewayId: string; gatewayLogo?: string; assetBaseUrl?: string }) {\n\tconst localSrc = getProviderIconUrl(gatewayId, assetBaseUrl);\n\treturn (\n\t\t<span className=\"rounded-full shrink-0 overflow-hidden inline-flex items-center justify-center\" style={{ width: 36, height: 36 }}>\n\t\t\t<img\n\t\t\t\tsrc={localSrc}\n\t\t\t\talt=\"\"\n\t\t\t\twidth={36}\n\t\t\t\theight={36}\n\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\tstyle={{ width: 36, height: 36, objectFit: 'cover' }}\n\t\t\t\tonError={(e) => {\n\t\t\t\t\tif (gatewayLogo && (e.target as HTMLImageElement).src !== gatewayLogo) {\n\t\t\t\t\t\t(e.target as HTMLImageElement).src = gatewayLogo;\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nfunction PercentageDiff({ pct }: { pct: number }) {\n\tif (pct === 0) return null;\n\tconst color = pct > 0 ? 'var(--t-success)' : 'var(--t-error)';\n\tconst sign = pct > 0 ? '+' : '';\n\treturn (\n\t\t<span className=\"text-[11px] font-medium\" style={{ color }}>\n\t\t\t{sign}{pct.toFixed(2)}%\n\t\t</span>\n\t);\n}\n\nfunction LoadingSkeletons() {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t{[0, 1, 2].map((i) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={i}\n\t\t\t\t\tclassName=\"w-full flex items-center gap-3.5 modal-item-in\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tborderRadius: 5,\n\t\t\t\t\t\theight: 64,\n\t\t\t\t\t\tpaddingLeft: 16,\n\t\t\t\t\t\tpaddingRight: 16,\n\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\tanimationDelay: `${i * 45}ms`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Skeleton w={36} h={36} className=\"rounded-full shrink-0\" />\n\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t<Skeleton w={90} h={14} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={60} h={12} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-right\">\n\t\t\t\t\t\t<Skeleton w={40} h={10} className=\"mb-1.5\" />\n\t\t\t\t\t\t<Skeleton w={80} h={14} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nexport function ChooseRampModal({\n\tonClose,\n\tonSelect,\n\tquotes,\n\tquotesLoading,\n\tcryptoCurrency,\n\tselectedGatewayId,\n\tassetBaseUrl = '',\n}: ChooseRampModalProps) {\n\tconst t = useT();\n\tconst [search, setSearch] = useState('');\n\n\tconst filteredQuotes = useMemo(() => {\n\t\tif (!quotes?.quotes) return [];\n\t\tconst raw = search.trim().toLowerCase();\n\t\tif (!raw) return quotes.quotes;\n\t\treturn quotes.quotes.filter((q) => q.gatewayName.toLowerCase().includes(raw));\n\t}, [quotes, search]);\n\n\t// Best crypto amount for percentage diff calculation\n\tconst bestCryptoAmount = filteredQuotes.length > 0 ? parseFloat(filteredQuotes[0].cryptoAmount) : 0;\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex justify-end px-5 pt-5\">\n\t\t\t\t<CloseButton onClick={onClose} />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"text-center text-[17px] font-medium mt-2 mb-6\"\n\t\t\t\tstyle={{ color: 'var(--t-text)', fontSize: 17, fontWeight: 500, marginTop: 8, marginBottom: 24 }}\n\t\t\t>\n\t\t\t\t{t('modal.chooseRamp')}\n\t\t\t</h2>\n\t\t\t<SearchInput value={search} onChange={setSearch} />\n\t\t\t<div className=\"flex-1 overflow-y-auto custom-scroll px-5 space-y-2\">\n\t\t\t\t{quotesLoading ? (\n\t\t\t\t\t<LoadingSkeletons />\n\t\t\t\t) : filteredQuotes.length === 0 ? (\n\t\t\t\t\t<div className=\"text-center py-10 text-[14px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t{quotes && quotes.quotes.length === 0\n\t\t\t\t\t\t\t? t('modal.noQuotes')\n\t\t\t\t\t\t\t: t('modal.noProvidersFound')}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\tfilteredQuotes.map((quote, i) => {\n\t\t\t\t\t\tconst isBest = i === 0;\n\t\t\t\t\t\tconst isSelected = selectedGatewayId === quote.gatewayId;\n\t\t\t\t\t\tconst receiveAmount = parseFloat(quote.cryptoAmount);\n\t\t\t\t\t\tconst displayAmount =\n\t\t\t\t\t\t\treceiveAmount >= 1 ? receiveAmount.toFixed(4) : receiveAmount.toPrecision(6);\n\n\t\t\t\t\t\t// Percentage difference from best quote\n\t\t\t\t\t\tconst pctDiff = !isBest && bestCryptoAmount > 0\n\t\t\t\t\t\t\t? ((receiveAmount - bestCryptoAmount) / bestCryptoAmount) * 100\n\t\t\t\t\t\t\t: 0;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={quote.gatewayId}\n\t\t\t\t\t\t\t\tonClick={() => onSelect(quote)}\n\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center gap-3 transition-colors card-press hover-item modal-item-in\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--t-card-radius)',\n\t\t\t\t\t\t\t\t\tpadding: '12px 16px',\n\t\t\t\t\t\t\t\t\tborder: isSelected ? '1.5px solid var(--t-accent)' : '1.5px solid transparent',\n\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\tanimationDelay: `${Math.min(i * 45, 350)}ms`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ProviderIcon gatewayId={quote.gatewayId} gatewayLogo={quote.gatewayLogo} assetBaseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[14px] leading-[18px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{quote.gatewayName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<QuoteTag quote={quote} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-right shrink-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"text-[11px] leading-[14px]\" style={{ color: 'var(--t-text-secondary)' }}>\n\t\t\t\t\t\t\t\t\t\t{isBest ? t('receive.label') : <PercentageDiff pct={pctDiff} />}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[13px] leading-[18px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] font-normal\" style={{ color: 'var(--t-text-secondary)' }}>{cryptoCurrency}</span>{' '}{displayAmount}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t)}\n\n\t\t\t\t{/* Unavailable gateways */}\n\t\t\t\t{!quotesLoading && quotes?.unavailableGateways && quotes.unavailableGateways.length > 0 && (\n\t\t\t\t\t<div className=\"pt-2 space-y-1.5\">\n\t\t\t\t\t\t{quotes.unavailableGateways.map((g, i) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={g.gatewayId}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-3 modal-item-in\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--t-card-radius)',\n\t\t\t\t\t\t\t\t\tpadding: '10px 16px',\n\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\topacity: 0.45,\n\t\t\t\t\t\t\t\t\tanimationDelay: `${Math.min((filteredQuotes.length + i) * 45, 500)}ms`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ProviderIcon gatewayId={g.gatewayId} assetBaseUrl={assetBaseUrl} />\n\t\t\t\t\t\t\t\t<div className=\"text-left flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-[14px] leading-[18px]\" style={{ color: 'var(--t-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{g.gatewayName}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-right shrink-0\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-[11px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t\t{g.reason}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useT } from '../../i18n';\nimport { Spinner } from '../ui/Spinner';\n\nexport interface WalletCardProps {\n address: string;\n onChange: (value: string) => void;\n placeholder: string;\n isBuy: boolean;\n error?: string;\n validating: boolean;\n disabled: boolean;\n onFocus: () => void;\n onBlur: () => void;\n focused?: boolean;\n}\n\nexport function WalletCard({\n address,\n onChange,\n placeholder,\n error,\n validating,\n disabled,\n onFocus,\n onBlur,\n focused,\n}: WalletCardProps) {\n const t = useT();\n const showInlineSpinner = validating && address.trim().length >= 10;\n const [shaking, setShaking] = useState(false);\n const prevErrorRef = useRef(error);\n\n useEffect(() => {\n if (error && !prevErrorRef.current) {\n setShaking(true);\n const timer = setTimeout(() => setShaking(false), 400);\n return () => clearTimeout(timer);\n }\n prevErrorRef.current = error;\n }, [error]);\n\n return (\n <div>\n <div\n className={`flex flex-col gap-[4px] p-4 card-hover${shaking ? ' error-shake' : ''}`}\n style={{\n background: 'var(--t-surface)',\n borderRadius: 'var(--t-card-radius)',\n }}\n >\n <div className=\"text-[13px]\" style={{ color: 'var(--t-text-secondary)', letterSpacing: '0.13px', lineHeight: '20px' }}>\n {t('wallet.label')}\n </div>\n <div className=\"relative flex items-center\">\n <input\n type=\"text\"\n value={address}\n onChange={(e) => onChange(e.target.value)}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n className=\"w-full bg-transparent text-[13px] outline-none\"\n style={{\n color: 'var(--t-text)',\n border: 'none',\n padding: 0,\n paddingRight: showInlineSpinner ? 24 : 0,\n fontSize: 13,\n lineHeight: '20px',\n letterSpacing: '0.13px',\n backgroundColor: 'transparent',\n }}\n disabled={disabled}\n />\n {/* Inline validation spinner */}\n {showInlineSpinner && (\n <div className=\"absolute right-0 top-0 bottom-0 flex items-center\">\n <Spinner size={14} />\n </div>\n )}\n {/* Cursor blink indicator for empty active state */}\n {!address && focused && !disabled && (\n <div\n className=\"absolute left-0 top-0 bottom-0 flex items-center\"\n style={{ pointerEvents: 'none' }}\n >\n <div\n style={{\n width: 1,\n height: 16,\n background: 'var(--t-text)',\n animation: 'fadeIn 0.5s ease-in-out infinite alternate',\n }}\n />\n </div>\n )}\n </div>\n </div>\n {error && (\n <div className=\"text-[12px] mt-1.5 text-center\" style={{ color: 'var(--t-error)' }}>\n {error}\n </div>\n )}\n </div>\n );\n}\n","export interface CtaButtonProps {\n label: string;\n disabled: boolean;\n loading: boolean;\n onClick: () => void;\n}\n\nexport function CtaButton({ label, disabled, loading, onClick }: CtaButtonProps) {\n return (\n <button\n disabled={disabled}\n onClick={onClick}\n className=\"w-full font-medium text-[18px] transition-all duration-150 cta-btn\"\n style={{\n padding: '12px 24px',\n lineHeight: '28px',\n borderRadius: 'var(--t-cta-radius)',\n background: 'var(--t-cta-bg)',\n color: 'var(--t-cta-text)',\n opacity: disabled ? 0.4 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n <span className=\"flex items-center justify-center gap-2\">\n {label}\n {loading && (\n <div style={{\n width: 18, height: 18,\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n animation: 'nramp-spin 0.8s linear infinite',\n opacity: 0.6,\n }} />\n )}\n </span>\n </button>\n );\n}\n","import { useT } from '../../i18n';\n\nexport function Footer() {\n const t = useT();\n return (\n <div className=\"text-center py-3\" style={{ height: 16, lineHeight: '16px' }}>\n <span style={{ fontSize: 9, opacity: 0.5, color: 'var(--t-text)', letterSpacing: '0.27px' }}>\n {t('footer.poweredBy')}\n </span>\n <span style={{ fontSize: 9, opacity: 0.65, color: 'var(--t-text)', letterSpacing: '0.27px' }}>\n {t('footer.brand')}\n </span>\n </div>\n );\n}\n","import type { Quote } from '@nowramp/sdk';\nimport { Spinner } from '../ui/Spinner';\nimport { InfoIcon, XIcon } from '../ui/icons';\nimport { useT } from '../../i18n';\n\nexport interface RateBreakdownProps {\n quote: Quote | null | undefined;\n isOpen: boolean;\n onClose: () => void;\n countdown: number;\n quotesLoading: boolean;\n}\n\nexport function RateBreakdown({\n quote,\n isOpen,\n onClose,\n countdown,\n quotesLoading,\n}: RateBreakdownProps) {\n const t = useT();\n\n if (!isOpen) return null;\n\n const pad = (n: number) => String(n).padStart(2, '0');\n\n const fiatSymbol = quote?.fiatCurrency === 'USD' ? '$'\n : quote?.fiatCurrency === 'EUR' ? '\\u20AC'\n : quote?.fiatCurrency === 'GBP' ? '\\u00A3'\n : quote?.fiatCurrency ? `${quote.fiatCurrency} ` : '$';\n\n const formatFiat = (value: string | number) => {\n const num = typeof value === 'string' ? parseFloat(value) : value;\n if (isNaN(num)) return `${fiatSymbol}0.00`;\n return `${fiatSymbol}${num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n };\n\n return (\n <div className=\"px-5 py-5\">\n {/* Header: countdown pill + info + X close */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n {quotesLoading ? (\n <Spinner size={16} />\n ) : (\n <>\n <span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n {t('rate.updatesInLabel')}\n </span>\n <span\n className=\"text-[12px] font-medium px-2 py-0.5 rounded-full\"\n style={{ color: 'var(--t-text)', border: '1px solid var(--t-border)' }}\n >\n 00:{pad(countdown)}\n </span>\n <div className=\"relative group\">\n <div\n className=\"flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-help\"\n aria-label={t('rate.rateTooltip')}\n >\n <InfoIcon size={12} />\n </div>\n <div\n className=\"info-tooltip pointer-events-none absolute left-1/2 z-50 w-[200px] px-3 py-2 rounded-xl text-[11px] leading-snug font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n style={{ background: 'var(--t-tooltip-bg)', color: 'var(--t-tooltip-text)', top: 'calc(100% + 8px)', transform: 'translateX(-50%)' }}\n >\n {t('rate.rateTooltip')}\n </div>\n </div>\n </>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"flex items-center justify-center rounded-full transition-opacity hover:opacity-70\"\n style={{ width: 28, height: 28, background: 'var(--t-surface)', color: 'var(--t-text)' }}\n >\n <XIcon size={10} />\n </button>\n </div>\n\n {!quote ? (\n <div className=\"text-[13px] py-4 text-center\" style={{ color: 'var(--t-text-muted)' }}>\n {t('rate.noQuote')}\n </div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {/* Large exchange rate value */}\n {quote.exchangeRate && (\n <div className=\"text-[28px] font-semibold\" style={{ color: 'var(--t-text)' }}>\n {formatFiat(quote.exchangeRate)}\n </div>\n )}\n\n {/* Processing fee — stacked label + value */}\n {quote.fees?.processingFee && (\n <div>\n <span className=\"text-[13px] block mb-0.5\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('rate.processingFee')}{quote.fees.feePercentage ? ` ${t('rate.feeIncluded', { percentage: Math.round(parseFloat(String(quote.fees.feePercentage)) * 100) / 100 })}` : ''}\n </span>\n <span className=\"text-[15px] font-semibold\" style={{ color: 'var(--t-text)' }}>\n {formatFiat(quote.fees.processingFee)}\n </span>\n </div>\n )}\n\n {/* Network fee — stacked label + value with crypto equivalent */}\n {quote.fees?.networkFee && (\n <div>\n <span className=\"flex items-center gap-1 text-[13px] mb-0.5\" style={{ color: 'var(--t-text-secondary)' }}>\n {t('rate.networkFeeIncl')}\n <div className=\"relative group\">\n <div\n className=\"flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-help\"\n aria-label={t('rate.networkFeeTooltip')}\n >\n <InfoIcon size={12} />\n </div>\n <div\n className=\"info-tooltip pointer-events-none absolute left-1/2 z-50 w-[220px] px-3 py-2 rounded-xl text-[11px] leading-snug font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n style={{ background: 'var(--t-tooltip-bg)', color: 'var(--t-tooltip-text)', bottom: 'calc(100% + 8px)', transform: 'translateX(-50%)' }}\n >\n {t('rate.networkFeeTooltip')}\n </div>\n </div>\n </span>\n <span className=\"text-[15px] font-semibold\" style={{ color: 'var(--t-text)' }}>\n {formatFiat(quote.fees.networkFee)}\n {quote.exchangeRate && (\n <span className=\"text-[13px] font-normal ml-1.5\" style={{ color: 'var(--t-text-muted)' }}>\n ({(parseFloat(quote.fees.networkFee) / parseFloat(quote.exchangeRate)).toFixed(8)} {quote.cryptoCurrency})\n </span>\n )}\n </span>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * RampForm\n * Main single-screen form with modal overlays (new NowRamp design).\n * Replaces the old multi-step wizard.\n */\n\nimport { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { RampProvider, useRamp, type RampProviderProps } from '../context/RampContext';\nimport { CheckoutStep } from './CheckoutStep';\nimport { ProcessingStep } from './ProcessingStep';\nimport { CompleteStep } from './CompleteStep';\nimport { ErrorStep } from './ErrorStep';\nimport { ConfirmStep } from './ConfirmStep';\nimport { Modal } from './ui/Modal';\nimport { FormSkeleton } from './ui/Skeleton';\nimport { Toast } from './ui/Toast';\nimport { LoadingScreen } from './form/LoadingScreen';\nimport { BottomSheet } from './ui/BottomSheet';\nimport { FiatCurrencyModal } from './modals/FiatCurrencyModal';\nimport { CryptoCurrencyModal } from './modals/CryptoCurrencyModal';\nimport { PaymentMethodModal } from './modals/PaymentMethodModal';\nimport { SettingsScreen } from './modals/SettingsScreen';\nimport { CountryPickerModal } from './modals/CountryPickerModal';\nimport { LanguagePickerModal } from './modals/LanguagePickerModal';\nimport { COUNTRY_MAP } from '../data/countries';\nimport {\n\tSKINS,\n\tparseAmount,\n\tformatOutput,\n\tisValidHex,\n\tisStablecoin,\n\tMIN_FIAT_AMOUNT,\n\tMIN_CRYPTO_AMOUNT,\n\tgetChainInfo,\n\tgetChainIconUrl,\n\ttype Skin,\n} from '../data/cryptoData';\nimport type { Transaction } from '@nowramp/sdk';\n\n// V2 sub-components\nimport { HeaderBar } from './form/HeaderBar';\nimport { SpendCard } from './form/SpendCard';\nimport { ReceiveCard } from './form/ReceiveCard';\nimport { PaymentCard } from './form/PaymentCard';\nimport { ProviderCard } from './form/ProviderCard';\nimport { ChooseRampModal } from './modals/ChooseRampModal';\nimport { WalletCard } from './form/WalletCard';\nimport { CtaButton } from './form/CtaButton';\nimport { Footer } from './form/Footer';\nimport { RateBreakdown } from './form/RateBreakdown';\nimport { getMethodIcon, getMethodDisplayName } from './PaymentMethodSelector';\nimport { useT, useI18n } from '../i18n';\nimport { I18nProvider, type LanguageCode } from '../i18n';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RampFormProps extends Omit<RampProviderProps, 'children'> {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\t/** Skin preset ID */\n\tskinId?: string;\n\t/** Custom accent color override (hex) */\n\taccentColor?: string;\n\t/** Custom background color override (hex) */\n\tbgColor?: string;\n\t/** Custom background image URL */\n\tbgImage?: string;\n\t/** Custom border color (hex) */\n\tborderColor?: string;\n\t/** Custom border radius (CSS value, e.g. '5px') */\n\tborderRadius?: string;\n\t// Extended theme color overrides\n\t/** Surface/card background color (hex) */\n\tsurfaceColor?: string;\n\t/** Input/pill background color (hex) */\n\tinputBgColor?: string;\n\t/** Primary text color (hex) */\n\ttextColor?: string;\n\t/** Secondary/label text color (hex) */\n\ttextSecondaryColor?: string;\n\t/** Muted text color (hex) */\n\ttextMutedColor?: string;\n\t/** Success/rate indicator color (hex) */\n\tsuccessColor?: string;\n\t/** Show Buy/Sell flow toggle (default: true). Set false to lock to the provided flowType. */\n\tshowFlowToggle?: boolean;\n\t/** Show settings menu icon (default: true). Set false to hide settings entirely. */\n\tshowSettings?: boolean;\n\t/** Show dark mode toggle in settings (default: true). Set false to hide theme switching. */\n\tshowThemeToggle?: boolean;\n\t/** Auto-redirect for redirect checkouts */\n\tautoRedirect?: boolean;\n\t/** Block explorer URL pattern */\n\texplorerUrl?: string;\n\t/** Done button text */\n\tdoneButtonText?: string;\n\t/** Support email */\n\tsupportEmail?: string;\n\t/** Show email field in wallet step */\n\tshowEmail?: boolean;\n\t/** Require email */\n\trequireEmail?: boolean;\n\t/** Show fee-free stablecoin amount (partner absorbs fees) */\n\tstablecoinParity?: boolean;\n\t/** Partner display name for parity info banner */\n\tpartnerName?: string;\n\t/** Explicit container height in px. When set, post-form screens use this as fixed height. Form itself is content-driven with no min-height. */\n\tcontainerHeight?: number;\n\t/** Callback when user clicks done */\n\tonDone?: () => void;\n\t/** Language code for translations (default: 'en') */\n\tlocale?: LanguageCode;\n\tonComplete?: (status: Transaction) => void;\n\tonError?: (error: Error) => void;\n}\n\n// =============================================================================\n// Inner Form\n// =============================================================================\n\ninterface InnerFormProps {\n\tclassName?: string;\n\ttheme?: 'light' | 'dark';\n\tskinId?: string;\n\taccentColor?: string;\n\tbgColor?: string;\n\tbgImage?: string;\n\tborderColor?: string;\n\tborderRadius?: string;\n\tsurfaceColor?: string;\n\tinputBgColor?: string;\n\ttextColor?: string;\n\ttextSecondaryColor?: string;\n\ttextMutedColor?: string;\n\tsuccessColor?: string;\n\tshowFlowToggle?: boolean;\n\tshowSettings?: boolean;\n\tshowThemeToggle?: boolean;\n\tautoRedirect?: boolean;\n\texplorerUrl?: string;\n\tdoneButtonText?: string;\n\tsupportEmail?: string;\n\tstablecoinParity?: boolean;\n\tpartnerName?: string;\n\tcontainerHeight?: number;\n\tlocale?: LanguageCode;\n\tonDone?: () => void;\n}\n\ntype ModalType = 'fiat' | 'crypto' | 'payment' | 'provider' | 'settings' | 'country' | 'language' | null;\n\nfunction InnerForm({\n\tclassName = '',\n\ttheme = 'dark',\n\tskinId: skinIdProp = 'mono',\n\taccentColor: accentColorProp,\n\tbgColor: bgColorProp,\n\tbgImage: bgImageProp,\n\tborderColor: borderColorProp,\n\tborderRadius: borderRadiusProp,\n\tsurfaceColor: surfaceColorProp,\n\tinputBgColor: inputBgColorProp,\n\ttextColor: textColorProp,\n\ttextSecondaryColor: textSecondaryColorProp,\n\ttextMutedColor: textMutedColorProp,\n\tsuccessColor: successColorProp,\n\tshowFlowToggle = true,\n\tshowSettings = true,\n\tshowThemeToggle = true,\n\tautoRedirect = false,\n\texplorerUrl,\n\tdoneButtonText,\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tcontainerHeight,\n\tlocale: _locale,\n\tonDone,\n}: InnerFormProps) {\n\tvoid _locale; // consumed by I18nProvider wrapper\n\tconst t = useT();\n\tconst {\n\t\tstate,\n\t\tdispatch,\n\t\tconfig,\n\t\tconfigLoading,\n\t\tquotes,\n\t\tquotesLoading,\n\t\tquotesError,\n\t\tfetchQuotes,\n\t\tcreateOrder,\n\t\torderLoading,\n\t\tamountError,\n\t\tfieldLocks,\n\t\tapiConfig,\n\t\tassetBaseUrl,\n\t\tavailableFiats,\n\t\tavailableCryptos,\n\t\tavailablePaymentMethods,\n\t\tselectionUnsupported,\n\t\tquotesEmpty,\n\t\tbestUnavailableReason,\n\t} = useRamp();\n\n\tconst { locale: currentLocale, setLocale } = useI18n();\n\n\t// Local UI state\n\tconst [darkMode, setDarkMode] = useState(theme === 'dark');\n\tconst [skinId, setSkinId] = useState(skinIdProp);\n\tconst [modal, setModal] = useState<ModalType>(null);\n\tconst [amountTouched, setAmountTouched] = useState(false);\n\tconst [walletTouched, setWalletTouched] = useState(false);\n\tconst [walletFocused, setWalletFocused] = useState(false);\n\tconst [walletValidating, setWalletValidating] = useState(false);\n\tconst [walletServerValid, setWalletServerValid] = useState<boolean | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst [switching, setSwitching] = useState(false);\n\tconst [autoSelectPending, setAutoSelectPending] = useState(false);\n\tconst [manualProvider, setManualProvider] = useState(false);\n\n\t// V2 state\n\tconst [toast, setToast] = useState<{ type: 'success' | 'error'; title: string; desc?: string } | null>(null);\n\tconst [rateBreakdownOpen, setRateBreakdownOpen] = useState(false);\n\tconst [rateCountdown, setRateCountdown] = useState(30);\n\tconst [rateFlash, setRateFlash] = useState(false);\n\tconst [amountShake, setAmountShake] = useState(false);\n\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst walletValidationTimer = useRef<ReturnType<typeof setTimeout>>();\n\tconst prevTabRef = useRef(state.flowType);\n\n\tconst postFormHeight = containerHeight ?? 640;\n\n\t// Reset manual provider override when new quotes arrive (inputs changed)\n\tconst prevQuotesRef = useRef(quotes);\n\tuseEffect(() => {\n\t\tif (quotes && quotes !== prevQuotesRef.current) {\n\t\t\tsetManualProvider(false);\n\t\t}\n\t\tprevQuotesRef.current = quotes;\n\t}, [quotes]);\n\n\t// Clear stale quote when new quotes start loading (inputs changed)\n\tuseEffect(() => {\n\t\tif (quotesLoading && !manualProvider) {\n\t\t\tdispatch({ type: 'CLEAR_QUOTE' });\n\t\t}\n\t}, [quotesLoading, manualProvider, dispatch]);\n\n\t// Auto-select best quote into state when quotes arrive (unless user manually picked a provider)\n\tuseEffect(() => {\n\t\tif (manualProvider || autoSelectPending) return;\n\t\tif (quotes?.bestQuote) {\n\t\t\tdispatch({ type: 'SELECT_QUOTE', quote: quotes.bestQuote });\n\t\t}\n\t}, [quotes?.bestQuote, manualProvider, autoSelectPending, dispatch]);\n\n\t// Sync darkMode with theme prop\n\tuseEffect(() => {\n\t\tsetDarkMode(theme === 'dark');\n\t}, [theme]);\n\n\t// Initial load animation\n\tuseEffect(() => {\n\t\tconst t = setTimeout(() => setLoading(false), configLoading ? 0 : 800);\n\t\treturn () => clearTimeout(t);\n\t}, [configLoading]);\n\n\t// Tab switching animation\n\tuseEffect(() => {\n\t\tif (prevTabRef.current !== state.flowType && !loading) {\n\t\t\tprevTabRef.current = state.flowType;\n\t\t\tsetSwitching(true);\n\t\t\tsetAmountTouched(false);\n\t\t\tsetWalletTouched(false);\n\t\t\tconst t = setTimeout(() => setSwitching(false), 350);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t\tprevTabRef.current = state.flowType;\n\t}, [state.flowType, loading]);\n\n\tconst tab = state.flowType;\n\tconst isBuy = tab === 'buy';\n\n\t// Compute display values from real quotes only\n\tconst cryptoCode = state.cryptoCurrency || 'BTC';\n\tconst fiatCode = state.fiatCurrency || 'USD';\n\tconst spendAmount = isBuy ? state.fiatAmount : state.cryptoAmount;\n\tconst spendNumeric = parseAmount(spendAmount);\n\n\tconst activeQuote = state.selectedQuote || quotes?.bestQuote || null;\n\n\tconst quoteRate = activeQuote?.exchangeRate\n\t\t? parseFloat(activeQuote.exchangeRate)\n\t\t: null;\n\n\t// Persist last known rate so it stays visible between quote fetches\n\tconst lastRateRef = useRef<{ rate: number; crypto: string; fiat: string } | null>(null);\n\tif (quoteRate && cryptoCode && fiatCode) {\n\t\tlastRateRef.current = { rate: quoteRate, crypto: cryptoCode, fiat: fiatCode };\n\t}\n\n\t// Clear stale rate when no providers can quote or amount is zero\n\tuseEffect(() => {\n\t\tif (quotesEmpty || quotesError) {\n\t\t\tlastRateRef.current = null;\n\t\t}\n\t}, [quotesEmpty, quotesError]);\n\n\t// Close rate breakdown and clear quote when spend amount becomes zero/empty\n\tuseEffect(() => {\n\t\tif (!spendNumeric) {\n\t\t\tsetRateBreakdownOpen(false);\n\t\t\tif (state.selectedQuote) {\n\t\t\t\tdispatch({ type: 'CLEAR_QUOTE' });\n\t\t\t}\n\t\t}\n\t}, [spendNumeric, state.selectedQuote, dispatch]);\n\n\tconst receiveAmount = useMemo(() => {\n\t\tif (activeQuote) {\n\t\t\tconst amt = isBuy ? activeQuote.cryptoAmount : activeQuote.fiatAmount;\n\t\t\tif (amt) return amt;\n\t\t}\n\t\treturn '0';\n\t}, [activeQuote, isBuy]);\n\n\t// Rate flash when receive amount changes\n\tconst prevReceiveRef = useRef(receiveAmount);\n\tuseEffect(() => {\n\t\tif (receiveAmount !== prevReceiveRef.current && receiveAmount !== '0' && prevReceiveRef.current !== '0') {\n\t\t\tsetRateFlash(true);\n\t\t\tconst t = setTimeout(() => setRateFlash(false), 500);\n\t\t\treturn () => clearTimeout(t);\n\t\t}\n\t\tprevReceiveRef.current = receiveAmount;\n\t}, [receiveAmount]);\n\n\t// Stablecoin parity: partner absorbs fees, credits user full amount\n\t// Same-peg (crypto code contains fiat code) → 1:1 fiat amount.\n\t// Cross-currency → FX-convert via quote rate.\n\tconst parityActive = !!(stablecoinParity && partnerName && isBuy && isStablecoin(cryptoCode) && quoteRate);\n\tconst isSamePeg = parityActive && cryptoCode.toUpperCase().includes(fiatCode.toUpperCase());\n\tconst parityAmount = parityActive && spendNumeric > 0\n\t\t? formatOutput(isSamePeg ? spendNumeric : spendNumeric / quoteRate)\n\t\t: null;\n\tconst displayReceiveAmount = parityActive && parityAmount ? parityAmount : receiveAmount;\n\n\tconst displayRate = useMemo(() => {\n\t\tconst r = quoteRate || lastRateRef.current?.rate;\n\t\tconst cc = quoteRate ? cryptoCode : lastRateRef.current?.crypto;\n\t\tconst fc = quoteRate ? fiatCode : lastRateRef.current?.fiat;\n\t\tif (!r || !cc || !fc) return '';\n\t\treturn `1 ${cc} ≈ ${r.toFixed(2)} ${fc}`;\n\t}, [cryptoCode, fiatCode, quoteRate]);\n\n\t// Server-side wallet address validation (debounced with AbortController)\n\tuseEffect(() => {\n\t\tconst addr = state.walletAddress.trim();\n\t\tconst network = state.network;\n\n\t\t// Reset when empty\n\t\tif (!addr || addr.length < 10) {\n\t\t\tsetWalletServerValid(null);\n\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\treturn;\n\t\t}\n\n\t\tsetWalletValidating(true);\n\t\tsetWalletServerValid(null);\n\n\t\tconst abortController = new AbortController();\n\n\t\tclearTimeout(walletValidationTimer.current);\n\t\twalletValidationTimer.current = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst res = await fetch(`${apiConfig.apiUrl}/public/validate/address`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ address: addr, ...(network ? { network } : {}) }),\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t});\n\t\t\t\tconst data = await res.json();\n\t\t\t\tconst result = data.data?.attributes || data.data || data;\n\t\t\t\tif (result.isValid) {\n\t\t\t\t\tsetWalletServerValid(true);\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: '' });\n\t\t\t\t} else {\n\t\t\t\t\tsetWalletServerValid(false);\n\t\t\t\t\tconst msg = result.errors?.[0] || result.details?.formatMessage || t('wallet.invalidServer');\n\t\t\t\t\tdispatch({ type: 'SET_WALLET_ERROR', message: msg });\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// Ignore aborted requests; network errors don't block the user\n\t\t\t\tif (err instanceof DOMException && err.name === 'AbortError') return;\n\t\t\t\tsetWalletServerValid(null);\n\t\t\t} finally {\n\t\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\t\tsetWalletValidating(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 500);\n\n\t\treturn () => {\n\t\t\tclearTimeout(walletValidationTimer.current);\n\t\t\tabortController.abort();\n\t\t};\n\t}, [state.walletAddress, state.network, apiConfig.apiUrl]);\n\n\t// Validation — use server-provided limits (amountError) as source of truth, fall back to hardcoded\n\tconst amountIsEmpty = !spendAmount || spendNumeric === 0;\n\tconst amountBelowMin = spendNumeric > 0 && (isBuy ? spendNumeric < MIN_FIAT_AMOUNT : spendNumeric < MIN_CRYPTO_AMOUNT);\n\tconst hasAmountError = !!amountError || amountBelowMin || (amountTouched && amountIsEmpty);\n\tconst isAmountValid = spendNumeric > 0 && !amountError && !amountBelowMin;\n\tconst isWalletValid = state.walletAddress.trim().length >= 10 && walletServerValid !== false && !walletValidating;\n\tconst isFormValid = isAmountValid && (isBuy ? isWalletValid : true) && !!state.cryptoCurrency && !!state.network;\n\n\tconst handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tlet raw = e.target.value.replace(/[^0-9.,]/g, '');\n\t\t// Limit decimal places: 2 for fiat, 6 for crypto\n\t\tconst maxDecimals = isBuy ? 2 : 6;\n\t\tconst dotIndex = raw.indexOf('.');\n\t\tif (dotIndex !== -1 && raw.length - dotIndex - 1 > maxDecimals) {\n\t\t\traw = raw.slice(0, dotIndex + maxDecimals + 1);\n\t\t}\n\t\tif (isBuy) {\n\t\t\tdispatch({ type: 'SET_FIAT_AMOUNT', amount: raw });\n\t\t} else {\n\t\t\tdispatch({ type: 'SET_CRYPTO_AMOUNT', amount: raw });\n\t\t}\n\t};\n\n\tconst handleTabSwitch = (newTab: 'buy' | 'sell') => {\n\t\tif (newTab === tab) return;\n\t\tdispatch({ type: 'SET_FLOW_TYPE', flowType: newTab, fieldLocks });\n\t};\n\n\tconst handleFiatSelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_FIAT_CURRENCY', currency: code });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCryptoSelect = useCallback(\n\t\t(code: string, chain: string) => {\n\t\t\tdispatch({ type: 'SET_CRYPTO_CURRENCY', currency: code });\n\t\t\tdispatch({ type: 'SET_CRYPTO_CHAIN', chain });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handlePaymentMethodSelect = useCallback(\n\t\t(methodId: string) => {\n\t\t\tdispatch({ type: 'SET_PAYMENT_METHOD', methodId });\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleCountrySelect = useCallback(\n\t\t(code: string) => {\n\t\t\tdispatch({ type: 'SET_COUNTRY', country: code });\n\t\t\tsetModal(null);\n\t\t},\n\t\t[dispatch]\n\t);\n\n\tconst handleLocationPress = useCallback(() => {\n\t\t// Close settings, then open country picker after animation completes\n\t\tsetModal(null);\n\t\tsetTimeout(() => setModal('country'), 280);\n\t}, []);\n\n\tconst handleLanguagePress = useCallback(() => {\n\t\t// Close settings, then open language picker after animation completes\n\t\tsetModal(null);\n\t\tsetTimeout(() => setModal('language'), 280);\n\t}, []);\n\n\tconst countryName = state.country ? COUNTRY_MAP[state.country.toLowerCase()]?.name : undefined;\n\n\tconst handleCtaClick = () => {\n\t\tif (!isFormValid) {\n\t\t\tif (hasAmountError || amountIsEmpty) {\n\t\t\t\tsetAmountTouched(true);\n\t\t\t\tsetAmountShake(true);\n\t\t\t\tsetTimeout(() => setAmountShake(false), 400);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t// If a provider quote is already selected, go straight to order creation\n\t\tif (state.selectedQuote) {\n\t\t\tcreateOrder().catch((err) => {\n\t\t\t\tsetToast({ type: 'error', title: t('toast.orderFailed'), desc: err instanceof Error ? err.message : t('toast.couldNotCreate') });\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsetAutoSelectPending(true);\n\t\tfetchQuotes();\n\t};\n\n\t// Auto-select best quote when quotes arrive after CTA click\n\tuseEffect(() => {\n\t\tif (!autoSelectPending || quotesLoading) return;\n\n\t\tif (quotes?.bestQuote) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tdispatch({ type: 'SELECT_QUOTE', quote: quotes.bestQuote });\n\t\t\tcreateOrder().catch((err) => {\n\t\t\t\tsetToast({ type: 'error', title: t('toast.orderFailed'), desc: err instanceof Error ? err.message : t('toast.couldNotCreate') });\n\t\t\t});\n\t\t} else if (quotesError) {\n\t\t\tsetAutoSelectPending(false);\n\t\t\tconst msg = quotesError.message || t('error.noProviders');\n\t\t\tdispatch({ type: 'SET_ERROR', message: msg });\n\t\t\tsetToast({ type: 'error', title: t('toast.quoteError'), desc: msg });\n\t\t} else if (quotes && !quotes.bestQuote) {\n\t\t\t// Quotes loaded successfully but no providers available\n\t\t\tsetAutoSelectPending(false);\n\t\t\tconst reasons = (quotes as any).unavailableGateways\n\t\t\t\t?.map((g: any) => g.reason)\n\t\t\t\t.filter(Boolean);\n\t\t\tconst message = reasons?.length\n\t\t\t\t? `${t('error.noProviders')}: ${reasons.join('; ')}`\n\t\t\t\t: t('error.noProviders');\n\t\t\tdispatch({ type: 'SET_ERROR', message });\n\t\t\tsetToast({ type: 'error', title: t('toast.noProviders'), desc: message });\n\t\t}\n\t}, [autoSelectPending, quotes, quotesLoading, quotesError, dispatch, createOrder]);\n\n\t// ─── Toast on step transitions ───\n\tconst prevStepRef = useRef(state.step);\n\tuseEffect(() => {\n\t\tconst prev = prevStepRef.current;\n\t\tprevStepRef.current = state.step;\n\t\tif (prev === state.step) return;\n\t\tif (state.step === 'checkout') {\n\t\t\tsetToast({ type: 'success', title: t('toast.orderCreated'), desc: t('toast.redirecting') });\n\t\t} else if (state.step === 'error' && state.errorMessage) {\n\t\t\tsetToast({ type: 'error', title: t('toast.somethingWrong'), desc: state.errorMessage });\n\t\t}\n\t}, [state.step, state.errorMessage]);\n\n\t// ─── Rate countdown orchestration ───\n\tconst isFormStep = state.step === 'amount';\n\n\t// Force-close sheet on step change\n\tuseEffect(() => {\n\t\tif (!isFormStep) setRateBreakdownOpen(false);\n\t}, [isFormStep]);\n\n\t// Timer lives in InnerForm — RateBreakdown is pure presentational\n\tuseEffect(() => {\n\t\tif (!rateBreakdownOpen || !isFormStep) return;\n\t\tsetRateCountdown(30);\n\t\tconst id = setInterval(() => {\n\t\t\tsetRateCountdown(prev => {\n\t\t\t\tif (prev <= 1) { fetchQuotes(); return 30; }\n\t\t\t\treturn prev - 1;\n\t\t\t});\n\t\t}, 1000);\n\t\treturn () => clearInterval(id);\n\t}, [rateBreakdownOpen, isFormStep, fetchQuotes]);\n\n\t// Reset countdown when fresh quotes arrive\n\tuseEffect(() => {\n\t\tif (rateBreakdownOpen && isFormStep && !quotesLoading) setRateCountdown(30);\n\t}, [quotesLoading, rateBreakdownOpen, isFormStep]);\n\n\t// Theme computation\n\tconst themeClass = darkMode ? 'theme-dark' : 'theme-light';\n\tconst activeSkin = SKINS.find((s: Skin) => s.id === skinId) || SKINS[0];\n\tconst isMono = activeSkin.accent === null;\n\n\tconst hasCustomAccent = accentColorProp ? isValidHex(accentColorProp) : false;\n\n\t// Auto-detect best text color for CTA based on accent luminance\n\tconst getCtaTextColor = (hex: string): string => {\n\t\tconst c = hex.replace('#', '');\n\t\tconst r = parseInt(c.substring(0, 2), 16);\n\t\tconst g = parseInt(c.substring(2, 4), 16);\n\t\tconst b = parseInt(c.substring(4, 6), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#000000' : '#ffffff';\n\t};\n\n\tconst accentStyle: Record<string, string> = hasCustomAccent\n\t\t? { '--t-accent': accentColorProp!, '--t-cta-bg': accentColorProp!, '--t-cta-text': getCtaTextColor(accentColorProp!) }\n\t\t: isMono\n\t\t\t? {\n\t\t\t\t\t'--t-accent': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-bg': darkMode ? '#ffffff' : '#111111',\n\t\t\t\t\t'--t-cta-text': darkMode ? '#000000' : '#ffffff',\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t'--t-accent': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-bg': activeSkin.accent!,\n\t\t\t\t\t'--t-cta-text': getCtaTextColor(activeSkin.accent!),\n\t\t\t\t};\n\n\t// Extended theme overrides\n\tconst themeOverrides: Record<string, string> = {};\n\tif (surfaceColorProp && isValidHex(surfaceColorProp)) {\n\t\tthemeOverrides['--t-surface'] = surfaceColorProp;\n\t\tthemeOverrides['--t-modal-bg'] = surfaceColorProp;\n\t}\n\tif (inputBgColorProp && isValidHex(inputBgColorProp)) {\n\t\tthemeOverrides['--t-pill-bg'] = inputBgColorProp;\n\t\tthemeOverrides['--t-close-bg'] = inputBgColorProp;\n\t}\n\tif (textColorProp && isValidHex(textColorProp)) {\n\t\tthemeOverrides['--t-text'] = textColorProp;\n\t}\n\tif (textSecondaryColorProp && isValidHex(textSecondaryColorProp)) {\n\t\tthemeOverrides['--t-text-secondary'] = textSecondaryColorProp;\n\t}\n\tif (textMutedColorProp && isValidHex(textMutedColorProp)) {\n\t\tthemeOverrides['--t-text-muted'] = textMutedColorProp;\n\t\tthemeOverrides['--t-text-tertiary'] = textMutedColorProp;\n\t}\n\tif (successColorProp && isValidHex(successColorProp)) {\n\t\tthemeOverrides['--t-success'] = successColorProp;\n\t}\n\n\tconst backgroundStyle: Record<string, string> = {};\n\tif (bgColorProp && isValidHex(bgColorProp)) {\n\t\tbackgroundStyle.backgroundColor = bgColorProp;\n\t} else {\n\t\tbackgroundStyle.backgroundColor = 'var(--t-bg)';\n\t}\n\tif (bgImageProp && (bgImageProp.startsWith('https://') || bgImageProp.startsWith('data:image/'))) {\n\t\tbackgroundStyle.backgroundImage = `url(${bgImageProp})`;\n\t\tbackgroundStyle.backgroundSize = 'cover';\n\t\tbackgroundStyle.backgroundPosition = 'center';\n\t}\n\n\tconst borderStyle: Record<string, string> = {};\n\tif (borderColorProp && isValidHex(borderColorProp)) {\n\t\tborderStyle.border = `1px solid ${borderColorProp}`;\n\t}\n\tif (borderRadiusProp) {\n\t\tborderStyle.borderRadius = borderRadiusProp;\n\t}\n\n\t// Chain info for display\n\tconst chainCode = state.network;\n\tconst chainInfo = chainCode ? getChainInfo(chainCode) : null;\n\tconst chainDisplay = chainInfo?.shortName || chainInfo?.name || chainCode;\n\n\t// Amount error message — API errors show immediately, local validation waits for blur\n\tconst amountErrorMessage = amountError\n\t\t? amountError\n\t\t: (amountTouched && (amountBelowMin || amountIsEmpty))\n\t\t\t? (amountIsEmpty\n\t\t\t\t? t('error.amountZero')\n\t\t\t\t: isBuy\n\t\t\t\t\t? t('error.minAmountFiat', { min: String(MIN_FIAT_AMOUNT), currency: fiatCode })\n\t\t\t\t\t: t('error.minAmountCrypto', { min: String(MIN_CRYPTO_AMOUNT), currency: cryptoCode }))\n\t\t\t: undefined;\n\n\t// Wallet error message\n\tconst walletErrorMessage = state.walletError\n\t\t? state.walletError\n\t\t: (walletTouched && !isWalletValid && !walletValidating)\n\t\t\t? t('wallet.invalid')\n\t\t\t: undefined;\n\n\t// Selected payment method\n\tconst filteredPaymentMethods = availablePaymentMethods.filter(m => m.supportedFiats.includes(state.fiatCurrency));\n\tconst selectedPaymentMethod = filteredPaymentMethods.find(m => m.id === state.paymentMethodId) || filteredPaymentMethods[0];\n\n\t// If we're in a post-form step, render inside the same themed container\n\tconst postFormStep =\n\t\tstate.step === 'checkout' ? <CheckoutStep autoRedirect={autoRedirect} /> :\n\t\tstate.step === 'processing' ? <ProcessingStep /> :\n\t\tstate.step === 'complete' ? <CompleteStep explorerUrl={explorerUrl} doneButtonText={doneButtonText} onDone={onDone} /> :\n\t\tstate.step === 'error' ? <ErrorStep supportEmail={supportEmail} onDone={onDone} doneButtonText={doneButtonText} /> :\n\t\tstate.step === 'confirm' ? <ConfirmStep stablecoinParity={parityActive} partnerName={partnerName} /> :\n\t\tnull;\n\n\tif (postFormStep) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] overflow-hidden flex flex-col select-none transition-colors duration-[400ms] ${className}`}\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\t\theight: postFormHeight,\n\t\t\t\t\tborderRadius: 'var(--t-container-radius)',\n\t\t\t\t\t...backgroundStyle,\n\t\t\t\t\t...accentStyle,\n\t\t\t\t\t...themeOverrides,\n\t\t\t\t\t...borderStyle,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{postFormStep}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${themeClass} relative w-full max-w-[390px] overflow-hidden flex flex-col select-none transition-colors duration-[400ms] ${className}`}\n\t\t\tstyle={{\n\t\t\t\tfontFamily: \"'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n\t\t\t\tminHeight: 640,\n\t\t\t\tborderRadius: 'var(--t-container-radius)',\n\t\t\t\t...backgroundStyle,\n\t\t\t\t...accentStyle,\n\t\t\t\t...themeOverrides,\n\t\t\t\t...borderStyle,\n\t\t\t}}\n\t\t>\n\t\t\t{/* V2 Header */}\n\t\t\t<HeaderBar\n\t\t\t\ttab={tab}\n\t\t\t\tonTabSwitch={handleTabSwitch}\n\t\t\t\tshowFlowToggle={showFlowToggle}\n\t\t\t\tshowSettings={showSettings}\n\t\t\t\tonOpenSettings={() => setModal('settings')}\n\t\t\t\tdarkMode={darkMode}\n\t\t\t/>\n\n\t\t\t{/* Form body */}\n\t\t\t{loading || switching || configLoading ? (\n\t\t\t\t<div className=\"pt-[88px] px-3 flex-1 flex flex-col\">\n\t\t\t\t\t{configLoading ? <FormSkeleton /> : <LoadingScreen />}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div key={tab} className=\"flex-1 overflow-hidden pt-[88px] px-3 flex flex-col gap-1 tab-fade-in\">\n\t\t\t\t\t<SpendCard\n\t\t\t\t\t\tamount={spendAmount}\n\t\t\t\t\t\tonAmountChange={handleAmountChange}\n\t\t\t\t\t\tcurrencyCode={isBuy ? fiatCode : cryptoCode}\n\t\t\t\t\t\tisBuy={isBuy}\n\t\t\t\t\t\tonOpenModal={() => setModal(isBuy ? 'fiat' : 'crypto')}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\terror={amountErrorMessage}\n\t\t\t\t\t\tfieldLocks={fieldLocks}\n\t\t\t\t\t\tonBlur={() => setAmountTouched(true)}\n\t\t\t\t\t\tinputRef={inputRef}\n\t\t\t\t\t\tchainCode={!isBuy ? chainCode : undefined}\n\t\t\t\t\t\tchainDisplay={!isBuy ? chainDisplay : undefined}\n\t\t\t\t\t\tgetChainIconUrl={!isBuy ? getChainIconUrl : undefined}\n\t\t\t\t\t\tshaking={amountShake}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<ReceiveCard\n\t\t\t\t\t\tamount={displayReceiveAmount}\n\t\t\t\t\t\tcurrencyCode={isBuy ? cryptoCode : fiatCode}\n\t\t\t\t\t\tchainCode={isBuy ? chainCode : undefined}\n\t\t\t\t\t\tchainDisplay={isBuy ? chainDisplay : undefined}\n\t\t\t\t\t\tisBuy={isBuy}\n\t\t\t\t\t\tonOpenModal={() => setModal(isBuy ? 'crypto' : 'fiat')}\n\t\t\t\t\t\tdisplayRate={displayRate}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t\t\tonOpenRateBreakdown={() => { if (spendNumeric > 0) setRateBreakdownOpen(true); }}\n\t\t\t\t\t\tfieldLocks={fieldLocks}\n\t\t\t\t\t\tspendNumeric={spendNumeric}\n\t\t\t\t\t\tgetChainIconUrl={isBuy ? getChainIconUrl : undefined}\n\t\t\t\t\t\tautoSelectPending={autoSelectPending}\n\t\t\t\t\t\trateFlash={rateFlash}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* No-quote inline warning */}\n\t\t\t\t\t{quotesEmpty && spendNumeric > 0 && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"px-4 py-2.5 mt-1\"\n\t\t\t\t\t\t\tstyle={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius)', fontSize: 12, color: 'var(--t-error)', lineHeight: '16px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{bestUnavailableReason || t('error.noProviders')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Parity info banner */}\n\t\t\t\t\t{parityActive && spendNumeric > 0 && quotes?.bestQuote && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-start gap-2 mt-1 px-4 py-2.5\"\n\t\t\t\t\t\t\tstyle={{ background: 'var(--t-surface)', borderRadius: 'var(--t-card-radius)', fontSize: 12, color: 'var(--t-text-secondary)', lineHeight: '16px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0, marginTop: 1 }}>\n\t\t\t\t\t\t\t\t<circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n\t\t\t\t\t\t\t\t<path d=\"M8 7v4M8 5.5v-.01\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{t('parity.info', { receiveAmount, crypto: cryptoCode, spendAmount: formatOutput(spendNumeric), fiat: fiatCode, partner: partnerName || '' })}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Provider selector */}\n\t\t\t\t\t{(quotes || quotesLoading) && (\n\t\t\t\t\t\t<ProviderCard\n\t\t\t\t\t\t\tselectedQuote={state.selectedQuote}\n\t\t\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t\t\t\tonOpenModal={() => setModal('provider')}\n\t\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Payment method */}\n\t\t\t\t\t{(availablePaymentMethods.length > 0 || (config?.paymentMethods && config.paymentMethods.length > 0)) && (\n\t\t\t\t\t\tfilteredPaymentMethods.length > 0 ? (\n\t\t\t\t\t\t\t<PaymentCard\n\t\t\t\t\t\t\t\tselectedMethod={selectedPaymentMethod}\n\t\t\t\t\t\t\t\tonOpenModal={() => setModal('payment')}\n\t\t\t\t\t\t\t\tdarkMode={darkMode}\n\t\t\t\t\t\t\t\tgetMethodIcon={getMethodIcon}\n\t\t\t\t\t\t\t\tgetMethodDisplayName={(id, name) => getMethodDisplayName(id, name, t, true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center px-4 mt-1\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackground: 'var(--t-surface)',\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--t-card-radius)',\n\t\t\t\t\t\t\t\t\theight: 56,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"text-[12px]\" style={{ color: 'var(--t-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t{t('payment.noneAvailable')}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Wallet address — only for buy (offramp collects via provider checkout) */}\n\t\t\t\t\t{isBuy && (\n\t\t\t\t\t\t<WalletCard\n\t\t\t\t\t\t\taddress={state.walletAddress}\n\t\t\t\t\t\t\tonChange={(v) => dispatch({ type: 'SET_WALLET_ADDRESS', address: v })}\n\t\t\t\t\t\t\tplaceholder={t('wallet.placeholderBuy')}\n\t\t\t\t\t\t\tisBuy={isBuy}\n\t\t\t\t\t\t\terror={walletErrorMessage}\n\t\t\t\t\t\t\tvalidating={walletValidating}\n\t\t\t\t\t\t\tdisabled={!!fieldLocks?.destinationAddress?.locked}\n\t\t\t\t\t\t\tonFocus={() => setWalletFocused(true)}\n\t\t\t\t\t\t\tonBlur={() => { setWalletFocused(false); setWalletTouched(true); }}\n\t\t\t\t\t\t\tfocused={walletFocused}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"flex-1\" style={{ minHeight: 16 }} />\n\n\t\t\t\t\t{/* Unsupported selection message */}\n\t\t\t\t\t{selectionUnsupported && (\n\t\t\t\t\t\t<div className=\"text-[12px] text-center mb-2\" style={{ color: 'var(--t-error)' }}>\n\t\t\t\t\t\t\t{isBuy ? t('error.currencyUnavailableBuy') : t('error.currencyUnavailableSell')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* CTA + Footer */}\n\t\t\t\t\t<div className=\"flex flex-col gap-3 pb-3\">\n\t\t\t\t\t\t<CtaButton\n\t\t\t\t\t\t\tlabel={isBuy\n\t\t\t\t\t\t\t\t? t('cta.buy', { crypto: cryptoCode })\n\t\t\t\t\t\t\t\t: t('cta.sell', { crypto: cryptoCode })}\n\t\t\t\t\t\t\tdisabled={!isFormValid || orderLoading || autoSelectPending || selectionUnsupported || quotesEmpty}\n\t\t\t\t\t\t\tloading={orderLoading || autoSelectPending}\n\t\t\t\t\t\t\tonClick={handleCtaClick}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Footer />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Toast */}\n\t\t\t{toast && (\n\t\t\t\t<Toast\n\t\t\t\t\ttype={toast.type}\n\t\t\t\t\ttitle={toast.title}\n\t\t\t\t\tdescription={toast.desc}\n\t\t\t\t\tvisible={!!toast}\n\t\t\t\t\tonDismiss={() => setToast(null)}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/* Rate breakdown bottom sheet */}\n\t\t\t<BottomSheet isOpen={rateBreakdownOpen} onClose={() => setRateBreakdownOpen(false)}>\n\t\t\t\t<RateBreakdown\n\t\t\t\t\tquote={activeQuote}\n\t\t\t\t\tisOpen={rateBreakdownOpen}\n\t\t\t\t\tonClose={() => setRateBreakdownOpen(false)}\n\t\t\t\t\tcountdown={rateCountdown}\n\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t/>\n\t\t\t</BottomSheet>\n\n\t\t\t{/* Modal overlays */}\n\t\t\t<Modal isOpen={modal === 'fiat'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<FiatCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(v) => {\n\t\t\t\t\t\t\thandleFiatSelect(v);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcurrencies={availableFiats.map((f) => ({ code: f.code, name: f.code }))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.fiatCurrency}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'crypto'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CryptoCurrencyModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code, chain) => {\n\t\t\t\t\t\t\thandleCryptoSelect(code, chain);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tcryptos={availableCryptos.map((c) => ({\n\t\t\t\t\t\t\tcode: c.code,\n\t\t\t\t\t\t\tname: c.code,\n\t\t\t\t\t\t\tnetworks: c.networks?.map((n) => ({ code: n.id, name: n.name })),\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.cryptoCurrency}\n\t\t\t\t\t\tselectedChain={state.network}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'payment'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<PaymentMethodModal\n\t\t\t\t\t\tmethods={availablePaymentMethods}\n\t\t\t\t\t\tselectedId={state.paymentMethodId}\n\t\t\t\t\t\tonSelect={(id) => {\n\t\t\t\t\t\t\thandlePaymentMethodSelect(id);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'provider'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<ChooseRampModal\n\t\t\t\t\t\tquotes={quotes}\n\t\t\t\t\t\tquotesLoading={quotesLoading}\n\t\t\t\t\t\tcryptoCurrency={cryptoCode}\n\t\t\t\t\t\tselectedGatewayId={state.selectedProvider}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tonSelect={(quote) => {\n\t\t\t\t\t\t\tsetManualProvider(true);\n\t\t\t\t\t\t\tdispatch({ type: 'SELECT_QUOTE', quote });\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'settings'} onClose={() => setModal(null)} variant=\"right\">\n\t\t\t\t{(close) => (\n\t\t\t\t\t<SettingsScreen\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tdarkMode={darkMode}\n\t\t\t\t\t\tonToggleDarkMode={setDarkMode}\n\t\t\t\t\t\tskinId={skinId}\n\t\t\t\t\t\tonSelectSkin={(id) => {\n\t\t\t\t\t\t\tsetSkinId(id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\t\t\tcountry={state.country}\n\t\t\t\t\t\tcountryName={countryName}\n\t\t\t\t\t\tonLocationPress={handleLocationPress}\n\t\t\t\t\t\tonLanguagePress={handleLanguagePress}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'country'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<CountryPickerModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code) => {\n\t\t\t\t\t\t\thandleCountrySelect(code);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\t\t\t\tselectedCode={state.country}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t\t<Modal isOpen={modal === 'language'} onClose={() => setModal(null)}>\n\t\t\t\t{(close) => (\n\t\t\t\t\t<LanguagePickerModal\n\t\t\t\t\t\tonClose={close}\n\t\t\t\t\t\tonSelect={(code) => {\n\t\t\t\t\t\t\tsetLocale(code);\n\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tselectedCode={currentLocale}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Modal>\n\t\t</div>\n\t);\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport function RampForm({\n\tprojectId,\n\tapiUrl,\n\tassetBaseUrl,\n\tflowType,\n\tcustomerId,\n\tbrandId,\n\tdefaultFiatCurrency,\n\tdefaultCryptoCurrency,\n\tdefaultNetwork,\n\tdefaultFiatAmount,\n\tdefaultCryptoAmount,\n\tdefaultWalletAddress,\n\tdefaultGateway,\n\tdefaultCountry,\n\tfieldLocks,\n\tpartnerMetadata,\n\tstatusPollInterval,\n\tonComplete,\n\tonError,\n\tclassName,\n\ttheme,\n\tskinId,\n\taccentColor,\n\tbgColor,\n\tbgImage,\n\tborderColor,\n\tborderRadius,\n\tsurfaceColor,\n\tinputBgColor,\n\ttextColor,\n\ttextSecondaryColor,\n\ttextMutedColor,\n\tsuccessColor,\n\tshowFlowToggle,\n\tshowSettings,\n\tshowThemeToggle,\n\tautoRedirect,\n\texplorerUrl,\n\tdoneButtonText,\n\tsupportEmail,\n\tstablecoinParity,\n\tpartnerName,\n\tcontainerHeight,\n\tlocale,\n\tonDone,\n}: RampFormProps) {\n\treturn (\n\t\t<RampProvider\n\t\t\tprojectId={projectId}\n\t\t\tapiUrl={apiUrl}\n\t\t\tassetBaseUrl={assetBaseUrl}\n\t\t\tflowType={flowType}\n\t\t\tcustomerId={customerId}\n\t\t\tbrandId={brandId}\n\t\t\tdefaultFiatCurrency={defaultFiatCurrency}\n\t\t\tdefaultCryptoCurrency={defaultCryptoCurrency}\n\t\t\tdefaultNetwork={defaultNetwork}\n\t\t\tdefaultFiatAmount={defaultFiatAmount}\n\t\t\tdefaultCryptoAmount={defaultCryptoAmount}\n\t\t\tdefaultWalletAddress={defaultWalletAddress}\n\t\t\tdefaultGateway={defaultGateway}\n\t\t\tdefaultCountry={defaultCountry}\n\t\t\tfieldLocks={fieldLocks}\n\t\t\tpartnerMetadata={partnerMetadata}\n\t\t\tstatusPollInterval={statusPollInterval}\n\t\t\tonComplete={onComplete}\n\t\t\tonError={onError}\n\t\t>\n\t\t\t<I18nProvider defaultLocale={locale || 'en'}>\n\t\t\t\t<InnerForm\n\t\t\t\t\tclassName={className}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t\tskinId={skinId}\n\t\t\t\t\taccentColor={accentColor}\n\t\t\t\t\tbgColor={bgColor}\n\t\t\t\t\tbgImage={bgImage}\n\t\t\t\t\tborderColor={borderColor}\n\t\t\t\t\tborderRadius={borderRadius}\n\t\t\t\t\tsurfaceColor={surfaceColor}\n\t\t\t\t\tinputBgColor={inputBgColor}\n\t\t\t\t\ttextColor={textColor}\n\t\t\t\t\ttextSecondaryColor={textSecondaryColor}\n\t\t\t\t\ttextMutedColor={textMutedColor}\n\t\t\t\t\tsuccessColor={successColor}\n\t\t\t\t\tshowFlowToggle={showFlowToggle}\n\t\t\t\t\tshowSettings={showSettings}\n\t\t\t\t\tshowThemeToggle={showThemeToggle}\n\t\t\t\t\tautoRedirect={autoRedirect}\n\t\t\t\t\texplorerUrl={explorerUrl}\n\t\t\t\t\tdoneButtonText={doneButtonText}\n\t\t\t\t\tsupportEmail={supportEmail}\n\t\t\t\t\tstablecoinParity={stablecoinParity}\n\t\t\t\t\tpartnerName={partnerName}\n\t\t\t\t\tcontainerHeight={containerHeight}\n\t\t\t\t\tonDone={onDone}\n\t\t\t\t/>\n\t\t\t</I18nProvider>\n\t\t</RampProvider>\n\t);\n}\n","/**\n * CheckoutForm Component\n * Single-page checkout form using the same NowRamp design as RampForm.\n * This is the hosted-checkout variant — both components now produce the\n * same visual since the new design is inherently single-page.\n */\n\nimport { RampForm, type RampFormProps } from './RampForm';\n\nexport interface CheckoutFormProps extends RampFormProps {\n /** Submit button text (legacy — maps to nothing in new design, kept for API compat) */\n submitButtonText?: string;\n /** Rate refresh interval in ms (legacy, kept for API compat) */\n rateRefreshInterval?: number;\n}\n\n/**\n * Hosted checkout form.\n * Now uses the same NowRamp design as RampForm.\n */\nexport function CheckoutForm({\n submitButtonText: _submitButtonText,\n rateRefreshInterval: _rateRefreshInterval,\n ...props\n}: CheckoutFormProps) {\n return <RampForm {...props} />;\n}\n","export interface Skin {\n id: string;\n name: string;\n accent: string | null;\n}\n\nexport function SkinSwatch({\n skin,\n active,\n onClick,\n darkMode,\n dimmed,\n}: {\n skin: Skin;\n active: boolean;\n onClick: () => void;\n darkMode: boolean;\n dimmed: boolean;\n}) {\n const isMono = skin.accent === null;\n const size = 32;\n return (\n <button\n onClick={onClick}\n className=\"relative shrink-0\"\n style={{ width: size, height: size, opacity: dimmed ? 0.4 : 1, transition: 'opacity 0.2s' }}\n >\n {isMono ? (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <clipPath id=\"mono-left\"><rect x=\"0\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <clipPath id=\"mono-right\"><rect x=\"16\" y=\"0\" width=\"16\" height=\"32\" /></clipPath>\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#111111\" clipPath=\"url(#mono-left)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"#ffffff\" clipPath=\"url(#mono-right)\" />\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill=\"none\" stroke={darkMode ? 'rgba(255,255,255,0.15)' : 'rgba(0,0,0,0.1)'} strokeWidth=\"1\" />\n </svg>\n ) : (\n <svg width={size} height={size} viewBox=\"0 0 32 32\">\n <circle cx=\"16\" cy=\"16\" r=\"15\" fill={skin.accent!} />\n </svg>\n )}\n {active && !dimmed && (\n <div\n className=\"absolute inset-0 rounded-full\"\n style={{ boxShadow: '0 0 0 2px var(--t-bg), 0 0 0 4px var(--t-text)' }}\n />\n )}\n </button>\n );\n}\n"],"names":["useRampConfig","config","orderType","country","data","setData","useState","loading","setLoading","error","setError","apiRef","useRef","RampApi","fetchConfig","useCallback","supportedParams","result","err","useEffect","useQuotes","params","configKeyRef","configKey","fetchIdRef","id","refetch","useCheckoutIntent","order","setOrder","createOrder","reset","useTransaction","transactionId","options","status","setStatus","fetchStatus","delay","timer","interval","COUNTRIES","COUNTRY_MAP","c","getDefaultFiatForCountry","countryCode","supportedFiats","preferredFiat","PROVIDERS_WILDCARD_COMPAT","providersOverlap","a","b","compat","p","filterAvailableFiats","fiats","networkProviders","f","filterAvailableCryptos","cryptos","fiatProviders","crypto","filteredNetworks","n","filterAvailablePaymentMethods","methods","fiatCurrency","m","reconcileSelections","state","filtered","locks","changed","first","net","compatible","lockedCrypto","target","isSelectionUnsupported","_a","network","_b","fiat","_c","normalizeAmount","value","maxDecimals","dotIndex","isQuotesEmpty","quotesLoading","quotes","quoteParams","pickBestUnavailableReason","gateways","defaultGateway","match","g","scored","idx","reasonScore","reason","r","TERMINAL_STATUSES","initialState","rampReducer","action","_d","_f","_e","_h","_g","RampContext","createContext","RampProvider","props","fiatProvidedRef","projectId","apiUrl","assetBaseUrl","flowType","customerId","brandId","defaultFiatCurrency","defaultCryptoCurrency","defaultNetworkProp","defaultFiatAmount","defaultCryptoAmount","defaultWalletAddress","defaultCountry","fieldLocks","partnerMetadata","statusPollInterval","onComplete","onError","children","apiConfig","useMemo","defaultNetwork","initialIsSell","hasAmount","initialStep","effectiveFiatAmount","dispatch","useReducer","isSell","configLoading","configError","geoAppliedRef","React","detected","defaultCountryAppliedRef","prevCountryRef","geoFallbackAppliedRef","prevFiatRef","currentAmount","minAmount","availableFiats","availableCryptos","availablePaymentMethods","selectionUnsupported","corrections","amountError","amount","min","max","quotesError","fetchQuotes","quotesEmpty","orderLoading","orderError","createOrderApi","CHECKOUT_POLL_INITIAL_DELAY","orderStatus","orderStatusLoading","terminalFiredForRef","effectiveDefaultGateway","bestUnavailableReason","preferred","gatewayRef","quotesRef","brandIdRef","gateway","missing","message","goToStep","step","goBack","stepOrder","currentIndex","canProceed","jsx","useRamp","context","useContext","en","LANGUAGES","I18nContext","loaders","cache","interpolate","template","vars","_","key","val","I18nProvider","defaultLocale","locale","setLocaleState","dict","setDict","loader","mod","setLocale","code","t","useI18n","ctx","useT","RedirectScreen","gatewayName","checkoutUrl","onCancel","redirectCountdown","jsxs","Spinner","size","borderWidth","CheckoutStep","className","autoRedirect","redirectDelay","iframeLoaded","setIframeLoaded","setRedirectCountdown","isExpired","countdownInterval","prev","iframeSrc","allowAttr","createPortal","widgetUrl","buildWidgetUrl","baseUrl","url","ProcessingStep","getStatusMessage","DetailRow","label","mono","CompleteStep","explorerUrl","onDone","doneButtonText","getExplorerUrl","defaultExplorers","handleDone","explorerLink","highlight","ErrorStep","onRetry","supportEmail","getErrorTitle","getErrorMessage","handleRetry","handleStartOver","BLOCKCHAINS","CRYPTO_CURRENCIES","CRYPTO_NAMES","FIAT_TO_COUNTRY","getCryptoIconUrl","ticker","getFiatFlagUrl","currencyCode","getChainInfo","chainCode","getProviderIconUrl","gatewayId","getChainIconUrl","chain","FIAT_CURRENCIES","SKINS","MOCK_RATES","STABLECOINS","isStablecoin","getMockRate","parseAmount","str","formatOutput","num","s","isValidHex","MIN_FIAT_AMOUNT","MIN_CRYPTO_AMOUNT","CRYPTO_CHAIN_COMBOS","list","truncateAddress","address","ConfirmStep","stablecoinParity","partnerName","gatewayInfo","exchangeRate","fiatNumeric","confirmParityActive","confirmSamePeg","confirmParityAmount","handleConfirm","Fragment","Modal","isOpen","onClose","variant","mounted","setMounted","animating","setAnimating","handleClose","onKey","e","closedTransform","Skeleton","w","h","FormSkeleton","LazyIcon","src","alt","background","loaded","setLoaded","currentSrc","handleLoad","handleError","CryptoIcon","FiatFlag","GenericCoinIcon","color","BankIcon","RevolutIcon","ApplePayIcon","GooglePayIcon","PayPalIcon","VisaIcon","MastercardIcon","CardIcon","markW","markH","overlap","CoinifyIcon","ChevronDown","ChevronRight","MenuIcon","onClick","DarkModeIcon","PaymentBankIcon","iconSize","PaymentCardsIcon","PaymentAppleIcon","PaymentGoogleIcon","NRLogoIcon","InfoIcon","MoreDotsIcon","SearchIcon","ArrowUpIcon","CheckmarkIcon","XIcon","getPaymentIcon","type","_theme","Toast","title","description","visible","onDismiss","exiting","setExiting","startExit","bg","NRLogo","width","LoadingScreen","BottomSheet","CloseButton","SearchInput","onChange","placeholder","inline","POPULAR_FIATS","FiatCurrencyModal","onSelect","currencies","selectedCode","search","setSearch","currencyList","staticMap","raw","selected","rest","i","isSelected","POPULAR_CRYPTOS","CryptoImage","style","CryptoCurrencyModal","selectedChain","comboList","networks","cryptoName","terms","chainName","chainShort","name","fields","score","itemSelected","ICON_KEY_MAP","LOCALIZABLE_SHORT_NAMES","BRAND_NAME_MAP","SHORT_NAME_MAP","getMethodDisplayName","fullName","short","compact","brand","getMethodIcon","methodId","icon","iconKey","PaymentMethodSelector","selectedId","onOpenModal","PaymentMethodModal","recommendedId","shortName","ToggleSwitch","checked","accentColor","SETTINGS_LINK_KEYS","cardStyle","SettingsScreen","darkMode","onToggleDarkMode","_skinId","_onSelectSkin","showThemeToggle","countryName","onLocationPress","onLanguagePress","languages","flagError","setFlagError","GlobeIcon","l","item","CountryPickerModal","normalizedCode","CountryFlag","LanguagePickerModal","lang","HeaderBar","tab","onTabSwitch","showFlowToggle","showSettings","onOpenSettings","SpendCard","onAmountChange","isBuy","onBlur","inputRef","chainDisplay","shaking","onFocus","AnimatedDigit","char","height","digits","d","AnimatedNumber","ch","ReceiveCard","displayRate","onOpenRateBreakdown","spendNumeric","autoSelectPending","rateFlash","PaymentCard","selectedMethod","ProviderCard","selectedQuote","BestPriceIcon","RecommendedIcon","QuoteTag","quote","ProviderIcon","gatewayLogo","localSrc","PercentageDiff","pct","sign","LoadingSkeletons","ChooseRampModal","cryptoCurrency","selectedGatewayId","filteredQuotes","q","bestCryptoAmount","isBest","receiveAmount","displayAmount","pctDiff","WalletCard","validating","disabled","focused","showInlineSpinner","setShaking","prevErrorRef","CtaButton","Footer","RateBreakdown","countdown","pad","fiatSymbol","formatFiat","InnerForm","theme","skinIdProp","accentColorProp","bgColorProp","bgImageProp","borderColorProp","borderRadiusProp","surfaceColorProp","inputBgColorProp","textColorProp","textSecondaryColorProp","textMutedColorProp","successColorProp","containerHeight","_locale","currentLocale","setDarkMode","skinId","setSkinId","modal","setModal","amountTouched","setAmountTouched","walletTouched","setWalletTouched","walletFocused","setWalletFocused","walletValidating","setWalletValidating","walletServerValid","setWalletServerValid","switching","setSwitching","setAutoSelectPending","manualProvider","setManualProvider","toast","setToast","rateBreakdownOpen","setRateBreakdownOpen","rateCountdown","setRateCountdown","setRateFlash","amountShake","setAmountShake","walletValidationTimer","prevTabRef","postFormHeight","prevQuotesRef","cryptoCode","fiatCode","spendAmount","activeQuote","quoteRate","lastRateRef","amt","prevReceiveRef","parityActive","isSamePeg","parityAmount","displayReceiveAmount","cc","fc","addr","abortController","msg","amountIsEmpty","amountBelowMin","hasAmountError","isAmountValid","isWalletValid","isFormValid","handleAmountChange","handleTabSwitch","newTab","handleFiatSelect","handleCryptoSelect","handlePaymentMethodSelect","handleCountrySelect","handleLocationPress","handleLanguagePress","handleCtaClick","reasons","prevStepRef","isFormStep","themeClass","activeSkin","isMono","hasCustomAccent","getCtaTextColor","hex","accentStyle","themeOverrides","backgroundStyle","borderStyle","chainInfo","amountErrorMessage","walletErrorMessage","filteredPaymentMethods","selectedPaymentMethod","postFormStep","v","close","RampForm","bgColor","bgImage","borderColor","borderRadius","surfaceColor","inputBgColor","textColor","textSecondaryColor","textMutedColor","successColor","CheckoutForm","_submitButtonText","_rateRefreshInterval","SkinSwatch","skin","active","dimmed"],"mappings":"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"}