@ic-pay/icpay-widget 1.1.12 → 1.1.15

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 +0,0 @@
1
- {"version":3,"sources":["../src/styles.ts","../src/utils/sdk.ts","../src/components/progress-bar.ts","../src/components/transak-onramp-modal.ts","../src/components/premium-content.ts","../src/error-handling.ts","../src/components/token-selector.ts","../src/components/wallet-selector-modal.ts","../src/components/tip-jar.ts","../src/components/article-paywall.ts","../src/components/coffee-shop.ts","../src/components/donation-thermometer.ts","../src/components/pay-button.ts","../src/components/amount-input.ts"],"sourcesContent":["import { css } from 'lit';\nimport type { ThemeConfig } from './types';\n\nexport const baseStyles = css`\n :host {\n --icpay-primary: #f9fafb;\n --icpay-secondary: #e5e7eb;\n --icpay-accent: #9ca3af;\n --icpay-text: #f9fafb;\n --icpay-muted: #9ca3af;\n --icpay-surface: #1f2937;\n --icpay-surface-alt: #374151;\n --icpay-border: #4b5563;\n --icpay-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: block;\n font-family: var(--icpay-font);\n }\n\n .icpay-card {\n background: var(--icpay-surface);\n border: 1px solid var(--icpay-border);\n border-radius: 16px;\n box-shadow: 0 25px 50px rgba(0, 0, 0, 0.35);\n }\n\n .icpay-section {\n padding: 20px;\n }\n\n .pay-button {\n width: 100%;\n background: linear-gradient(135deg, var(--icpay-primary) 0%, var(--icpay-secondary) 100%);\n color: #111827;\n border: 1px solid #d1d5db;\n border-radius: 16px;\n padding: 16px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);\n }\n\n .pay-button:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);\n background: linear-gradient(135deg, #ffffff 0%, #f3f4f6 100%);\n }\n\n .pay-button.processing {\n background: #6b7280;\n color: #f9fafb;\n border-color: #6b7280;\n cursor: not-allowed;\n animation: pulse 2s infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n }\n`;\n\n\nexport function applyThemeVars(host: HTMLElement, theme?: ThemeConfig | null): void {\n if (!host || !theme) return;\n const primary = theme.primaryColor || undefined;\n const secondary = theme.secondaryColor || undefined;\n const set = (k: string, v?: string) => { if (v) host.style.setProperty(k, v); };\n set('--icpay-primary', primary);\n set('--icpay-secondary', secondary);\n\n const parseHex = (hex?: string) => {\n if (!hex) return null;\n const h = hex.replace('#', '');\n const full = h.length === 3 ? h.split('').map(c=>c+c).join('') : h;\n const bigint = parseInt(full, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return { r, g, b };\n };\n const luminance = (hex?: string) => {\n const rgb = parseHex(hex);\n if (!rgb) return 0;\n const toLin = (c: number) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * toLin(rgb.r) + 0.7152 * toLin(rgb.g) + 0.0722 * toLin(rgb.b);\n };\n\n const basis = primary || secondary;\n const isLight = luminance(basis) > 0.6;\n const surface = theme.surfaceColor || (isLight ? '#f3f4f6' : '#1f2937');\n const surfaceAlt = theme.surfaceAltColor || (isLight ? '#e5e7eb' : '#374151');\n const border = theme.borderColor || (isLight ? '#d1d5db' : '#4b5563');\n const text = theme.textColor || (isLight ? '#111827' : '#f9fafb');\n const accent = theme.accentColor || secondary || primary || (isLight ? '#6b7280' : '#9ca3af');\n const muted = theme.mutedTextColor || (isLight ? '#6b7280' : '#9ca3af');\n\n set('--icpay-accent', accent);\n set('--icpay-text', text);\n set('--icpay-muted', muted);\n set('--icpay-surface', surface);\n set('--icpay-surface-alt', surfaceAlt);\n set('--icpay-border', border);\n}\n\n\n","import { Icpay, PriceCalculationResult, IcpayConfig } from '@ic-pay/icpay-sdk';\nimport type { CommonConfig } from '../types';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Debug logger utility for widget\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\nexport type WidgetSdk = {\n client: InstanceType<typeof Icpay>;\n quoteUsd(usdAmount: number, ledgerCanisterId: string): Promise<PriceCalculationResult>;\n sendUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>): Promise<any>;\n startOnrampUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>): Promise<any>;\n notifyIntentUntilComplete(paymentIntentId: string, intervalMs?: number, orderId?: string): { stop: () => void };\n};\n\nexport function createSdk(config: CommonConfig): WidgetSdk {\n if (!isBrowser) {\n // Return a mock SDK for SSR\n return {\n client: {} as any,\n quoteUsd: async () => ({ tokenAmountDecimals: '0' } as any),\n sendUsd: async () => ({ transactionId: '0', status: 'pending' } as any),\n startOnrampUsd: async () => ({ transactionId: '0', status: 'pending', metadata: { onramp: { sessionId: null } } } as any),\n notifyIntentUntilComplete: () => ({ stop: () => {} })\n };\n }\n\n debugLog(config.debug || false, 'Creating SDK with config:', config);\n\n // Filter out undefined values to avoid constructor errors\n const sdkConfig: IcpayConfig = {\n publishableKey: config.publishableKey,\n };\n // Default to enabling SDK events for the widget unless explicitly set in config\n if ((config as any).enableEvents !== undefined) {\n (sdkConfig as any).enableEvents = (config as any).enableEvents;\n } else {\n (sdkConfig as any).enableEvents = true;\n }\n\n if (config.apiUrl) sdkConfig.apiUrl = config.apiUrl;\n if (config.icHost) sdkConfig.icHost = config.icHost;\n if (config.actorProvider) sdkConfig.actorProvider = config.actorProvider;\n if (config.connectedWallet) sdkConfig.connectedWallet = config.connectedWallet;\n // Propagate kill switch to SDK (defaults to true inside SDK)\n if (config.onrampDisabled !== undefined) (sdkConfig as any).onrampDisabled = config.onrampDisabled;\n\n // Pass debug configuration to SDK if specified\n if (config.debug !== undefined) {\n sdkConfig.debug = config.debug;\n }\n\n debugLog(config.debug || false, 'Filtered SDK config:', sdkConfig);\n try {\n debugLog(config.debug || false, 'typeof Icpay:', typeof Icpay);\n const client = new Icpay(sdkConfig);\n\n // Re-emit SDK instance events on window so UI components can listen globally\n if (isBrowser) {\n const clientAny = client as any;\n const forward = (type: string) => {\n clientAny.addEventListener(type, (e: any) => {\n window.dispatchEvent(new CustomEvent(type, { detail: e?.detail ?? e }));\n });\n };\n [\n 'icpay-sdk-error',\n 'icpay-sdk-transaction-created',\n 'icpay-sdk-transaction-updated',\n 'icpay-sdk-transaction-completed',\n 'icpay-sdk-transaction-failed',\n 'icpay-sdk-method-start',\n 'icpay-sdk-method-success',\n 'icpay-sdk-method-error'\n ].forEach(forward);\n }\n\n async function quoteUsd(usdAmount: number, ledgerCanisterId: string) {\n return client.calculateTokenAmountFromUSD({ usdAmount, ledgerCanisterId });\n }\n\n async function sendUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>) {\n // Use direct USD-based API for simplicity in widgets\n return (client as any).createPaymentUsd({ usdAmount, ledgerCanisterId, metadata });\n }\n\n async function startOnrampUsd(usdAmount: number, ledgerCanisterId: string, metadata?: Record<string, any>) {\n // Trigger onramp flow through SDK; SDK returns onramp data in metadata.onramp\n return (client as any).createPaymentUsd({ usdAmount, ledgerCanisterId, metadata, onrampPayment: true });\n }\n\n\n function notifyIntentUntilComplete(paymentIntentId: string, intervalMs?: number, orderId?: string) {\n return (client as any).notifyPaymentIntentOnRamp({ paymentIntentId, intervalMs, orderId });\n }\n\n return { client, quoteUsd, sendUsd, startOnrampUsd, notifyIntentUntilComplete };\n } catch (error) {\n debugLog(config.debug || false, 'Error creating SDK:', error);\n throw error;\n }\n}\n\n\n","import { LitElement, html, css } from 'lit';\nimport { applyThemeVars } from '../styles';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n// Debug logger utility (mirrors other widgets)\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(message, data);\n } else {\n console.log(message);\n }\n }\n}\n\ntype StepStatus = 'pending' | 'loading' | 'completed' | 'error';\n\ntype Step = {\n key: string;\n label: string;\n tooltip: string;\n status: StepStatus;\n timestamp?: string;\n errorMessage?: string;\n};\n\nconst DEFAULT_STEPS: Step[] = [\n {\n key: 'wallet',\n label: 'Connect Wallet',\n tooltip: 'Awaiting wallet connection',\n status: 'pending'\n },\n {\n key: 'init',\n label: 'Initialising ICPay',\n tooltip: 'Initializing payment',\n status: 'pending'\n },\n {\n key: 'await',\n label: 'Awaiting payment confirmation',\n tooltip: 'Preparing payment',\n status: 'pending'\n },\n {\n key: 'transfer',\n label: 'Transferring funds',\n tooltip: 'Submitting payment',\n status: 'pending'\n },\n {\n key: 'verify',\n label: 'Verifying payment',\n tooltip: 'Confirming payment',\n status: 'pending'\n },\n {\n key: 'confirm',\n label: 'Payment confirmed',\n tooltip: 'Payment completed',\n status: 'pending'\n }\n];\n\n\n@customElement('icpay-progress-bar')\nexport class ICPayProgressBar extends LitElement {\n static styles = css`\n :host {\n display: block;\n font-family: var(--icpay-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);\n color: #ffffff;\n }\n\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.85);\n backdrop-filter: blur(10px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n }\n\n .modal-overlay.active {\n opacity: 1;\n visibility: visible;\n }\n\n .modal-container {\n background: linear-gradient(180deg, #1a1a1a 0%, #0f0f0f 100%);\n border: 1px solid rgba(255, 255, 255, 0.1);\n border-radius: 24px;\n padding: 48px;\n max-width: 480px;\n width: 90%;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);\n transform: translateY(20px);\n transition: transform 0.3s ease;\n }\n\n .modal-overlay.active .modal-container {\n transform: translateY(0);\n }\n\n .close-button {\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n color: #666666;\n cursor: pointer;\n padding: 8px;\n border-radius: 6px;\n transition: all 0.2s;\n font-size: 18px;\n line-height: 1;\n }\n\n .close-button:hover {\n background: #1a1a1a;\n color: #ffffff;\n }\n\n .progress-header { text-align: center; margin-bottom: 40px; }\n .progress-title {\n font-size: 24px;\n font-weight: 600;\n margin-bottom: 8px;\n background: linear-gradient(135deg, #ffffff 0%, #888888 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n }\n .progress-subtitle { color: #666666; font-size: 14px; }\n .progress-steps { margin-bottom: 40px; }\n .step { display: flex; align-items: center; margin-bottom: 24px; opacity: 0.3; transition: opacity 0.3s ease; }\n .step.active { opacity: 1; }\n .step.completed { opacity: 0.7; }\n .step-icon { width: 40px; height: 40px; border-radius: 50%; background: #1a1a1a; border: 2px solid #333333; display: flex; align-items: center; justify-content: center; margin-right: 16px; transition: all 0.3s ease; position: relative; }\n .step.active .step-icon { background: #1a1a1a; border-color: #4a9eff; box-shadow: 0 0 0 4px rgba(74, 158, 255, 0.2); }\n .step.completed .step-icon { background: #0d7c3d; border-color: #0d7c3d; }\n .step-icon svg { width: 20px; height: 20px; stroke: #666666; transition: stroke 0.3s ease; }\n .step.active .step-icon svg { stroke: #4a9eff; }\n .step.completed .step-icon svg { stroke: #ffffff; }\n .step-content { flex: 1; }\n .step-title { font-weight: 500; font-size: 16px; margin-bottom: 4px; color: #999999; transition: color 0.3s ease; }\n .step.active .step-title { color: #ffffff; }\n .step-description { font-size: 14px; color: #666666; }\n .loading-spinner { display: none; width: 20px; height: 20px; border: 2px solid rgba(74, 158, 255, 0.2); border-top-color: #4a9eff; border-radius: 50%; animation: spin 1s linear infinite; position: absolute; }\n .step.active .loading-spinner { display: block; }\n\n .error-message {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: #0a0a0a;\n border: 1px solid #dc2626;\n border-radius: 8px;\n margin-top: 8px;\n }\n\n .error-icon {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n background: #dc2626;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ffffff;\n font-size: 12px;\n font-weight: bold;\n }\n\n .error-content h4 {\n margin: 0 0 4px 0;\n font-size: 14px;\n font-weight: 600;\n color: #ffffff;\n }\n\n .error-content p {\n margin: 0;\n font-size: 12px;\n color: #f87171;\n line-height: 1.4;\n }\n\n .success-container { text-align: center; }\n .success-icon { width: 80px; height: 80px; margin: 0 auto 24px; background: linear-gradient(135deg, #0d7c3d 0%, #0fa855 100%); border-radius: 50%; display: flex; align-items: center; justify-content: center; }\n .success-icon svg { width: 40px; height: 40px; stroke: #ffffff; stroke-width: 3; }\n .success-title { font-size: 28px; font-weight: 600; margin-bottom: 12px; background: linear-gradient(135deg, #0fa855 0%, #0d7c3d 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }\n .success-message { color: #999999; margin-bottom: 24px; font-size: 16px; }\n .success-actions { display: flex; gap: 12px; justify-content: center; }\n .btn { padding: 12px 24px; border-radius: 12px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.3s ease; text-decoration: none; display: inline-flex; align-items: center; gap: 8px; }\n .btn-primary { background: linear-gradient(135deg, #4a9eff 0%, #3a7edf 100%); color: #ffffff; border: none; }\n .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(74, 158, 255, 0.3); }\n .btn-secondary { background: transparent; color: #999999; border: 1px solid #333333; }\n .btn-secondary:hover { background: rgba(255, 255, 255, 0.05); border-color: #555555; color: #ffffff; }\n\n .confetti {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1001;\n }\n\n .confetti-piece {\n position: absolute;\n width: 8px;\n height: 8px;\n background: #0066FF;\n animation: confetti-fall 3s linear forwards;\n }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n .spinner {\n width: 16px;\n height: 16px;\n border: 2px solid transparent;\n border-top: 2px solid #ffffff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes confetti-fall {\n 0% {\n transform: translateY(-100vh) rotate(0deg);\n opacity: 1;\n }\n 100% {\n transform: translateY(100vh) rotate(720deg);\n opacity: 0;\n }\n }\n `;\n\n @property({ type: Boolean }) open = false;\n @property({ type: Array }) steps: Step[] = DEFAULT_STEPS;\n @property({ type: Number }) amount = 0;\n @property({ type: String }) currency = '';\n @property({ type: String }) ledgerSymbol = '';\n @property({ type: Boolean }) debug = false;\n @state() private activeIndex = 0;\n @state() private completed = false;\n @state() private failed = false;\n @state() private errorMessage: string | null = null;\n @state() private showSuccess = false;\n @state() private showConfetti = false;\n @state() private currentSteps: Step[] = [];\n @state() private currentAmount = 0;\n @state() private currentCurrency = '';\n @state() private currentLedgerSymbol = '';\n @state() private confirmLoadingStartedAt: number | null = null;\n private progressionTimer: number | null = null;\n @state() private currentWalletType: string | null = null;\n\n @property({ type: Object }) theme?: { primaryColor?: string; secondaryColor?: string };\n\n connectedCallback(): void {\n super.connectedCallback();\n try { applyThemeVars(this, this.theme as any); } catch {}\n this.currentSteps = [...this.steps];\n\n // Initialize dynamic values from properties\n this.currentAmount = this.amount;\n this.currentCurrency = this.currency;\n this.currentLedgerSymbol = this.ledgerSymbol;\n\n // Attach global listeners for ICPay SDK events\n this.attachSDKEventListeners();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.detachSDKEventListeners();\n this.stopAutomaticProgression();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('theme')) {\n try { applyThemeVars(this, this.theme as any); } catch {}\n }\n }\n\n private attachSDKEventListeners() {\n // Core payment flow events\n window.addEventListener('icpay-sdk-method-start', this.onMethodStart as EventListener);\n window.addEventListener('icpay-sdk-method-success', this.onMethodSuccess as EventListener);\n window.addEventListener('icpay-sdk-method-error', this.onMethodError as EventListener);\n\n // Transaction lifecycle events\n window.addEventListener('icpay-sdk-transaction-created', this.onTransactionCreated as EventListener);\n window.addEventListener('icpay-sdk-transaction-updated', this.onTransactionUpdated as EventListener);\n window.addEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted as EventListener);\n window.addEventListener('icpay-sdk-transaction-failed', this.onTransactionFailed as EventListener);\n window.addEventListener('icpay-sdk-transaction-mismatched', this.onTransactionMismatched as EventListener);\n\n // Additional SDK events\n window.addEventListener('icpay-sdk-error', this.onSDKError as EventListener);\n window.addEventListener('icpay-sdk-wallet-connected', this.onWalletConnected as EventListener);\n window.addEventListener('icpay-sdk-wallet-disconnected', this.onWalletDisconnected as EventListener);\n window.addEventListener('icpay-sdk-balance-check', this.onBalanceCheck as EventListener);\n window.addEventListener('icpay-sdk-ledger-verified', this.onLedgerVerified as EventListener);\n\n // Custom widget events for better integration\n window.addEventListener('icpay-pay', this.onWidgetPayment as EventListener);\n window.addEventListener('icpay-error', this.onWidgetError as EventListener);\n window.addEventListener('icpay-unlock', this.onWidgetUnlock as EventListener);\n window.addEventListener('icpay-tip', this.onWidgetTip as EventListener);\n window.addEventListener('icpay-donation', this.onWidgetDonation as EventListener);\n window.addEventListener('icpay-coffee', this.onWidgetCoffee as EventListener);\n }\n\n private detachSDKEventListeners() {\n // Core payment flow events\n window.removeEventListener('icpay-sdk-method-start', this.onMethodStart as EventListener);\n window.removeEventListener('icpay-sdk-method-success', this.onMethodSuccess as EventListener);\n window.removeEventListener('icpay-sdk-method-error', this.onMethodError as EventListener);\n\n // Transaction lifecycle events\n window.removeEventListener('icpay-sdk-transaction-created', this.onTransactionCreated as EventListener);\n window.removeEventListener('icpay-sdk-transaction-updated', this.onTransactionUpdated as EventListener);\n window.removeEventListener('icpay-sdk-transaction-completed', this.onTransactionCompleted as EventListener);\n window.removeEventListener('icpay-sdk-transaction-failed', this.onTransactionFailed as EventListener);\n window.removeEventListener('icpay-sdk-transaction-mismatched', this.onTransactionMismatched as EventListener);\n\n // Additional SDK events\n window.removeEventListener('icpay-sdk-error', this.onSDKError as EventListener);\n window.removeEventListener('icpay-sdk-wallet-connected', this.onWalletConnected as EventListener);\n window.removeEventListener('icpay-sdk-wallet-disconnected', this.onWalletDisconnected as EventListener);\n window.removeEventListener('icpay-sdk-balance-check', this.onBalanceCheck as EventListener);\n window.removeEventListener('icpay-sdk-ledger-verified', this.onLedgerVerified as EventListener);\n\n // Custom widget events\n window.removeEventListener('icpay-pay', this.onWidgetPayment as EventListener);\n window.removeEventListener('icpay-error', this.onWidgetError as EventListener);\n window.removeEventListener('icpay-unlock', this.onWidgetUnlock as EventListener);\n window.removeEventListener('icpay-tip', this.onWidgetTip as EventListener);\n window.removeEventListener('icpay-donation', this.onWidgetDonation as EventListener);\n window.removeEventListener('icpay-coffee', this.onWidgetCoffee as EventListener);\n }\n\n private onMethodStart = (e: any) => {\n const methodName = e?.detail?.name || '';\n const methodType = e?.detail?.type || '';\n\n debugLog(this.debug, 'ICPay Progress: Method start event received:', e.detail);\n\n // Handle different payment methods (top-level starts)\n if (methodName === 'createPayment' || methodName === 'createPaymentUsd' ||\n methodName === 'sendUsd' || methodName === 'pay' ||\n methodName === 'unlock' || methodName === 'tip' ||\n methodName === 'donate' || methodName === 'order') {\n\n this.open = true;\n this.activeIndex = 0;\n this.completed = false;\n this.failed = false;\n this.errorMessage = null;\n this.showSuccess = false;\n this.showConfetti = false;\n\n // Reset all steps to pending\n this.currentSteps = this.currentSteps.map(step => ({ ...step, status: 'pending' as StepStatus }));\n\n // Step 0: Wallet connect loading (rename if onramp)\n if (methodType === 'onramp') {\n // Update wallet step copy for onramp flow\n const idx = this.getStepIndexByKey('wallet');\n if (idx >= 0) {\n this.currentSteps[idx] = {\n ...this.currentSteps[idx],\n label: 'Transak Started',\n tooltip: 'Awaiting Transak information',\n } as any;\n }\n }\n this.setLoadingByKey('wallet');\n\n // Update amount and currency if provided in event\n if (e?.detail?.amount !== undefined) {\n this.currentAmount = e.detail.amount;\n this.amount = e.detail.amount;\n debugLog(this.debug, 'ICPay Progress: Amount updated to:', e.detail.amount);\n }\n if (e?.detail?.currency) {\n this.currentCurrency = e.detail.currency;\n this.currency = e.detail.currency;\n debugLog(this.debug, 'ICPay Progress: Currency updated to:', e.detail.currency);\n }\n if (e?.detail?.ledgerSymbol) {\n this.currentLedgerSymbol = e.detail.ledgerSymbol;\n this.ledgerSymbol = e.detail.ledgerSymbol;\n debugLog(this.debug, 'ICPay Progress: Current state after method start:', {\n activeIndex: this.activeIndex,\n currentAmount: this.currentAmount,\n currentCurrency: this.currentCurrency,\n currentLedgerSymbol: this.currentLedgerSymbol\n });\n }\n\n // Waiting for wallet confirmation event to proceed\n debugLog(this.debug, 'ICPay Progress: Waiting for wallet confirmation before starting progression');\n\n this.requestUpdate();\n }\n\n // Mid-flow granular starts for internal SDK steps (independent of top-level starts)\n if (!this.failed && !this.completed) {\n if (methodName === 'sendFundsToLedger') {\n this.completeByKey('wallet');\n this.completeByKey('init');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n } else if (methodName === 'notifyLedgerTransaction') {\n this.completeByKey('wallet');\n this.completeByKey('init');\n this.completeByKey('await');\n this.completeByKey('transfer');\n this.setLoadingByKey('verify');\n }\n }\n };\n\n private startAutomaticProgression() {\n // Clear any existing progression timer\n if (this.progressionTimer) {\n clearInterval(this.progressionTimer);\n }\n\n // Start from step 1 (second step) since step 0 is already completed\n this.activeIndex = 1;\n this.updateStepStatus(this.activeIndex, 'loading');\n\n debugLog(this.debug, 'ICPay Progress: Starting automatic progression from step:', this.activeIndex);\n\n // Progress through steps every 3 seconds\n this.progressionTimer = setInterval(() => {\n if (this.failed || this.completed) {\n this.stopAutomaticProgression();\n return;\n }\n\n debugLog(this.debug, 'ICPay Progress: Processing step:', this.activeIndex);\n\n // Complete current step\n this.updateStepStatus(this.activeIndex, 'completed');\n\n // Move to next step if available\n if (this.activeIndex < this.currentSteps.length - 1) {\n this.activeIndex++;\n this.updateStepStatus(this.activeIndex, 'loading');\n debugLog(this.debug, 'ICPay Progress: Auto-progressed to step:', this.activeIndex);\n } else {\n // All steps completed, stop progression and wait for transaction completion\n this.stopAutomaticProgression();\n debugLog(this.debug, 'ICPay Progress: All steps completed, waiting for transaction completion');\n }\n\n this.requestUpdate();\n }, 3000);\n }\n\n private stopAutomaticProgression() {\n if (this.progressionTimer) {\n clearInterval(this.progressionTimer);\n this.progressionTimer = null;\n }\n }\n\n private onMethodSuccess = (e: any) => {\n const methodName = e?.detail?.name || '';\n if (methodName === 'createPayment' || methodName === 'createPaymentUsd' ||\n methodName === 'sendUsd' || methodName === 'pay' ||\n methodName === 'unlock' || methodName === 'tip' ||\n methodName === 'donate' || methodName === 'order') {\n\n // Dispatch method success event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-method-success', {\n detail: { methodName, step: this.activeIndex },\n bubbles: true\n }));\n }\n\n // Map SDK method successes to step completions (mid-flow methods)\n if (!this.failed && !this.completed) {\n if (methodName === 'getLedgerBalance') {\n this.completeByKey('wallet');\n this.completeByKey('init');\n this.setLoadingByKey('await');\n } else if (methodName === 'sendFundsToLedger') {\n this.completeByKey('wallet');\n this.completeByKey('init');\n this.completeByKey('await');\n this.completeByKey('transfer');\n this.setLoadingByKey('verify');\n } else if (methodName === 'notifyLedgerTransaction') {\n this.completeByKey('wallet');\n this.completeByKey('init');\n this.completeByKey('await');\n this.completeByKey('transfer');\n this.completeByKey('verify');\n this.setLoadingByKey('confirm');\n }\n }\n };\n\n private onTransactionCreated = (e: any) => {\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n debugLog(this.debug, 'ICPay Progress: Transaction created event received:', e.detail);\n\n // Await -> completed on intent created; start transfer loading\n if (!this.failed && !this.completed) {\n this.completeByKey('wallet');\n this.completeByKey('init');\n this.completeByKey('await');\n this.setLoadingByKey('transfer');\n }\n\n // Dispatch transaction created event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-transaction-created', {\n detail: { transactionId, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onTransactionUpdated = (e: any) => {\n const status = e?.detail?.status || 'pending';\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n debugLog(this.debug, 'ICPay Progress: Transaction updated event received:', e.detail);\n\n // When pending turns to confirmed, we will complete progression in onTransactionCompleted\n if (!this.failed && !this.completed && status === 'pending') {\n // Keep current step loading\n }\n\n // Dispatch transaction updated event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-transaction-updated', {\n detail: { status, transactionId, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onTransactionCompleted = (e: any) => {\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n const status = e?.detail?.status || 'completed';\n\n debugLog(this.debug, 'ICPay Progress: Transaction completed event received:', e.detail);\n debugLog(this.debug, 'ICPay Progress: Current state when transaction completed:', {\n activeIndex: this.activeIndex,\n completed: this.completed,\n failed: this.failed,\n showSuccess: this.showSuccess\n });\n\n // Ensure remaining steps are completed in sequence before final success\n this.completeByKey('transfer');\n this.completeByKey('await');\n this.completeByKey('init');\n this.completeByKey('verify');\n this.completeByKey('confirm');\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n\n // Dispatch completion event\n this.dispatchEvent(new CustomEvent('icpay-progress-completed', {\n detail: {\n transactionId,\n status,\n amount: this.currentAmount || this.amount,\n currency: this.currentCurrency || this.currency,\n ledgerSymbol: this.currentLedgerSymbol || this.ledgerSymbol\n },\n bubbles: true\n }));\n\n // Auto-close after 2 seconds if user hasn't closed it manually\n /*setTimeout(() => {\n if (this.open && this.showSuccess && !this.failed) {\n this.open = false;\n }\n }, 2000);*/\n\n // Only hide confetti after 3 seconds\n setTimeout(() => {\n this.showConfetti = false;\n }, 3000);\n };\n\n private onTransactionFailed = (e: any) => {\n const errorMessage = e?.detail?.message || e?.detail?.error?.message || 'Transaction failed';\n const errorCode = e?.detail?.error?.code || e?.detail?.code || 'UNKNOWN_ERROR';\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n debugLog(this.debug, 'ICPay Progress: Transaction failed event received:', e.detail);\n\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.transformErrorMessage(errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n\n // Dispatch transaction failed event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-failed', {\n detail: { errorMessage, errorCode, transactionId, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onTransactionMismatched = (e: any) => {\n const requestedAmount = e?.detail?.requestedAmount;\n const paidAmount = e?.detail?.paidAmount;\n const transactionId = e?.detail?.transactionId || e?.detail?.id;\n\n //debugLog(this.debug, 'ICPay Progress: Transaction mismatched event received:', e.detail);\n\n // Treat as failure with specific message\n this.failed = true;\n const requested = requestedAmount != null ? String(requestedAmount) : 'unknown';\n const paid = paidAmount != null ? String(paidAmount) : 'unknown';\n this.errorMessage = `Amount mismatch. Requested ${requested}, paid ${paid}.`;\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', this.errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n\n // Dispatch failed event with mismatch context\n this.dispatchEvent(new CustomEvent('icpay-progress-failed', {\n detail: { errorMessage: this.errorMessage, errorCode: 'MISMATCHED_AMOUNT', transactionId, step: this.activeIndex, requestedAmount, paidAmount },\n bubbles: true\n }));\n };\n\n private onMethodError = (e: any) => {\n const methodName = e?.detail?.name || '';\n const errorMessage = e?.detail?.error?.message || e?.detail?.message || 'An error occurred';\n const errorCode = e?.detail?.error?.code || e?.detail?.code || 'METHOD_ERROR';\n\n debugLog(this.debug, 'ICPay Progress: Method error event received:', e.detail);\n\n if (methodName?.startsWith('createPayment') || methodName === 'sendUsd' ||\n methodName === 'pay' || methodName === 'unlock' ||\n methodName === 'tip' || methodName === 'donate' ||\n methodName === 'order') {\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.transformErrorMessage(errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n\n // Dispatch method error event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-error', {\n detail: { methodName, errorMessage, errorCode, step: this.activeIndex },\n bubbles: true\n }));\n }\n };\n\n private onSDKError = (e: any) => {\n const errorMessage = e?.detail?.message || 'SDK error occurred';\n const errorCode = e?.detail?.code || 'SDK_ERROR';\n\n debugLog(this.debug, 'ICPay Progress: SDK error event received:', e.detail);\n\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.transformErrorMessage(errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n\n // Dispatch SDK error event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-sdk-error', {\n detail: { errorMessage, errorCode, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWalletConnected = (e: any) => {\n const walletType = e?.detail?.walletType || 'unknown';\n\n debugLog(this.debug, 'ICPay Progress: Wallet connected event received:', e.detail);\n\n // Complete wallet step and set init to loading\n this.completeByKey('wallet');\n this.setLoadingByKey('init');\n\n // Do not auto-progress; wait for subsequent events to advance steps\n\n // Dispatch wallet connected event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-wallet-connected', {\n detail: { walletType, step: this.activeIndex },\n bubbles: true\n }));\n this.currentWalletType = walletType;\n };\n\n private onWalletDisconnected = (e: any) => {\n const walletType = e?.detail?.walletType || 'unknown';\n\n debugLog(this.debug, 'ICPay Progress: Wallet disconnected event received:', e.detail);\n\n // Dispatch wallet disconnected event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-wallet-disconnected', {\n detail: { walletType, step: this.activeIndex },\n bubbles: true\n }));\n this.currentWalletType = null;\n };\n\n private onBalanceCheck = (e: any) => {\n const hasBalance = e?.detail?.hasBalance || false;\n const balance = e?.detail?.balance || 0;\n\n debugLog(this.debug, 'ICPay Progress: Balance check event received:', e.detail);\n\n // Handle insufficient balance error\n if (!hasBalance) {\n this.failed = true;\n this.errorMessage = 'Insufficient balance for transaction';\n this.updateStepStatus(this.activeIndex, 'error', 'Insufficient balance for transaction');\n this.stopAutomaticProgression();\n\n // Dispatch insufficient balance event\n this.dispatchEvent(new CustomEvent('icpay-progress-insufficient-balance', {\n detail: { balance, required: this.currentAmount || this.amount, step: this.activeIndex },\n bubbles: true\n }));\n }\n };\n\n private onLedgerVerified = (e: any) => {\n const ledgerId = e?.detail?.ledgerId || e?.detail?.canisterId;\n const symbol = e?.detail?.symbol || 'unknown';\n\n debugLog(this.debug, 'ICPay Progress: Ledger verified event received:', e.detail);\n\n // Update ledger symbol if provided\n if (symbol && symbol !== 'unknown') {\n this.currentLedgerSymbol = symbol;\n this.ledgerSymbol = symbol;\n }\n\n // Dispatch ledger verified event\n this.dispatchEvent(new CustomEvent('icpay-progress-ledger-verified', {\n detail: { ledgerId, symbol, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n // Widget-specific event handlers for better integration\n private onWidgetPayment = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n const ledgerSymbol = e?.detail?.ledgerSymbol;\n\n debugLog(this.debug, 'ICPay Progress: Widget payment event received:', e.detail);\n\n // Update dynamic values if provided\n if (amount !== undefined) {\n this.currentAmount = amount;\n this.amount = amount;\n }\n if (currency) {\n this.currentCurrency = currency;\n this.currency = currency;\n }\n if (ledgerSymbol) {\n this.currentLedgerSymbol = ledgerSymbol;\n this.ledgerSymbol = ledgerSymbol;\n }\n\n // Advance steps to success state (event-driven, no auto progression)\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget payment event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-payment', {\n detail: { amount, currency, ledgerSymbol, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetError = (e: any) => {\n const errorMessage = e?.detail?.message || 'Widget error occurred';\n const errorCode = e?.detail?.code || 'WIDGET_ERROR';\n\n debugLog(this.debug, 'ICPay Progress: Widget error event received:', e.detail);\n\n // Mark as failed and keep modal open with error message\n this.failed = true;\n this.errorMessage = this.transformErrorMessage(errorMessage);\n this.showSuccess = false;\n this.updateStepStatus(this.activeIndex, 'error', errorMessage);\n this.stopAutomaticProgression();\n this.open = true;\n\n // Dispatch widget error event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-error', {\n detail: { errorMessage, errorCode, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetUnlock = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget unlock event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget unlock event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-unlock', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetTip = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget tip event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget tip event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-tip', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetDonation = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget donation event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget donation event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-donation', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private onWidgetCoffee = (e: any) => {\n const amount = e?.detail?.amount;\n const currency = e?.detail?.currency;\n\n debugLog(this.debug, 'ICPay Progress: Widget coffee event received:', e.detail);\n\n // Complete steps and show success\n if (!this.failed) {\n for (let i = this.activeIndex; i < this.currentSteps.length; i++) {\n this.updateStepStatus(i, 'completed');\n }\n this.activeIndex = this.currentSteps.length - 1;\n this.completed = true;\n this.showSuccess = true;\n this.showConfetti = true;\n }\n\n // Dispatch widget coffee event for external listeners\n this.dispatchEvent(new CustomEvent('icpay-progress-widget-coffee', {\n detail: { amount, currency, step: this.activeIndex },\n bubbles: true\n }));\n };\n\n private updateStepStatus(stepIndex: number, status: StepStatus, errorMessage?: string | null) {\n if (stepIndex >= 0 && stepIndex < this.currentSteps.length) {\n const step = this.currentSteps[stepIndex];\n const oldStatus = step.status;\n\n step.status = status;\n if (status === 'completed') {\n step.timestamp = this.getCurrentTime();\n }\n if (status === 'error' && errorMessage) {\n step.errorMessage = this.transformErrorMessage(errorMessage);\n }\n\n debugLog(this.debug, `ICPay Progress: Step ${stepIndex} (${step.label}) status changed from ${oldStatus} to ${status}`);\n\n this.requestUpdate();\n }\n }\n\n private getCurrentTime() {\n const now = new Date();\n return now.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n }\n\n private progressPercent() {\n if (this.failed) return 0;\n if (this.showSuccess) return 100;\n const completedSteps = this.currentSteps.filter(step => step.status === 'completed').length;\n const pct = (completedSteps / this.currentSteps.length) * 100;\n return Math.max(0, Math.min(100, pct));\n }\n\n private verticalPercent() {\n if (this.failed) return 0;\n if (this.showSuccess) return 100;\n const completedSteps = this.currentSteps.filter(step => step.status === 'completed').length;\n const pct = (completedSteps / this.currentSteps.length) * 100;\n return Math.max(0, Math.min(100, pct));\n }\n\n private getStepIcon(step: Step): string | any {\n switch (step.status) {\n case 'loading':\n return html`<div class=\"spinner\"></div>`; // Proper CSS spinner\n case 'completed':\n return '✓'; // Checkmark\n case 'error':\n return '✗'; // X mark\n default:\n return '○'; // Empty circle for pending\n }\n }\n\n private getStepIndexByKey(key: string): number {\n return this.currentSteps.findIndex(s => s.key === key);\n }\n\n private setLoadingByKey(key: string) {\n const idx = this.getStepIndexByKey(key);\n if (idx >= 0) {\n this.activeIndex = idx;\n this.updateStepStatus(idx, 'loading');\n if (key === 'confirm') {\n this.confirmLoadingStartedAt = Date.now();\n }\n }\n }\n\n private completeByKey(key: string) {\n const idx = this.getStepIndexByKey(key);\n if (idx >= 0) {\n this.updateStepStatus(idx, 'completed');\n this.activeIndex = idx;\n }\n }\n\n // Normalize specific error messages to friendlier text\n private transformErrorMessage(message: string): string {\n const msg = String(message || '').toLowerCase();\n if (msg.includes('user rejected')) return 'User have rejected the transfer';\n if (msg.includes('user cancelled') || msg.includes('user canceled')) return 'User have rejected the transfer';\n if (msg.includes('signature rejected')) return 'User have rejected the transfer';\n return message;\n }\n\n private renderConfetti() {\n if (!this.showConfetti) return '';\n\n const confettiPieces = Array.from({ length: 50 }, (_, i) => i);\n const colors = ['#0066FF', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6'];\n\n return html`\n <div class=\"confetti\">\n ${confettiPieces.map((piece) => html`\n <div\n class=\"confetti-piece\"\n style=\"\n left: ${Math.random() * 100}%;\n top: ${Math.random() * 100}%;\n background-color: ${colors[Math.floor(Math.random() * colors.length)]};\n animation-delay: ${Math.random() * 2}s;\n animation-duration: ${2 + Math.random() * 2}s;\n \"\n ></div>\n `)}\n </div>\n `;\n }\n\n private renderSuccessState() {\n const displayAmount = this.currentAmount || this.amount;\n const displayCurrency = this.currentLedgerSymbol || this.currentCurrency || this.currency;\n\n debugLog(this.debug, 'ICPay Progress: Rendering success state with:', {\n displayAmount,\n displayCurrency,\n currentAmount: this.currentAmount,\n amount: this.amount,\n currentCurrency: this.currentCurrency,\n currency: this.currency,\n currentLedgerSymbol: this.currentLedgerSymbol,\n ledgerSymbol: this.ledgerSymbol\n });\n\n return html`\n <div class=\"success-container\">\n <div class=\"success-icon\">\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h2 class=\"success-title\">Payment Complete!</h2>\n <p class=\"success-message\">Your payment of ${displayAmount} USD has been successfully processed.</p>\n <div class=\"success-actions\">\n <button class=\"btn btn-primary\" @click=${() => { this.open = false; }}>Close</button>\n </div>\n </div>\n `;\n }\n\n private renderErrorState() {\n return html`\n <div class=\"error-message\">\n <div class=\"error-icon\">⚠</div>\n <div class=\"error-content\">\n <h4>Transaction Failed</h4>\n <p>${this.errorMessage}</p>\n <div class=\"success-actions\" style=\"margin-top:12px;\">\n <button class=\"btn btn-secondary\" @click=${() => this.requestSwitchAccount()} title=\"Switch to a different account\">Switch account</button>\n <button class=\"btn btn-primary\" @click=${() => { this.open = false; }}>Close</button>\n </div>\n </div>\n </div>\n `;\n }\n\n private requestSwitchAccount() {\n try {\n const walletType = this.currentWalletType || 'unknown';\n window.dispatchEvent(new CustomEvent('icpay-switch-account', { detail: { walletType } } as any));\n } catch {}\n }\n\n private renderProgressContent() {\n if (this.showSuccess) {\n return this.renderSuccessState();\n }\n\n if (this.failed) {\n return this.renderErrorState();\n }\n\n return html`\n <div class=\"progress-container\">\n <div class=\"progress-header\">\n <h2 class=\"progress-title\">Processing Payment</h2>\n <p class=\"progress-subtitle\">Please wait while we process your transaction</p>\n ${this.renderConfirmTip()}\n </div>\n <div class=\"progress-steps\">\n ${this.currentSteps.map((step, index) => html`\n <div class=\"step ${index === this.activeIndex ? 'active' : ''} ${step.status === 'completed' ? 'completed' : ''}\">\n <div class=\"step-icon\">\n ${step.status === 'loading' ? html`<div class=\"loading-spinner\"></div>` : ''}\n ${step.status === 'completed' ? html`\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n ` : html`\n <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z\" />\n </svg>\n `}\n </div>\n <div class=\"step-content\">\n <div class=\"step-title\">${step.label}</div>\n <div class=\"step-description\">${step.tooltip}</div>\n </div>\n </div>\n `)}\n </div>\n </div>\n `;\n }\n\n private renderConfirmTip() {\n try {\n const confirmIdx = this.getStepIndexByKey('confirm');\n if (confirmIdx < 0) return null as any;\n const isConfirmLoading = this.activeIndex === confirmIdx && this.currentSteps[confirmIdx]?.status === 'loading';\n if (!isConfirmLoading) return null as any;\n const started = this.confirmLoadingStartedAt || 0;\n const elapsed = started ? (Date.now() - started) : 0;\n if (elapsed < 30000) return null as any;\n return html`<p class=\"progress-subtitle\" style=\"margin-top:8px;color:#93c5fd\">Verification can take from 30 seconds up to 10 minutes depending on the amount. Please wait…</p>`;\n } catch {\n return null as any;\n }\n }\n\n private retryTransaction() {\n // Reset state but preserve dynamic values\n this.activeIndex = 0;\n this.completed = false;\n this.failed = false;\n this.errorMessage = null;\n this.showSuccess = false;\n this.showConfetti = false;\n\n // Preserve dynamic values from the current transaction\n // Don't reset currentAmount, currentCurrency, currentLedgerSymbol\n\n // Reset all steps to pending\n this.currentSteps = this.currentSteps.map(step => ({ ...step, status: 'pending' as StepStatus }));\n\n // Update first step to loading\n this.updateStepStatus(0, 'loading');\n\n // Start automatic progression again\n this.startAutomaticProgression();\n\n this.requestUpdate();\n }\n\n private closeProgress() {\n this.open = false;\n }\n\n private renderStep(step: Step, index: number) {\n return html`\n <div class=\"step-item ${step.status}\">\n <div class=\"step-icon\">\n ${this.getStepIcon(step)}\n </div>\n <div class=\"step-content\">\n <div class=\"step-title\">\n ${step.status === 'completed' ? 'COMPLETED' : step.label}\n </div>\n ${step.status === 'completed' ? html`\n <div class=\"step-subtitle\">\n ${step.timestamp} - ${step.tooltip}\n </div>\n ` : step.status === 'error' && step.errorMessage ? html`\n <div class=\"step-error\">${step.errorMessage}</div>\n ` : html`\n <div class=\"step-subtitle\">${step.tooltip}</div>\n `}\n </div>\n </div>\n `;\n }\n\n private get isWalletConnectLoading(): boolean {\n try {\n const idx = this.currentSteps.findIndex(s => (s as any).key === 'wallet');\n if (idx < 0) return false;\n return this.currentSteps[idx].status === 'loading' && !this.failed && !this.showSuccess;\n } catch {\n return false;\n }\n }\n\n render() {\n return html`\n ${this.open ? html`\n ${this.renderConfetti()}\n <div class=\"modal-overlay active\">\n <div class=\"modal-container\">\n ${this.isWalletConnectLoading ? html`\n <button class=\"close-button\" @click=${() => this.closeProgress()} aria-label=\"Close\" title=\"Close\">✕</button>\n ` : null}\n ${this.renderProgressContent()}\n </div>\n </div>\n ` : null}\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-progress-bar': ICPayProgressBar } }\n\n\n","import { html, TemplateResult } from 'lit';\n\ntype Environment = 'STAGING' | 'PRODUCTION';\n\nexport type TransakOnrampOptions = {\n\tvisible: boolean;\n\t/** If provided, will embed Transak directly with session id */\n\tsessionId?: string | null;\n\t/** Optional error message to show when sessionId is missing */\n\terrorMessage?: string | null;\n\t/** Transak apiKey (public key). Required if using double-iframe helper */\n\tapiKey?: string | null;\n\t/** Controls staging vs production */\n\tenvironment?: Environment;\n\t/** Optional width/height for inner iframe */\n\twidth?: number | string;\n\theight?: number | string;\n\t/** Called when user closes modal */\n\tonClose: () => void;\n /** Called when user clicks to go back to wallet selector */\n onBack?: () => void;\n};\n\n/**\n * Renders a modal containing Transak onramp widget.\n * - If sessionId is present, we embed Transak directly using the session flow URL.\n * - Otherwise, we fall back to Transak's double-iframe helper page that loads an inner iframe\n * pointing to global-stg/global with the provided apiKey.\n *\n * Reference: https://docs.transak.com/docs/double-embed-iframe-webapp\n */\nexport function renderTransakOnrampModal(opts: TransakOnrampOptions): TemplateResult | null {\n\tif (!opts.visible) return null as any;\n\tconst environment: Environment = opts.environment ?? 'STAGING';\n\tconst width = opts.width ?? 420;\n\tconst height = opts.height ?? 680;\n\n\t// Build iframe src\n\tlet iframeSrc = '';\n\tif (opts.sessionId) {\n\t\t// Direct session embed per Transak session flow.\n\t\t// For production: https://global.transak.com?sessionId=...\n\t\t// For staging: https://global-stg.transak.com?sessionId=...\n\t\tconst base = environment === 'PRODUCTION' ? 'https://global.transak.com' : 'https://global-stg.transak.com';\n\t\tiframeSrc = `${base}?sessionId=${encodeURIComponent(opts.sessionId)}`;\n\t}\n\n\treturn html`\n\t\t<div style=\"position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.85);backdrop-filter:blur(10px);z-index:10000\">\n\t\t\t<div style=\"position:relative;background:#0f1115;border:1px solid rgba(255,255,255,0.1);border-radius:16px;padding:16px;box-shadow:0 20px 60px rgba(0,0,0,0.5)\">\n\t\t\t\t<button @click=${opts.onClose} aria-label=\"Close\" title=\"Close\"\n\t\t\t\t\tstyle=\"position:absolute;top:10px;right:10px;background:transparent;border:none;color:#9ca3af;cursor:pointer;font-size:20px\">✕</button>\n\t\t\t\t${opts.sessionId ? html`\n\t\t\t\t\t<iframe\n id=\"transak-iframe\"\n\t\t\t\t\t\tstyle=\"border:none;border-radius:12px;background:#111\"\n\t\t\t\t\t\twidth=\"${String(width)}\"\n\t\t\t\t\t\theight=\"${String(height)}\"\n\t\t\t\t\t\tsrc=\"${iframeSrc}\"\n\t\t\t\t\t\tallow=\"camera;microphone;payment\"\n\t\t\t\t\t></iframe>\n\t\t\t\t` : html`\n\t\t\t\t\t<div style=\"width:${String(width)}px;max-width:90vw;padding:12px\">\n\t\t\t\t\t\t<div style=\"background:#1a1f2e;border:1px solid rgba(255,255,255,0.1);border-radius:12px;padding:24px;color:#e5e7eb;text-align:center\">\n\t\t\t\t\t\t\t<div style=\"font-size:18px;font-weight:600;margin-bottom:8px\">Service unavailable</div>\n\t\t\t\t\t\t\t<div style=\"font-size:14px;opacity:0.85;margin-bottom:16px\">${opts.errorMessage || 'The service is currently unavailable, please try again later.'}</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t@click=${() => { if (opts.onBack) opts.onBack(); else opts.onClose(); }}\n\t\t\t\t\t\t\t\tstyle=\"padding:10px 16px;border-radius:10px;border:1px solid rgba(255,255,255,0.15);background:linear-gradient(135deg,#3b82f6 0%,#10b981 100%);color:#fff;cursor:pointer;font-weight:600\">\n\t\t\t\t\t\t\t\tGo back to wallet selection\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`}\n\t\t\t</div>\n\t\t</div>\n\t`;\n}\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { PremiumContentConfig, CryptoOption } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet PlugNPlay: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-premium-content')\nexport class ICPayPremiumContent extends LitElement {\n static styles = [baseStyles, css`\n .image-container {\n position: relative;\n border-radius: 16px;\n overflow: hidden;\n margin-bottom: 16px;\n background: #111827;\n border: 1px solid var(--icpay-border);\n aspect-ratio: 16/10;\n }\n .locked-image {\n width: 100%;\n height: 100%;\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n filter: blur(8px) grayscale(1);\n transition: all 0.6s ease;\n min-height: 200px;\n }\n .locked-image.unlocked { filter: blur(0px) grayscale(1); }\n .lock-overlay { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }\n .pricing { text-align: center; margin: 16px 0; }\n .price { font-size: 28px; font-weight: 800; color: var(--icpay-text); }\n .label { color: var(--icpay-muted); font-size: 14px; }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: rgba(59, 130, 246, 0.1);\n border-color: rgba(59, 130, 246, 0.3);\n color: #3b82f6;\n }\n\n .error-message.warning {\n background: rgba(245, 158, 11, 0.1);\n border-color: rgba(245, 158, 11, 0.3);\n color: #f59e0b;\n }\n\n .error-message.error {\n background: rgba(239, 68, 68, 0.1);\n border-color: rgba(239, 68, 68, 0.3);\n color: #ef4444;\n }\n `];\n\n @property({ type: Object }) config!: PremiumContentConfig;\n @state() private selectedSymbol: string = 'ICP';\n @state() private unlocked = false;\n @state() private succeeded = false;\n @state() private processing = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'pay' | null = null;\n @state() private showWalletModal = false;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!PlugNPlay) {\n const module = await import('@windoge98/plug-n-play');\n PlugNPlay = module.PNP;\n }\n const _cfg1: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new PlugNPlay(_cfg1);\n // Hydrate saved principal for UI/history; require connect on pay\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n private get cryptoOptions(): CryptoOption[] {\n // If config provides cryptoOptions, use those (allows override)\n if (this.config.cryptoOptions) {\n return this.config.cryptoOptions;\n }\n // Otherwise use fetched verified ledgers\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Premium content connected', { config: this.config });\n this.tryAutoConnectPNP();\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n setTimeout(() => { if (action === 'pay') this.onPay(); }, 0);\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n this.pendingAction = 'pay';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) {\n // Skip in SSR or if config not set yet\n return;\n }\n\n try {\n const sdk = createSdk(this.config);\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map(ledger => ({\n symbol: ledger.symbol,\n label: ledger.name,\n canisterId: ledger.canisterId\n }));\n // Set default selection to defaultSymbol or first available ledger\n if (!this.selectedSymbol) {\n this.selectedSymbol = this.config?.defaultSymbol || (this.availableLedgers[0]?.symbol || 'ICP');\n }\n } catch (error) {\n console.warn('Failed to load verified ledgers:', error);\n // Fallback to basic options if API fails\n this.availableLedgers = [\n { symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' }\n ];\n if (!this.selectedSymbol) this.selectedSymbol = 'ICP';\n }\n }\n\n private async onPay() {\n if (!isBrowser) return; // Skip in SSR\n\n if (this.processing || this.unlocked) return;\n\n debugLog(this.config?.debug || false, 'Premium content payment started', {\n priceUsd: this.config.priceUsd,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n // Clear previous errors\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount: this.config.priceUsd, currency: this.selectedSymbol } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'pay';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!PlugNPlay) { const module = await import('@windoge98/plug-n-play'); PlugNPlay = module.PNP; }\n const _cfg2: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg2);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected, proceed with payment\n debugLog(this.config?.debug || false, 'Creating SDK for payment');\n const sdk = createSdk(this.config);\n\n // resolve canisterId by symbol if provided, otherwise require canisterId per option\n const option = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = option.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n\n debugLog(this.config?.debug || false, 'Payment details', {\n priceUsd: this.config.priceUsd,\n selectedSymbol: this.selectedSymbol,\n canisterId\n });\n\n const resp = await sdk.sendUsd(this.config.priceUsd, canisterId, { context: 'premium-content' });\n debugLog(this.config?.debug || false, 'Payment completed', { resp });\n\n this.unlocked = true;\n this.succeeded = true;\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status });\n this.dispatchEvent(new CustomEvent('icpay-unlock', { detail: { amount: this.config.priceUsd, tx: resp }, bubbles: true }));\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const option = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = option.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n const resp = await (sdk as any).startOnrampUsd(this.config.priceUsd, canisterId, { context: 'premium:onramp' });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.onrampErrorMessage = null;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n this.onrampSessionId = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private select(symbol: string) {\n this.selectedSymbol = symbol;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'pay') setTimeout(() => this.onPay(), 0);\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.config?.priceUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || this.config?.defaultSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"image-container\">\n <div class=\"locked-image ${this.unlocked ? 'unlocked' : ''}\" style=\"background-image:url('${this.config.imageUrl || ''}')\"></div>\n ${this.unlocked ? null : html`<div class=\"lock-overlay\">🔒</div>`}\n </div>\n\n <div class=\"pricing\">\n <div class=\"price\">$${Number(this.config?.priceUsd ?? 0).toFixed(2)}</div>\n <div class=\"label\">One-time unlock</div>\n </div>\n\n <div>\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${(this.config?.showLedgerDropdown || 'buttons')}\n @icpay-token-change=${(e: any) => this.select(e.detail.symbol)}\n ></icpay-token-selector>\n </div>\n\n <button class=\"pay-button ${this.processing ? 'processing' : ''}\" ?disabled=${this.processing || this.unlocked || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)} @click=${() => this.onPay()}>\n ${this.unlocked ? 'Unlocked' : (this.processing ? 'Processing…' : (\n (this.config?.buttonLabel || 'Pay ${amount} with {symbol}')\n .replace('{amount}', `${Number(this.config?.priceUsd ?? 0).toFixed(2)}`)\n .replace('{symbol}', this.selectedSymbol)\n ))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = walletsRaw.map((w:any)=>({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.config?.priceUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n });\n })()}\n\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-premium-content': ICPayPremiumContent } }\n\n\n","import { IcpayError } from '@ic-pay/icpay-sdk';\n\n// Define error codes locally to avoid SSR issues\nconst ERROR_CODES = {\n WALLET_NOT_CONNECTED: 'WALLET_NOT_CONNECTED',\n WALLET_USER_CANCELLED: 'WALLET_USER_CANCELLED',\n WALLET_SIGNATURE_REJECTED: 'WALLET_SIGNATURE_REJECTED',\n INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',\n NETWORK_ERROR: 'NETWORK_ERROR',\n API_ERROR: 'API_ERROR',\n LEDGER_NOT_FOUND: 'LEDGER_NOT_FOUND',\n TRANSACTION_FAILED: 'TRANSACTION_FAILED',\n TRANSACTION_TIMEOUT: 'TRANSACTION_TIMEOUT',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR'\n} as const;\n\n// Widget-specific error handling utilities\nexport interface WidgetErrorHandler {\n onError: (error: IcpayError) => void;\n onUserCancelled?: () => void;\n onInsufficientBalance?: (error: IcpayError) => void;\n onWalletError?: (error: IcpayError) => void;\n onNetworkError?: (error: IcpayError) => void;\n}\n\n// Default error handler that logs errors to console\nexport const defaultErrorHandler: WidgetErrorHandler = {\n onError: (error: IcpayError) => {\n console.error('[ICPay Widget] Error:', error);\n },\n onUserCancelled: () => {\n console.log('[ICPay Widget] User cancelled the action');\n },\n onInsufficientBalance: (error: IcpayError) => {\n console.warn('[ICPay Widget] Insufficient balance:', error.message);\n },\n onWalletError: (error: IcpayError) => {\n console.warn('[ICPay Widget] Wallet error:', error.message);\n },\n onNetworkError: (error: IcpayError) => {\n console.error('[ICPay Widget] Network error:', error.message);\n }\n};\n\n// Error handling function for widget components\nexport function handleWidgetError(error: unknown, errorHandler: WidgetErrorHandler = defaultErrorHandler): void {\n if (error instanceof IcpayError) {\n // Call the general error handler\n errorHandler.onError(error);\n\n // Call specific handlers based on error type\n if (error.isUserCancelled()) {\n errorHandler.onUserCancelled?.();\n } else if (error.isBalanceError()) {\n errorHandler.onInsufficientBalance?.(error);\n } else if (error.isWalletError()) {\n errorHandler.onWalletError?.(error);\n } else if (error.isNetworkError()) {\n errorHandler.onNetworkError?.(error);\n }\n } else {\n // Handle non-IcpayError errors\n console.error('[ICPay Widget] Unknown error:', error);\n errorHandler.onError(new IcpayError({\n code: ERROR_CODES.UNKNOWN_ERROR,\n message: error instanceof Error ? error.message : 'An unknown error occurred',\n details: error\n }));\n }\n}\n\n// Error message templates for common scenarios\nexport const ERROR_MESSAGES = {\n [ERROR_CODES.WALLET_NOT_CONNECTED]: 'Please connect your wallet to continue',\n [ERROR_CODES.WALLET_USER_CANCELLED]: 'User have rejected the transfer',\n [ERROR_CODES.WALLET_SIGNATURE_REJECTED]: 'User have rejected the transfer',\n [ERROR_CODES.INSUFFICIENT_BALANCE]: 'Insufficient balance for this transaction',\n [ERROR_CODES.NETWORK_ERROR]: 'Network error. Please try again',\n [ERROR_CODES.API_ERROR]: 'Service temporarily unavailable',\n [ERROR_CODES.LEDGER_NOT_FOUND]: 'Selected token is not supported',\n [ERROR_CODES.TRANSACTION_FAILED]: 'Transaction failed. Please try again',\n [ERROR_CODES.TRANSACTION_TIMEOUT]: 'Transaction timed out. Please try again',\n [ERROR_CODES.UNKNOWN_ERROR]: 'Something went wrong. Please try again'\n} as const;\n\n// Get user-friendly error message\nexport function getErrorMessage(error: IcpayError): string {\n return ERROR_MESSAGES[error.code] || error.message || 'An error occurred';\n}\n\n// Check if error should be shown to user (vs logged only)\nexport function shouldShowErrorToUser(error: IcpayError): boolean {\n // Don't show user-cancelled actions as errors\n if (error.isUserCancelled()) {\n return false;\n }\n\n // Show all other errors to user\n return true;\n}\n\n// Get appropriate UI action for error\nexport function getErrorAction(error: IcpayError): string | null {\n if (error.userAction) {\n return error.userAction;\n }\n\n switch (error.code) {\n case ERROR_CODES.WALLET_NOT_CONNECTED:\n return 'Connect Wallet';\n case ERROR_CODES.INSUFFICIENT_BALANCE:\n return 'Add Funds';\n case ERROR_CODES.NETWORK_ERROR:\n case ERROR_CODES.API_ERROR:\n return 'Try Again';\n default:\n return null;\n }\n}\n\n// Error severity levels for UI styling\nexport enum ErrorSeverity {\n INFO = 'info',\n WARNING = 'warning',\n ERROR = 'error'\n}\n\nexport function getErrorSeverity(error: IcpayError): ErrorSeverity {\n if (error.isUserCancelled()) {\n return ErrorSeverity.INFO;\n }\n\n if (error.isBalanceError() || error.isWalletError()) {\n return ErrorSeverity.WARNING;\n }\n\n return ErrorSeverity.ERROR;\n}\n","import { LitElement, html, css } from 'lit';\nimport { applyThemeVars } from '../styles';\nimport { customElement, property } from 'lit/decorators.js';\nimport { query } from 'lit/decorators.js';\nimport type { CryptoOption } from '../types';\n\n@customElement('icpay-token-selector')\nexport class ICPayTokenSelector extends LitElement {\n static styles = css`\n :host { display: block; width: 100%; box-sizing: border-box; }\n\n /* Common */\n .label,\n .icpay-dropdown-label { font-size: 14px; font-weight: 600; color: var(--icpay-text, #fff); margin-bottom: 8px; display: block; }\n\n /* Buttons grid (from crypto-payment-selector) */\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; width: 100%; margin: 12px 0 16px; box-sizing: border-box; }\n .crypto-option { background: var(--icpay-surface-alt, #2a3142); border: 1px solid var(--icpay-border, #3a4154); border-radius: 8px; padding: 8px 4px; cursor: pointer; transition: all 0.15s ease; position: relative; overflow: hidden; display: flex; flex-direction: column; align-items: center; gap: 4px; min-height: 60px; }\n .crypto-option:active { transform: scale(0.95); }\n .crypto-option.selected { background: #f7f7f7; border-color: #ffffff; }\n .crypto-option.selected .crypto-name { color: #1a1f2e; }\n .crypto-option.selected .crypto-symbol { color: #4a5568; }\n .crypto-option.selected::after { content: \"✓\"; position: absolute; top: 4px; right: 4px; width: 16px; height: 16px; background-color: #22C55E; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: bold; }\n\n /* Icon as external SVG image with constraints */\n .crypto-icon { width: 24px; height: 24px; border-radius: 50%; object-fit: contain; background: transparent; flex-shrink: 0; }\n .crypto-name { font-size: 11px; font-weight: 600; color: var(--icpay-text, #ffffff); text-align: center; line-height: 1.1; }\n .crypto-symbol { font-size: 9px; color: var(--icpay-muted-text, #888); text-align: center; line-height: 1; }\n\n /* Dropdown (from crypto-dropdown-selector) */\n .dropdown-wrapper { position: relative; width: 100%; box-sizing: border-box; }\n .dropdown-trigger { position: relative; width: 100%; box-sizing: border-box; background: var(--icpay-surface, #0a0a0a); border: 1px solid var(--icpay-border, #262626); border-radius: 12px; padding: 10px 40px 10px 16px; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 12px; min-height: 44px; }\n .dropdown-trigger:hover { border-color: #404040; background: #171717; }\n .dropdown-trigger:active { transform: scale(0.99); }\n .dropdown-trigger.open { border-color: #525252; background: #171717; border-bottom-left-radius: 0; border-bottom-right-radius: 0; }\n .selected-option { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0; }\n .dropdown-selected-icon { width: 32px; height: 32px; border-radius: 50%; object-fit: contain; flex-shrink: 0; }\n .dropdown-crypto-name { font-size: 14px; font-weight: 600; color: var(--icpay-text, #ffffff); line-height: 1.2; }\n .dropdown-crypto-symbol { font-size: 12px; color: var(--icpay-muted-text, #a3a3a3); line-height: 1.2; }\n .dropdown-arrow { width: 20px; height: 20px; color: #a3a3a3; transition: transform 0.2s ease; position: absolute; right: 12px; top: 50%; transform: translateY(-50%); pointer-events: none; }\n .dropdown-trigger.open .dropdown-arrow { transform: translateY(-50%) rotate(180deg); color: #ffffff; }\n /* Render menu as absolute under wrapper to align within widget */\n .dropdown-wrapper { position: relative; }\n .dropdown-menu { position: absolute; left: 0; top: 100%; background: var(--icpay-surface, #0a0a0a); border: 1px solid var(--icpay-border, #262626); border-top: none; border-radius: 0 0 12px 12px; overflow: hidden; opacity: 0; visibility: hidden; transform: translateY(-10px); transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease; z-index: 1000; box-shadow: 0 8px 24px rgba(0,0,0,0.5); max-height: 280px; overflow-y: auto; width: 100%; box-sizing: border-box; }\n .dropdown-menu.open { opacity: 1; visibility: visible; transform: translateY(0); }\n .dropdown-option { display: flex; align-items: center; gap: 12px; padding: 12px 16px; cursor: pointer; transition: background 0.15s ease; border-bottom: 1px solid #171717; }\n .dropdown-option:last-child { border-bottom: none; }\n .dropdown-option:hover { background: #171717; }\n .dropdown-option:active { background: #262626; }\n .dropdown-option.selected { background: #171717; }\n .dropdown-menu::-webkit-scrollbar { width: 4px; }\n .dropdown-menu::-webkit-scrollbar-track { background: #171717; }\n .dropdown-menu::-webkit-scrollbar-thumb { background: #404040; border-radius: 2px; }\n .dropdown-menu::-webkit-scrollbar-thumb:hover { background: #525252; }\n .dropdown-backdrop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.2); opacity: 0; visibility: hidden; transition: all 0.2s ease; z-index: 500; }\n .dropdown-backdrop.open { opacity: 1; visibility: visible; }\n\n /* Small screens */\n @media (max-width: 320px) {\n .crypto-grid { gap: 4px; }\n .crypto-option { padding: 6px 2px; min-height: 54px; }\n .dropdown-trigger { padding: 10px 12px; min-height: 48px; }\n .dropdown-option { padding: 10px 12px; }\n .dropdown-selected-icon { width: 28px; height: 28px; }\n }\n `;\n\n @property({ type: Array }) options: CryptoOption[] = [];\n @property({ type: String }) value: string | null = null;\n @property({ type: String }) defaultSymbol: string = 'ICP';\n @property({ type: String }) mode: 'buttons' | 'dropdown' | 'none' = 'buttons';\n @property({ type: Object }) theme?: { primaryColor?: string; secondaryColor?: string };\n @property({ type: Boolean }) open: boolean = false;\n @property({ type: Boolean }) showLabel: boolean = true;\n @query('.dropdown-trigger') private triggerEl?: HTMLElement;\n @query('.dropdown-wrapper') private wrapperEl?: HTMLElement;\n private menuPos: { left: number; top: number; width: number } = { left: 0, top: 0, width: 0 };\n\n connectedCallback(): void {\n super.connectedCallback();\n try { applyThemeVars(this, this.theme as any); } catch {}\n }\n\n updated(changed: Map<string, unknown>): void {\n if (changed.has('theme')) {\n try { applyThemeVars(this, this.theme as any); } catch {}\n }\n }\n\n firstUpdated(): void {\n const onDocClick = (event: MouseEvent) => {\n if (!this.open) return;\n const path = event.composedPath();\n if (!path.includes(this)) {\n this.closeDropdown();\n }\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.open) {\n this.closeDropdown();\n }\n };\n // Store on instance for removal\n (this as any)._onDocClick = onDocClick;\n (this as any)._onKey = onKey;\n window.addEventListener('click', onDocClick);\n window.addEventListener('keydown', onKey);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n const onDocClick = (this as any)._onDocClick as ((e: MouseEvent) => void) | undefined;\n const onKey = (this as any)._onKey as ((e: KeyboardEvent) => void) | undefined;\n if (onDocClick) window.removeEventListener('click', onDocClick);\n if (onKey) window.removeEventListener('keydown', onKey);\n // no-op: no position listeners\n }\n\n private get effectiveSymbol(): string {\n if (this.value) return this.value;\n const single = this.options?.[0]?.symbol;\n return this.defaultSymbol || single || 'ICP';\n }\n\n private getOptionBySymbol(symbol: string): CryptoOption | undefined {\n return (this.options || []).find(o => o.symbol === symbol);\n }\n\n private getLogoUrl(symbol: string): string {\n const slug = String(symbol || '').toLowerCase();\n return `https://widget.icpay.org/ledger/${slug}.svg`;\n }\n\n private onSelect(symbol: string) {\n this.value = symbol;\n // Force update to ensure current selection reflects immediately\n this.requestUpdate('value');\n this.open = false;\n this.dispatchEvent(new CustomEvent('icpay-token-change', { detail: { symbol }, bubbles: true, composed: true }));\n }\n\n private toggleDropdown() {\n this.open = !this.open;\n // No dynamic positioning required with absolute menu; keep listeners off\n }\n\n private closeDropdown() {\n this.open = false;\n // No-op for absolute menu\n }\n\n // Removed dynamic fixed positioning logic; absolute under wrapper now\n\n render() {\n const opts = this.options || [];\n // If none or single option, and mode is not forced to show UI, render nothing\n if (this.mode === 'none' || opts.length <= 1) {\n // Ensure selected value is set for parent to use\n const sym = opts.length === 1 ? opts[0].symbol : this.effectiveSymbol;\n if (this.value !== sym) {\n // Microtask to avoid render loop\n queueMicrotask(() => this.onSelect(sym));\n }\n return html``;\n }\n\n if (this.mode === 'dropdown') {\n const current = this.effectiveSymbol;\n const currentOpt = this.getOptionBySymbol(current) || { symbol: current, label: current } as CryptoOption;\n return html`\n ${this.showLabel ? html`<label class=\"icpay-dropdown-label\">Payment method</label>` : null}\n <div class=\"dropdown-wrapper\">\n <div class=\"dropdown-trigger ${this.open ? 'open' : ''}\" @click=${() => this.toggleDropdown()}>\n <div class=\"selected-option\">\n <img class=\"dropdown-selected-icon\" src=\"${this.getLogoUrl(currentOpt.symbol)}\" alt=\"${currentOpt.symbol}\" />\n <div class=\"crypto-info\">\n <div class=\"dropdown-crypto-name\">${currentOpt.label}</div>\n <div class=\"dropdown-crypto-symbol\">${currentOpt.symbol}</div>\n </div>\n </div>\n <svg class=\"dropdown-arrow\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n\n <div class=\"dropdown-menu ${this.open ? 'open' : ''}\">\n ${opts.map(o => html`\n <div class=\"dropdown-option ${this.value===o.symbol?'selected': (current===o.symbol?'selected':'')}\" @click=${() => this.onSelect(o.symbol)}>\n <img class=\"dropdown-selected-icon\" src=\"${this.getLogoUrl(o.symbol)}\" alt=\"${o.symbol}\" />\n <div class=\"crypto-info\">\n <div class=\"dropdown-crypto-name\">${o.label}</div>\n <div class=\"dropdown-crypto-symbol\">${o.symbol}</div>\n </div>\n </div>\n `)}\n </div>\n </div>\n <div class=\"dropdown-backdrop ${this.open ? 'open' : ''}\" @click=${() => this.closeDropdown()}></div>\n `;\n }\n\n // buttons mode\n const current = this.effectiveSymbol;\n return html`\n <div class=\"icpay-token-selector\" style=\"width:100%;box-sizing:border-box;\">\n ${this.showLabel ? html`<label class=\"label\">Payment method</label>` : null}\n <div class=\"crypto-grid\">\n ${opts.map(o => html`\n <div class=\"crypto-option ${current===o.symbol?'selected':''}\" @click=${() => this.onSelect(o.symbol)}>\n <img class=\"crypto-icon\" src=\"${this.getLogoUrl(o.symbol)}\" alt=\"${o.symbol}\" />\n <div class=\"crypto-name\">${o.label}</div>\n <div class=\"crypto-symbol\">${o.symbol}</div>\n </div>\n `)}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-token-selector': ICPayTokenSelector } }\n\n\n","import { html, TemplateResult } from 'lit';\n\n// Embedded icon for NFID provider (data URL)\nconst NFID_ICON_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE9GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78i iglkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpypmY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDktMDRUMTc6MTk6NDErMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI1LTA5LTA0VDE3OjIzOjU5KzAyOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTA5LTA0VDE3OjIzOjU5KzAyOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1YTMxZThhMi05MzVkLTRkY2YtOTk0Mi05NjgxZWE5MTQ0MDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NWEzMWU4YTItOTM1ZC00ZGNmLTk5NDItOTY4MWVhOTE0NDA4IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NWEzMWU4YTItOTM1ZC00ZGNmLTk5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';\n\nfunction sanitizeDataUrl(url: string): string {\n if (!url) return url;\n if (!url.startsWith('data:')) return url;\n // Remove any whitespace that might have slipped in (spaces, newlines, tabs)\n return url.replace(/\\s+/g, '');\n}\n\nfunction getWalletFriendlyName(id: string, fallback?: string): string {\n const lower = (id || '').toLowerCase();\n if (lower === 'ii') return 'Internet Identity';\n if (lower === 'nfid') return 'NFID';\n if (lower === 'plug') return 'Plug';\n if (lower === 'oisy') return 'Oisy';\n if (fallback && fallback.trim()) return fallback;\n return id ? id.charAt(0).toUpperCase() + id.slice(1) : 'Wallet';\n}\n\nexport type WalletEntry = { id: string; label: string; icon?: string | null };\n\ntype Options = {\n visible: boolean;\n wallets: WalletEntry[];\n isConnecting?: boolean;\n onSelect: (walletId: string) => void;\n onClose: () => void;\n // Optional onramp (credit card) entry at the end\n onCreditCard?: () => void;\n creditCardLabel?: string;\n showCreditCard?: boolean;\n creditCardTooltip?: string | null;\n};\n\nexport function renderWalletSelectorModal(opts: Options): TemplateResult | null {\n if (!opts.visible) return null as any;\n const { wallets, onSelect, onClose, isConnecting } = opts;\n const normalizedWallets = wallets.map(w => {\n const id = (w.id || '').toLowerCase();\n return {\n ...w,\n // Force NFID to use embedded icon; others keep provided icon\n icon: id === 'nfid' ? NFID_ICON_DATA_URL : (w.icon ?? null),\n };\n });\n // onramp-start: Temporarily disable Credit Card (Transak) option in wallet selector\n const creditCardSection: TemplateResult | null = null;\n /*\n // Original credit card section (re-enable by replacing `${creditCardSection}` with this block):\n <div style=\"margin:12px 0;height:1px;background:rgba(255,255,255,0.08)\"></div>\n <div style=\"display:flex;flex-direction:column;gap:6px\">\n <button\n @click=${() => { if (opts.onCreditCard) opts.onCreditCard(); }}\n style=\"width:100%;padding:12px 16px;background:linear-gradient(135deg,#3b82f6 0%,#10b981 100%);border:1px solid rgba(255,255,255,0.15);border-radius:8px;color:#fff;text-align:center;cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center;gap:10px\">\n <span>💳</span>\n <span style=\"font-weight:600\">${opts.creditCardLabel || 'Pay with credit card'}</span>\n </button>\n ${opts.creditCardTooltip ? html`<div style=\"font-size:12px;color:#f5d78a;text-align:center\">${opts.creditCardTooltip}</div>` : null}\n </div>\n */\n // onramp-end\n return html`\n <div style=\"position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.5);z-index:10000\">\n <div style=\"background:#1f2937;border-radius:12px;padding:24px;max-width:400px;width:90%;border:1px solid rgba(255,255,255,0.1);position:relative\">\n <button @click=${onClose} style=\"position:absolute;top:16px;right:16px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;color:#9ca3af;cursor:pointer;border:none;background:transparent;font-size:20px\">✕</button>\n <h3 style=\"color:#fff;margin:0 48px 16px 0;font-size:18px;font-weight:600\">Choose Wallet</h3>\n <div style=\"display:flex;flex-direction:column;gap:8px\">\n ${normalizedWallets.map(w => {\n const id = (w.id || '').toLowerCase();\n const displayName = getWalletFriendlyName(w.id, w.label);\n const mainButton = html`\n <button\n @click=${() => onSelect(w.id)}\n style=\"width:100%;padding:12px 16px;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);border-radius:8px;color:#fff;text-align:left;cursor:pointer;font-size:14px;opacity:${isConnecting?0.5:1};display:flex;align-items:center;gap:12px\">\n ${w.icon ? html`\n <div style=\"width:48px;height:48px;display:flex;align-items:center;justify-content:center\">\n <img src=\"${sanitizeDataUrl(w.icon)}\" alt=\"${displayName} logo\" style=\"width:40px;height:40px;object-fit:cover;border-radius:12px\" />\n </div>\n ` : html`\n <div style=\"width:48px;height:48px;background:linear-gradient(135deg,#3b82f6 0%,#8b5cf6 100%);border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:bold\">\n ${displayName}\n </div>\n `}\n <div><div style=\"font-weight:500\">${displayName}</div></div>\n </button>`;\n if (id === 'ii') {\n return html`\n <div style=\"display:flex;gap:8px;align-items:center;width:100%\">\n ${mainButton}\n <button\n @click=${() => { try { window.open('https://identity.ic0.app/','_blank','noopener,noreferrer'); } catch {} }}\n title=\"Use a different Internet Identity\"\n aria-label=\"Use a different Internet Identity\"\n style=\"width:56px;height:72px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.15);border-radius:8px;color:#9ca3af;cursor:pointer;\">\n <span style=\"font-size:20px\" aria-hidden=\"true\">🔄</span>\n </button>\n </div>`;\n }\n return html`<div style=\"width:100%\">${mainButton}</div>`;\n })}\n </div>\n ${creditCardSection}\n </div>\n </div>\n `;\n}\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { TipJarConfig, CryptoOption } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet PlugNPlay: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-tip-jar')\nexport class ICPayTipJar extends LitElement {\n static styles = [baseStyles, css`\n .jar { width: 120px; height: 160px; margin: 0 auto 12px; position: relative; background: linear-gradient(135deg, #374151 0%, #4b5563 100%); border-radius: 0 0 60px 60px; border: 3px solid #6b7280; border-top: 8px solid #6b7280; overflow: hidden; }\n .fill { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(135deg, #d1d5db 0%, #9ca3af 100%); transition: height 0.8s ease; height: 0%; }\n .amounts { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin: 12px 0; }\n .chip { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; }\n .chip.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: rgba(59, 130, 246, 0.1);\n border-color: rgba(59, 130, 246, 0.3);\n color: #3b82f6;\n }\n\n .error-message.warning {\n background: rgba(245, 158, 11, 0.1);\n border-color: rgba(245, 158, 11, 0.3);\n color: #f59e0b;\n }\n\n .error-message.error {\n background: rgba(239, 68, 68, 0.1);\n border-color: rgba(239, 68, 68, 0.3);\n color: #ef4444;\n }\n `];\n\n @property({ type: Object }) config!: TipJarConfig;\n @state() private selectedAmount = 1;\n @state() private selectedSymbol: string = 'ICP';\n @state() private total = 0;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'tip' | null = null;\n @state() private showWalletModal = false;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!PlugNPlay) {\n const module = await import('@windoge98/plug-n-play');\n PlugNPlay = module.PNP;\n }\n const _cfg1: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new PlugNPlay(_cfg1);\n // Do not call connect here; just hydrate saved principal for UI/history.\n // Keep walletConnected false so pressing pay triggers real connect.\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n private get amounts(): number[] {\n return this.config?.amountsUsd || [1, 5, 10];\n }\n private get cryptoOptions(): CryptoOption[] {\n // If config provides cryptoOptions, use those (allows override)\n if (this.config.cryptoOptions) {\n return this.config.cryptoOptions;\n }\n // Otherwise use fetched verified ledgers\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Tip jar connected', { config: this.config });\n\n if (this.config && this.config.defaultAmountUsd) this.selectedAmount = this.config.defaultAmountUsd;\n this.tryAutoConnectPNP();\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n if (this.config?.defaultSymbol) this.selectedSymbol = this.config.defaultSymbol;\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n // Resume the original action after external wallet connected\n setTimeout(() => { if (action === 'tip') this.tip(); }, 0);\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n this.pendingAction = 'tip';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) {\n // Skip in SSR or if config not set yet\n return;\n }\n\n try {\n const sdk = createSdk(this.config);\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map(ledger => ({\n symbol: ledger.symbol,\n label: ledger.name,\n canisterId: ledger.canisterId\n }));\n // If user provided a single cryptoOption, auto-select regardless of dropdown mode\n if (this.config?.cryptoOptions && this.config.cryptoOptions.length === 1) {\n this.selectedSymbol = this.config.cryptoOptions[0].symbol;\n }\n // Set default selection to provided defaultSymbol, else first available\n if (!this.selectedSymbol && this.availableLedgers.length > 0) {\n this.selectedSymbol = this.config?.defaultSymbol || this.availableLedgers[0].symbol;\n }\n } catch (error) {\n console.warn('Failed to load verified ledgers:', error);\n // Fallback to basic options if API fails\n this.availableLedgers = [ { symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' } ];\n if (!this.selectedSymbol) {\n this.selectedSymbol = 'ICP';\n }\n }\n }\n\n private selectAmount(v: number) { this.selectedAmount = v; }\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private get fillPercentage() {\n const max = 50; // visual cap\n return Math.min((this.total / max) * 100, 100);\n }\n\n private async tip() {\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Tip button clicked!', { config: this.config, processing: this.processing });\n if (this.processing) return;\n\n // Clear previous errors\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'tip', type: 'sendUsd', amount: this.selectedAmount, currency: this.selectedSymbol } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n // External wallet handling - always require explicit connect before pay\n if (!this.config.actorProvider) {\n this.pendingAction = 'tip';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!PlugNPlay) { const module = await import('@windoge98/plug-n-play'); PlugNPlay = module.PNP; }\n const _cfg2: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg2);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'tip';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected, proceed with payment\n debugLog(this.config?.debug || false, 'Creating SDK for payment');\n const sdk = createSdk(this.config);\n\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n\n debugLog(this.config?.debug || false, 'Tip payment details', {\n amount: this.selectedAmount,\n selectedSymbol: this.selectedSymbol,\n canisterId\n });\n\n const resp = await sdk.sendUsd(this.selectedAmount, canisterId, { context: 'tip-jar' });\n debugLog(this.config?.debug || false, 'Tip payment completed', { resp });\n\n this.total += this.selectedAmount;\n this.succeeded = true;\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status, total: this.total });\n this.dispatchEvent(new CustomEvent('icpay-tip', { detail: { amount: this.selectedAmount, tx: resp }, bubbles: true }));\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n const resp = await (sdk as any).startOnrampUsd(this.selectedAmount, canisterId, { context: 'tip:onramp' });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.onrampErrorMessage = null;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n this.onrampSessionId = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'tip') setTimeout(() => this.tip(), 0);\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n // Determine token selector visibility/mode using new string-based setting\n const optionsCount = this.cryptoOptions?.length || 0;\n const hasMultiple = optionsCount > 1;\n const rawMode = (this.config?.showLedgerDropdown as any) as ('buttons'|'dropdown'|'none'|undefined);\n const globalMode: 'buttons'|'dropdown'|'none' = rawMode === 'dropdown' ? 'dropdown' : rawMode === 'none' ? 'none' : 'buttons';\n const showSelector = (globalMode !== 'none') && (hasMultiple || globalMode === 'dropdown');\n const tokenSelectorMode: 'buttons'|'dropdown'|'none' = globalMode === 'dropdown' ? 'dropdown' : (hasMultiple ? 'buttons' : 'none');\n\n return html`\n <div class=\"icpay-card icpay-section\" style=\"text-align:center;\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.selectedAmount || 0)}\n .ledgerSymbol=${this.selectedSymbol || this.config?.defaultSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"jar\"><div class=\"fill\" style=\"height:${this.fillPercentage}%\"></div></div>\n <div class=\"label\">Total Tips: $${this.total}</div>\n\n <div class=\"amounts\">\n ${this.amounts.map(a => html`<div class=\"chip ${this.selectedAmount===a?'selected':''}\" @click=${() => this.selectAmount(a)}>$${a}</div>`)}\n </div>\n\n ${showSelector ? html`\n <div>\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${tokenSelectorMode}\n @icpay-token-change=${(e: any) => this.selectSymbol(e.detail.symbol)}\n ></icpay-token-selector>\n </div>\n ` : null}\n\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.tip()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Paid' : (this.processing ? 'Processing…' : (this.config?.buttonLabel\n ? this.config.buttonLabel.replace('{amount}', String(this.selectedAmount)).replace('{symbol}', this.selectedSymbol)\n : `Tip $${this.selectedAmount} with ${this.selectedSymbol}`))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = walletsRaw.map((w:any)=>({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: (this.config?.onramp?.enabled !== false) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled !== false),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.selectedAmount || this.config?.defaultAmountUsd || 0); if (amt > 0 && amt < min && (this.config?.onramp?.enabled !== false)) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n });\n })()}\n\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-tip-jar': ICPayTipJar } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { ArticlePaywallConfig, CryptoOption } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet PlugNPlay: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-article-paywall')\nexport class ICPayArticlePaywall extends LitElement {\n static styles = [baseStyles, css`\n .container { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); border-radius: 16px; padding: 16px; margin-bottom: 16px; }\n .title { color: var(--icpay-text); font-weight: 700; margin-bottom: 8px; }\n .preview { color: var(--icpay-muted); margin-bottom: 12px; line-height: 1.6; }\n .locked { filter: blur(3px); color: #6b7280; margin-bottom: 12px; }\n .unlocked { filter: blur(0); color: var(--icpay-text); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: rgba(59, 130, 246, 0.1);\n border-color: rgba(59, 130, 246, 0.3);\n color: #3b82f6;\n }\n\n .error-message.warning {\n background: rgba(245, 158, 11, 0.1);\n border-color: rgba(245, 158, 11, 0.3);\n color: #f59e0b;\n }\n\n .error-message.error {\n background: rgba(239, 68, 68, 0.1);\n border-color: rgba(239, 68, 68, 0.3);\n color: #ef4444;\n }\n `];\n\n @property({ type: Object }) config!: ArticlePaywallConfig;\n @property({ type: String }) title: string = 'Article Title';\n @property({ type: String }) preview: string = '';\n @property({ type: String }) lockedContent: string = '';\n private get obfuscatedLockedContent(): string {\n try {\n const s = this.lockedContent || '';\n // Replace all non-whitespace characters with 'x' to avoid leaking content\n return s.replace(/[^\\s]/g, 'x');\n } catch {\n return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';\n }\n }\n @state() private selectedSymbol = 'ICP';\n @state() private unlocked = false;\n @state() private succeeded = false;\n @state() private processing = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'unlock' | null = null;\n @state() private showWalletModal = false;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!PlugNPlay) {\n const module = await import('@windoge98/plug-n-play');\n PlugNPlay = module.PNP;\n }\n const _cfg1: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new PlugNPlay(_cfg1);\n // Hydrate saved principal for UI/history; require connect on pay\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n const resp = await (sdk as any).startOnrampUsd(this.config.priceUsd, canisterId, { context: 'article:onramp' });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.onrampErrorMessage = null;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n this.onrampSessionId = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private get cryptoOptions(): CryptoOption[] {\n // If config provides cryptoOptions, use those (allows override)\n if (this.config.cryptoOptions) {\n return this.config.cryptoOptions;\n }\n // Otherwise use fetched verified ledgers\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Article paywall connected', { config: this.config });\n\n // Apply config-driven content if provided\n if (this.config) {\n if (typeof (this.config as any).title === 'string') this.title = (this.config as any).title;\n if (typeof (this.config as any).preview === 'string') this.preview = (this.config as any).preview;\n if (typeof (this.config as any).lockedContent === 'string') this.lockedContent = (this.config as any).lockedContent;\n }\n\n this.tryAutoConnectPNP();\n // Listen for switch-account request\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config')) {\n // Re-apply content on config update\n if (this.config) {\n if (typeof (this.config as any).title === 'string') this.title = (this.config as any).title;\n if (typeof (this.config as any).preview === 'string') this.preview = (this.config as any).preview;\n if (typeof (this.config as any).lockedContent === 'string') this.lockedContent = (this.config as any).lockedContent;\n }\n }\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n setTimeout(() => { if (action === 'unlock') this.unlock(); }, 0);\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n // Prepare to restart flow after reconnect\n this.pendingAction = 'unlock';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) {\n // Skip in SSR or if config not set yet\n return;\n }\n\n try {\n const sdk = createSdk(this.config);\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map(ledger => ({\n symbol: ledger.symbol,\n label: ledger.name,\n canisterId: ledger.canisterId\n }));\n if (!this.selectedSymbol) {\n this.selectedSymbol = this.config?.defaultSymbol || (this.availableLedgers[0]?.symbol || 'ICP');\n }\n } catch (error) {\n console.warn('Failed to load verified ledgers:', error);\n // Fallback to basic options if API fails\n this.availableLedgers = [{ symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' }];\n if (!this.selectedSymbol) this.selectedSymbol = 'ICP';\n }\n }\n\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private async unlock() {\n if (!isBrowser) return; // Skip in SSR\n\n if (this.processing || this.unlocked) return;\n\n debugLog(this.config?.debug || false, 'Article paywall unlock started', {\n priceUsd: this.config.priceUsd,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n // Clear previous errors\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'unlock', type: 'sendUsd', amount: this.config.priceUsd, currency: this.selectedSymbol } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'unlock';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!PlugNPlay) { const module = await import('@windoge98/plug-n-play'); PlugNPlay = module.PNP; }\n const _cfg2: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg2);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'unlock';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected, proceed with payment\n debugLog(this.config?.debug || false, 'Creating SDK for payment');\n const sdk = createSdk(this.config);\n\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n\n debugLog(this.config?.debug || false, 'Article payment details', {\n priceUsd: this.config.priceUsd,\n selectedSymbol: this.selectedSymbol,\n canisterId\n });\n\n const resp = await sdk.sendUsd(this.config.priceUsd, canisterId, { context: 'article' });\n debugLog(this.config?.debug || false, 'Article payment completed', { resp });\n\n this.unlocked = true;\n this.succeeded = true;\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status });\n this.dispatchEvent(new CustomEvent('icpay-unlock', { detail: { amount: this.config.priceUsd, tx: resp }, bubbles: true }));\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'unlock') setTimeout(() => this.unlock(), 0);\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.config?.priceUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || this.config?.defaultSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"container\">\n <div class=\"title\">${this.title}</div>\n <div class=\"preview\">${this.preview}</div>\n <div class=\"${this.unlocked ? 'unlocked' : 'locked'}\">${this.unlocked ? this.lockedContent : this.obfuscatedLockedContent}</div>\n </div>\n <div class=\"pricing\" style=\"text-align:center;\">\n <div class=\"price\">$${Number(this.config?.priceUsd ?? 0).toFixed(2)}</div>\n <div class=\"label\">Continue reading</div>\n </div>\n <div>\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${(this.config?.showLedgerDropdown || 'buttons')}\n @icpay-token-change=${(e: any) => this.selectSymbol(e.detail.symbol)}\n ></icpay-token-selector>\n </div>\n <button class=\"pay-button ${this.processing?'processing':''}\" ?disabled=${this.processing||this.unlocked || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)} @click=${() => this.unlock()}>\n ${this.unlocked ? 'Unlocked' : (this.processing ? 'Processing…' : (\n (this.config?.buttonLabel || 'Pay ${amount} with {symbol}')\n .replace('{amount}', `${Number(this.config?.priceUsd ?? 0).toFixed(2)}`)\n .replace('{symbol}', this.selectedSymbol)\n ))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = walletsRaw.map((w:any)=>({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.config?.priceUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n });\n })()}\n\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-article-paywall': ICPayArticlePaywall } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { CoffeeShopConfig, CryptoOption } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet PlugNPlay: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-coffee-shop')\nexport class ICPayCoffeeShop extends LitElement {\n static styles = [baseStyles, css`\n .menu { display: grid; gap: 8px; margin-bottom: 12px; }\n .item { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 16px; display:flex; justify-content: space-between; align-items:center; cursor: pointer; color: var(--icpay-text); font-weight: 600; }\n .item.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n .total { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); border-radius: 12px; padding: 12px; text-align: center; margin-bottom: 12px; color: var(--icpay-text); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: rgba(59, 130, 246, 0.1);\n border-color: rgba(59, 130, 246, 0.3);\n color: #3b82f6;\n }\n\n .error-message.warning {\n background: rgba(245, 158, 11, 0.1);\n border-color: rgba(245, 158, 11, 0.3);\n color: #f59e0b;\n }\n\n .error-message.error {\n background: rgba(239, 68, 68, 0.1);\n border-color: rgba(239, 68, 68, 0.3);\n color: #ef4444;\n }\n `];\n\n @property({ type: Object }) config!: CoffeeShopConfig;\n @state() private selectedIndex = 0;\n @state() private selectedSymbol = 'ICP';\n @state() private processing = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'order' | null = null;\n @state() private showWalletModal = false;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n\n private get cryptoOptions(): CryptoOption[] {\n // If config provides cryptoOptions, use those (allows override)\n if (this.config.cryptoOptions) {\n return this.config.cryptoOptions;\n }\n // Otherwise use fetched verified ledgers\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Coffee shop connected', { config: this.config });\n\n if (this.config && typeof this.config.defaultItemIndex === 'number') this.selectedIndex = this.config.defaultItemIndex;\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n setTimeout(() => { if (action === 'order') this.order(); }, 0);\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n this.pendingAction = 'order';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) {\n // Skip in SSR or if config not set yet\n return;\n }\n\n try {\n const sdk = createSdk(this.config);\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map(ledger => ({\n symbol: ledger.symbol,\n label: ledger.name,\n canisterId: ledger.canisterId\n }));\n // Set default selection to first available ledger\n if (this.availableLedgers.length > 0 && !this.selectedSymbol) {\n this.selectedSymbol = this.availableLedgers[0].symbol;\n }\n } catch (error) {\n console.warn('Failed to load verified ledgers:', error);\n // Fallback to basic options if API fails\n this.availableLedgers = [\n { symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' }\n ];\n if (!this.selectedSymbol) {\n this.selectedSymbol = 'ICP';\n }\n }\n }\n\n private selectItem(i: number) { this.selectedIndex = i; }\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private get selectedItem() { return this.config?.items?.[this.selectedIndex] || { name: 'Loading...', priceUsd: 0 }; }\n\n private async order() {\n if (!isBrowser) return; // Skip in SSR\n\n if (this.processing) return;\n\n debugLog(this.config?.debug || false, 'Coffee order started', {\n selectedItem: this.selectedItem,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n // Clear previous errors\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'order', type: 'sendUsd', amount: this.selectedItem.priceUsd, currency: this.selectedSymbol } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'order';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!PlugNPlay) { const module = await import('@windoge98/plug-n-play'); PlugNPlay = module.PNP; }\n const _cfg: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'order';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected, proceed with payment\n debugLog(this.config?.debug || false, 'Creating SDK for payment');\n const sdk = createSdk(this.config);\n\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n\n debugLog(this.config?.debug || false, 'Coffee order payment details', {\n item: this.selectedItem.name,\n priceUsd: this.selectedItem.priceUsd,\n selectedSymbol: this.selectedSymbol,\n canisterId\n });\n\n const resp = await sdk.sendUsd(this.selectedItem.priceUsd, canisterId, { context: 'coffee', item: this.selectedItem.name });\n debugLog(this.config?.debug || false, 'Coffee order payment completed', { resp });\n\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status, item: this.selectedItem.name });\n this.dispatchEvent(new CustomEvent('icpay-coffee', { detail: { item: this.selectedItem, tx: resp }, bubbles: true }));\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n const resp = await (sdk as any).startOnrampUsd(this.selectedItem.priceUsd, canisterId, { context: 'coffee:onramp', item: this.selectedItem.name });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.onrampErrorMessage = null;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n this.onrampSessionId = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'order') setTimeout(() => this.order(), 0);\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.selectedItem?.priceUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || this.config?.defaultSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"menu\">\n ${this.config.items.map((it, i) => html`\n <div class=\"item ${this.selectedIndex===i?'selected':''}\" @click=${() => this.selectItem(i)}>\n <span>${it.name}</span>\n <span>$${Number(it?.priceUsd ?? 0).toFixed(2)}</span>\n </div>\n `)}\n </div>\n\n <div class=\"total\">Order Total: $${Number(this.selectedItem?.priceUsd ?? 0).toFixed(2)}</div>\n\n <div>\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${(this.config?.showLedgerDropdown || 'buttons')}\n @icpay-token-change=${(e: any) => this.selectSymbol(e.detail.symbol)}\n ></icpay-token-selector>\n </div>\n\n <button class=\"pay-button ${this.processing?'processing':''}\" ?disabled=${this.processing} @click=${() => this.order()}>\n ${this.processing ? 'Processing…' : `Order ${this.selectedItem.name}`}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = walletsRaw.map((w:any)=>({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const i = this.config?.defaultItemIndex ?? 0; const amt = Number((this.config?.items?.[i]?.priceUsd) || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n });\n })()}\n\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-coffee-shop': ICPayCoffeeShop } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { DonationThermometerConfig, CryptoOption } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Plug N Play will be imported dynamically when needed\nlet PlugNPlay: any = null;\n\n// Debug logger utility for widget components\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-donation-thermometer')\nexport class ICPayDonationThermometer extends LitElement {\n static styles = [baseStyles, css`\n .thermo { width: 60px; height: 200px; background: var(--icpay-surface-alt); border: 3px solid #6b7280; border-radius: 30px; margin: 0 auto 12px; position: relative; overflow: hidden; }\n .fill { position: absolute; bottom: 0; left: 0; right: 0; background: linear-gradient(135deg, #d1d5db 0%, #9ca3af 100%); transition: height 0.8s ease; height: 0%; border-radius: 0 0 27px 27px; }\n .amounts { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin: 12px 0; }\n .chip { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; }\n .chip.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n .crypto-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 12px 0 16px; }\n .crypto-option { background: var(--icpay-surface-alt); border: 2px solid var(--icpay-border); border-radius: 12px; padding: 12px 8px; text-align: center; cursor: pointer; color: var(--icpay-text); font-weight: 600; font-size: 12px; }\n .crypto-option.selected { background: var(--icpay-primary); color: #111827; border-color: var(--icpay-primary); }\n\n .error-message {\n border: 1px solid;\n font-weight: 500;\n }\n\n .error-message.info {\n background: rgba(59, 130, 246, 0.1);\n border-color: rgba(59, 130, 246, 0.3);\n color: #3b82f6;\n }\n\n .error-message.warning {\n background: rgba(245, 158, 11, 0.1);\n border-color: rgba(245, 158, 11, 0.3);\n color: #f59e0b;\n }\n\n .error-message.error {\n background: rgba(239, 68, 68, 0.1);\n border-color: rgba(239, 68, 68, 0.3);\n color: #ef4444;\n }\n `];\n\n @property({ type: Object }) config!: DonationThermometerConfig;\n @state() private selectedAmount = 10;\n @state() private selectedSymbol = 'ICP';\n @state() private raised = 0;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'donate' | null = null;\n @state() private showWalletModal = false;\n private pnp: any | null = null;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n private async tryAutoConnectPNP() {\n try {\n if (!this.config || this.config?.useOwnWallet) return;\n const raw = localStorage.getItem('icpay:pnp');\n if (!raw) return;\n const saved = JSON.parse(raw);\n if (!saved?.provider || !saved?.principal) return;\n if (!PlugNPlay) {\n const module = await import('@windoge98/plug-n-play');\n PlugNPlay = module.PNP;\n }\n const _cfg1: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg1.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n const pnp = new PlugNPlay(_cfg1);\n // Hydrate saved principal for UI/history; require connect on pay\n this.walletConnected = false;\n this.config = {\n ...this.config,\n connectedWallet: { owner: saved.principal, principal: saved.principal, connected: false } as any\n };\n } catch {}\n }\n\n private get amounts(): number[] {\n return this.config?.amountsUsd || [10, 25, 50, 100, 250, 500];\n }\n private get cryptoOptions(): CryptoOption[] {\n // If config provides cryptoOptions, use those (allows override)\n if (this.config.cryptoOptions) {\n return this.config.cryptoOptions;\n }\n // Otherwise use fetched verified ledgers\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return; // Skip in SSR\n\n debugLog(this.config?.debug || false, 'Donation thermometer connected', { config: this.config });\n\n if (this.config && typeof this.config.defaultAmountUsd === 'number') this.selectedAmount = this.config.defaultAmountUsd;\n this.tryAutoConnectPNP();\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n setTimeout(() => { if (action === 'donate') this.donate(); }, 0);\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n this.pendingAction = 'donate';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) {\n // Skip in SSR or if config not set yet\n return;\n }\n\n try {\n const sdk = createSdk(this.config);\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map(ledger => ({\n symbol: ledger.symbol,\n label: ledger.name,\n canisterId: ledger.canisterId\n }));\n // Set default selection to first available ledger\n if (this.availableLedgers.length > 0 && !this.selectedSymbol) {\n this.selectedSymbol = this.availableLedgers[0].symbol;\n }\n } catch (error) {\n console.warn('Failed to load verified ledgers:', error);\n // Fallback to basic options if API fails\n this.availableLedgers = [\n { symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' }\n ];\n if (!this.selectedSymbol) {\n this.selectedSymbol = 'ICP';\n }\n }\n }\n\n private selectAmount(v: number) { this.selectedAmount = v; }\n private selectSymbol(s: string) { this.selectedSymbol = s; }\n\n private get fillPercentage() {\n const goal = Number(this.config?.goalUsd ?? 1000);\n const denom = goal > 0 ? goal : 1000;\n return Math.min((this.raised / denom) * 100, 100);\n }\n\n private async donate() {\n if (!isBrowser) return; // Skip in SSR\n\n if (this.processing) return;\n\n debugLog(this.config?.debug || false, 'Donation started', {\n amount: this.selectedAmount,\n selectedSymbol: this.selectedSymbol,\n useOwnWallet: this.config.useOwnWallet\n });\n\n // Clear previous errors\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'donate', type: 'sendUsd', amount: this.selectedAmount, currency: this.selectedSymbol } })); } catch {}\n\n this.processing = true;\n try {\n // Check wallet connection status first\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'donate';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return;\n }\n } else {\n // Built-in wallet handling - connect directly with Plug N Play\n if (!this.walletConnected) {\n debugLog(this.config?.debug || false, 'Connecting to wallet via Plug N Play');\n try {\n if (!PlugNPlay) { const module = await import('@windoge98/plug-n-play'); PlugNPlay = module.PNP; }\n const _cfg2: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg2.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg2);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'donate';\n this.showWalletModal = true;\n return;\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error:', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return;\n }\n }\n }\n\n // Wallet is connected, proceed with payment\n debugLog(this.config?.debug || false, 'Creating SDK for payment');\n const sdk = createSdk(this.config);\n\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n\n debugLog(this.config?.debug || false, 'Donation payment details', {\n amount: this.selectedAmount,\n selectedSymbol: this.selectedSymbol,\n canisterId\n });\n\n const resp = await sdk.sendUsd(this.selectedAmount, canisterId, { context: 'donation' });\n debugLog(this.config?.debug || false, 'Donation payment completed', { resp });\n\n this.raised += this.selectedAmount;\n this.succeeded = true;\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status, raised: this.raised });\n this.dispatchEvent(new CustomEvent('icpay-donation', { detail: { amount: this.selectedAmount, tx: resp }, bubbles: true }));\n } catch (e) {\n // Handle errors using the new error handling system\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n\n // Update UI error state if error should be shown to user\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const opt = this.cryptoOptions.find(o => o.symbol === this.selectedSymbol)!;\n const canisterId = opt.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(this.selectedSymbol);\n const resp = await (sdk as any).startOnrampUsd(this.selectedAmount, canisterId, { context: 'donation:onramp' });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.onrampErrorMessage = null;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n this.onrampSessionId = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'donate') setTimeout(() => this.donate(), 0);\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n render() {\n if (!this.config) {\n return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n }\n\n return html`\n <div class=\"icpay-card icpay-section\" style=\"text-align:center;\">\n ${this.config?.progressBar?.enabled !== false ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.selectedAmount || 0)}\n .ledgerSymbol=${this.selectedSymbol || this.config?.defaultSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n <div class=\"thermo\"><div class=\"fill\" style=\"height:${this.fillPercentage}%\"></div></div>\n <div class=\"total\">$${Number(this.raised).toFixed(0)} / $${Number(this.config?.goalUsd ?? 0).toFixed(2)}</div>\n\n <div class=\"amounts\">\n ${this.amounts.map(a => html`<div class=\"chip ${this.selectedAmount===a?'selected':''}\" @click=${() => this.selectAmount(a)}>$${a}</div>`)}\n </div>\n\n <div>\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${(this.config?.showLedgerDropdown || 'buttons')}\n @icpay-token-change=${(e: any) => this.selectSymbol(e.detail.symbol)}\n ></icpay-token-selector>\n </div>\n\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.donate()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Donated' : (this.processing ? 'Processing…' : (\n (this.config?.buttonLabel || 'Donate {amount} with {symbol}')\n .replace('{amount}', `${this.selectedAmount}`)\n .replace('{symbol}', this.selectedSymbol)\n ))}\n </button>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`\n <button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">\n ${this.errorAction}\n </button>\n ` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = walletsRaw.map((w:any)=>({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: (this.config?.onramp?.enabled !== false) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled !== false),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.selectedAmount || this.config?.defaultAmountUsd || 0); if (amt > 0 && amt < min && (this.config?.onramp?.enabled !== false)) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n });\n })()}\n\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-donation-thermometer': ICPayDonationThermometer } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { PayButtonConfig, CryptoOption } from '../types';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\nimport { createSdk } from '../utils/sdk';\nimport type { WidgetSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\n\nconst isBrowser = typeof window !== 'undefined';\nlet PlugNPlay: any = null;\n\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-pay-button')\nexport class ICPayPayButton extends LitElement {\n static styles = [baseStyles, css`\n .row { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; }\n .row.single { grid-template-columns: 1fr; }\n select { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); color: var(--icpay-text); border-radius: 8px; padding: 10px; font-weight: 600; }\n .error-message { border: 1px solid; font-weight: 500; }\n .error-message.info { background: rgba(59,130,246,0.1); border-color: rgba(59,130,246,0.3); color: #3b82f6; }\n .error-message.warning { background: rgba(245,158,11,0.1); border-color: rgba(245,158,11,0.3); color: #f59e0b; }\n .error-message.error { background: rgba(239,68,68,0.1); border-color: rgba(239,68,68,0.3); color: #ef4444; }\n `];\n\n @property({ type: Object }) config!: PayButtonConfig;\n @state() private selectedSymbol: string | null = null;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'pay' | null = null;\n @state() private showWalletModal = false;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private onrampPollTimer: number | null = null;\n private transakMessageHandlerBound: any | null = null;\n private pnp: any | null = null;\n private sdk: WidgetSdk | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n\n private getSdk(): WidgetSdk {\n if (!this.sdk) {\n this.sdk = createSdk(this.config);\n }\n return this.sdk;\n }\n\n private get cryptoOptions(): CryptoOption[] {\n if (this.config?.cryptoOptions?.length) return this.config.cryptoOptions;\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return;\n debugLog(this.config?.debug || false, 'Pay button connected', { config: this.config });\n // Load ledgers by default when cryptoOptions not provided (widget should be self-sufficient)\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n // Initialize default symbol\n if (this.config?.defaultSymbol) this.selectedSymbol = this.config.defaultSymbol;\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config') && this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n setTimeout(() => { if (action === 'pay') this.pay(); }, 0);\n }\n // No longer pull sessionId from config; it is obtained from SDK response\n if (changed.has('config')) {\n // Recreate SDK on config changes\n this.sdk = null;\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n this.pendingAction = 'pay';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) return;\n try {\n const sdk = this.getSdk();\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map((ledger: any) => ({ symbol: ledger.symbol, label: ledger.name, canisterId: ledger.canisterId }));\n if (!this.selectedSymbol) {\n this.selectedSymbol = this.config?.defaultSymbol || (this.availableLedgers[0]?.symbol ?? 'ICP');\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: { message: 'Failed to load verified ledgers', cause: error }, bubbles: true }));\n this.availableLedgers = [ { symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' } ];\n if (!this.selectedSymbol) this.selectedSymbol = this.config?.defaultSymbol || 'ICP';\n }\n }\n\n private selectSymbol(symbol: string) { this.selectedSymbol = symbol; }\n\n private async ensureWallet(): Promise<boolean> {\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'pay';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return false;\n }\n return true;\n }\n\n if (this.walletConnected) return true;\n try {\n if (!PlugNPlay) {\n const module = await import('@windoge98/plug-n-play');\n PlugNPlay = module.PNP;\n }\n const _cfg: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg);\n const availableWallets = this.pnp.getEnabledWallets();\n debugLog(this.config?.debug || false, 'Available wallets', availableWallets);\n if (!availableWallets?.length) throw new Error('No wallets available');\n // Show chooser modal and resume later\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n return false;\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return false;\n }\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n debugLog(this.config?.debug || false, 'Connecting to wallet', { walletId });\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n debugLog(this.config?.debug || false, 'Wallet connect result', result);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'pay') setTimeout(() => this.pay(), 0);\n } catch (error) {\n debugLog(this.config?.debug || false, 'Wallet connection error', error);\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n private renderWalletModal() {\n if (!this.showWalletModal || !this.pnp) return null as any;\n const walletsRaw = this.pnp.getEnabledWallets() || [];\n const wallets = walletsRaw.map((w: any) => ({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n const onrampEnabled = (this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true);\n const minOnramp = 5;\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n const showTooltip = onrampEnabled && amountUsd > 0 && amountUsd < minOnramp;\n const diff = Math.max(0, minOnramp - amountUsd);\n const tooltip = showTooltip ? `Note: Minimum card amount is $${minOnramp}. You will pay about $${diff.toFixed(2)} more.` : null;\n return renderWalletSelectorModal({\n visible: this.showWalletModal,\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: onrampEnabled ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: onrampEnabled,\n creditCardTooltip: tooltip,\n });\n }\n\n private startOnramp() {\n // Signal to progress bar that onramp flow is starting\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n // Kick off onramp intent creation through SDK and open Transak with returned sessionId\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n const sdk = this.getSdk();\n const symbol = this.selectedSymbol || 'ICP';\n const opt = this.cryptoOptions.find(o => o.symbol === symbol);\n const canisterId = opt?.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(symbol);\n const resp = await sdk.startOnrampUsd(amountUsd, canisterId, { context: 'pay-button:onramp' });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampErrorMessage = errorMessage || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n // Open modal in friendly error state (sessionId missing)\n this.onrampSessionId = null;\n this.showOnrampModal = true;\n }\n } catch (e) {\n // Also show friendly error modal on any error\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || null;\n this.showOnrampModal = true;\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n\n // Only react to Transak order success\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n // Prevent multiple pollers if provider emits duplicates\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n // Complete steps up to verify and set confirm to loading by emitting method success events the progress bar understands\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-success', { detail: { name: 'getLedgerBalance' } })); } catch {}\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-success', { detail: { name: 'sendFundsToLedger' } })); } catch {}\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-success', { detail: { name: 'notifyLedgerTransaction' } })); } catch {}\n\n // Close Transak modal upon success, continue with our own progress\n this.showOnrampModal = false;\n\n // Start polling our API for intent status\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n // Clear any previous polling\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n\n const sdk = this.getSdk();\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n // Also listen to completion event to tidy up\n const listener = (e: any) => { handleComplete(); };\n try { window.addEventListener('icpay-sdk-transaction-completed', listener as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = sdk.notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n // Store a no-op timer id placeholder so our cleanup path remains intact\n this.onrampPollTimer = 1 as any;\n }\n\n private async pay() {\n if (!isBrowser || this.processing) return;\n\n // Reset error state\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n // Emit method start to open progress modal and set first step\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount: this.config?.amountUsd, currency: this.selectedSymbol || this.config?.defaultSymbol } })); } catch {}\n\n this.processing = true;\n try {\n const ready = await this.ensureWallet();\n if (!ready) return;\n\n const sdk = this.getSdk();\n const symbol = this.selectedSymbol || 'ICP';\n const opt = this.cryptoOptions.find(o => o.symbol === symbol);\n const canisterId = opt?.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(symbol);\n const amountUsd = Number(this.config?.amountUsd ?? 0);\n const meta = { context: 'pay-button' } as Record<string, any>;\n\n const resp = await sdk.sendUsd(amountUsd, canisterId, meta);\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status });\n this.succeeded = true;\n this.dispatchEvent(new CustomEvent('icpay-pay', { detail: { amount: amountUsd, tx: resp }, bubbles: true }));\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n render() {\n if (!this.config) return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n\n const optionsCount = this.cryptoOptions?.length || 0;\n const hasMultiple = optionsCount > 1;\n const rawMode = (this.config?.showLedgerDropdown as any) as ('buttons'|'dropdown'|'none'|undefined);\n const globalMode: 'buttons'|'dropdown'|'none' = rawMode === 'dropdown' ? 'dropdown' : rawMode === 'none' ? 'none' : 'buttons';\n const showSelector = (globalMode !== 'none') && (hasMultiple || globalMode === 'dropdown');\n const tokenSelectorMode: 'buttons'|'dropdown'|'none' = globalMode === 'dropdown' ? 'dropdown' : (hasMultiple ? 'buttons' : 'none');\n const selectedSymbol = this.selectedSymbol || this.config?.defaultSymbol || 'ICP';\n const amountPart = typeof this.config?.amountUsd === 'number' ? `${Number(this.config.amountUsd).toFixed(2)}` : '';\n const rawLabel = this.config?.buttonLabel || (typeof this.config?.amountUsd === 'number' ? 'Pay ${amount} with {symbol}' : 'Pay with {symbol}');\n const label = rawLabel.replace('{amount}', amountPart || '$0.00').replace('{symbol}', selectedSymbol);\n const progressEnabled = this.config?.progressBar?.enabled !== false;\n const showProgressBar = progressEnabled;\n\n return html`\n <div class=\"icpay-card icpay-section\">\n ${showProgressBar ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.config?.amountUsd || 0)}\n .ledgerSymbol=${selectedSymbol}\n ></icpay-progress-bar>\n ` : null}\n\n <div class=\"row ${showSelector ? '' : 'single'}\">\n ${showSelector ? html`\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${tokenSelectorMode}\n @icpay-token-change=${(e: any) => this.selectSymbol(e.detail.symbol)}\n ></icpay-token-selector>\n ` : null}\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.pay()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Paid' : (this.processing ? 'Processing…' : label)}\n </button>\n </div>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`<button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">${this.errorAction}</button>` : ''}\n </div>\n ` : ''}\n ${this.renderWalletModal()}\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n apiUrl: this.config?.apiUrl,\n paymentIntentId: this.onrampPaymentIntentId,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-pay-button': ICPayPayButton } }\n\n\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../styles';\nimport { handleWidgetError, getErrorMessage, shouldShowErrorToUser, getErrorAction, getErrorSeverity, ErrorSeverity } from '../error-handling';\nimport type { AmountInputConfig, CryptoOption } from '../types';\nimport { createSdk } from '../utils/sdk';\nimport './progress-bar';\nimport './token-selector';\nimport { renderWalletSelectorModal } from './wallet-selector-modal';\nimport { renderTransakOnrampModal, TransakOnrampOptions } from './transak-onramp-modal';\n\nconst isBrowser = typeof window !== 'undefined';\nlet PlugNPlay: any = null;\n\nfunction debugLog(debug: boolean, message: string, data?: any): void {\n if (debug) {\n if (data !== undefined) {\n console.log(`[ICPay Widget] ${message}`, data);\n } else {\n console.log(`[ICPay Widget] ${message}`);\n }\n }\n}\n\n@customElement('icpay-amount-input')\nexport class ICPayAmountInput extends LitElement {\n static styles = [baseStyles, css`\n .row { display: grid; grid-template-columns: 1fr; gap: 12px; align-items: stretch; }\n .top-row { display: grid; grid-template-columns: 1fr; gap: 10px; align-items: center; }\n .top-row.with-selector { grid-template-columns: 1fr 2fr; }\n icpay-token-selector { width: 100%; }\n .amount-field { position: relative; width: 100%; }\n .amount-field .currency-prefix { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--icpay-muted, #a3a3a3); font-weight: 600; pointer-events: none; z-index: 2; }\n .amount-field input[type=\"number\"] { padding-left: 32px; position: relative; z-index: 1; }\n input[type=\"number\"] { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); color: var(--icpay-text); border-radius: 8px; padding: 10px; font-weight: 600; width: 100%; box-sizing: border-box; height: 54px; }\n select { background: var(--icpay-surface-alt); border: 1px solid var(--icpay-border); color: var(--icpay-text); border-radius: 8px; padding: 10px; font-weight: 600; }\n .pay-button { width: 100%; }\n .error-message { border: 1px solid; font-weight: 500; }\n .error-message.info { background: rgba(59,130,246,0.1); border-color: rgba(59,130,246,0.3); color: #3b82f6; }\n .error-message.warning { background: rgba(245,158,11,0.1); border-color: rgba(245,158,11,0.3); color: #f59e0b; }\n .error-message.error { background: rgba(239,68,68,0.1); border-color: rgba(239,68,68,0.3); color: #ef4444; }\n .hint { font-size: 12px; color: var(--icpay-muted); margin-top: 6px; }\n\n @media (max-width: 520px) {\n .top-row { grid-template-columns: 1fr; }\n }\n `];\n\n @property({ type: Object }) config!: AmountInputConfig;\n @state() private amountUsd: number = 0;\n @state() private hasUserAmount: boolean = false;\n @state() private selectedSymbol: string | null = null;\n @state() private processing = false;\n @state() private succeeded = false;\n @state() private availableLedgers: CryptoOption[] = [];\n @state() private errorMessage: string | null = null;\n @state() private errorSeverity: ErrorSeverity | null = null;\n @state() private errorAction: string | null = null;\n @state() private walletConnected = false;\n @state() private pendingAction: 'pay' | null = null;\n @state() private showWalletModal = false;\n @state() private showOnrampModal = false;\n @state() private onrampSessionId: string | null = null;\n @state() private onrampPaymentIntentId: string | null = null;\n @state() private onrampErrorMessage: string | null = null;\n private pnp: any | null = null;\n private transakMessageHandlerBound: any | null = null;\n private onrampPollTimer: number | null = null;\n private onrampPollingActive: boolean = false;\n private onrampNotifyController: { stop: () => void } | null = null;\n\n private get cryptoOptions(): CryptoOption[] {\n if (this.config?.cryptoOptions?.length) return this.config.cryptoOptions;\n return this.availableLedgers;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n if (!isBrowser) return;\n debugLog(this.config?.debug || false, 'Amount input connected', { config: this.config });\n this.amountUsd = Number(this.config?.defaultAmountUsd ?? 0);\n this.hasUserAmount = false;\n // Always fetch verified ledgers by default when cryptoOptions not provided\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0)) {\n this.loadVerifiedLedgers();\n }\n if (this.config?.defaultSymbol) this.selectedSymbol = this.config.defaultSymbol;\n try { window.addEventListener('icpay-switch-account', this.onSwitchAccount as EventListener); } catch {}\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('config')) {\n // Apply defaults only if user hasn't edited the amount\n if (!this.hasUserAmount && typeof this.config?.defaultAmountUsd === 'number') {\n if (this.amountUsd === 0 || this.amountUsd == null || Number.isNaN(this.amountUsd)) {\n this.amountUsd = Number(this.config.defaultAmountUsd);\n }\n }\n if (!this.selectedSymbol && this.config?.defaultSymbol) {\n this.selectedSymbol = this.config.defaultSymbol;\n }\n\n // Ensure ledgers are loaded if dropdown is enabled and no options provided\n if (!(this.config?.cryptoOptions && this.config.cryptoOptions.length > 0) && this.availableLedgers.length === 0) {\n this.loadVerifiedLedgers();\n }\n\n // If we were waiting on wallet connect, resume action\n if (this.pendingAction && this.config?.actorProvider) {\n const action = this.pendingAction;\n this.pendingAction = null;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: 'external' } })); } catch {}\n setTimeout(() => { if (action === 'pay') this.pay(); }, 0);\n }\n }\n }\n\n private onSwitchAccount = async (e: any) => {\n try {\n if (!this.pnp) return;\n await this.pnp.disconnect();\n const type = (e?.detail?.walletType || '').toLowerCase();\n if (type === 'ii') {\n try { window.open('https://identity.ic0.app/', '_blank', 'noopener,noreferrer'); } catch {}\n }\n this.pendingAction = 'pay';\n this.walletConnected = false;\n this.showWalletModal = true;\n this.requestUpdate();\n } catch {}\n };\n\n private async loadVerifiedLedgers() {\n if (!isBrowser || !this.config?.publishableKey) return;\n try {\n const sdk = createSdk(this.config);\n const ledgers = await sdk.client.getVerifiedLedgers();\n this.availableLedgers = ledgers.map((ledger: any) => ({ symbol: ledger.symbol, label: ledger.name, canisterId: ledger.canisterId }));\n if (!this.selectedSymbol) {\n this.selectedSymbol = this.config?.defaultSymbol || (this.availableLedgers[0]?.symbol ?? 'ICP');\n }\n } catch (error) {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: { message: 'Failed to load verified ledgers', cause: error }, bubbles: true }));\n this.availableLedgers = [ { symbol: 'ICP', label: 'ICP', canisterId: 'ryjl3-tyaaa-aaaaa-aaaba-cai' } ];\n if (!this.selectedSymbol) this.selectedSymbol = this.config?.defaultSymbol || 'ICP';\n }\n }\n\n private onInputChange(e: any) {\n const step = Number(this.config?.stepUsd ?? 0.5);\n const value = Math.max(0, Number(e.target.value || 0));\n const rounded = Math.round(value / step) * step;\n this.amountUsd = Number(rounded.toFixed(2));\n this.hasUserAmount = true;\n }\n\n private selectSymbol(symbol: string) { this.selectedSymbol = symbol; }\n\n private isValidAmount(): boolean {\n const min = Number(this.config?.minUsd ?? 0.5);\n const max = this.config?.maxUsd !== undefined ? Number(this.config.maxUsd) : Infinity;\n return this.amountUsd >= min && this.amountUsd <= max;\n }\n\n private async ensureWallet(): Promise<boolean> {\n if (this.config.useOwnWallet) {\n if (!this.config.actorProvider) {\n this.pendingAction = 'pay';\n this.dispatchEvent(new CustomEvent('icpay-connect-wallet', { bubbles: true }));\n return false;\n }\n return true;\n }\n\n if (this.walletConnected) return true;\n try {\n if (!PlugNPlay) {\n const module = await import('@windoge98/plug-n-play');\n PlugNPlay = module.PNP;\n }\n const _cfg: any = { ...(this.config?.plugNPlay || {}) };\n try {\n if (typeof window !== 'undefined') {\n const { resolveDerivationOrigin } = await import('../utils/origin');\n _cfg.derivationOrigin = this.config?.derivationOrigin || resolveDerivationOrigin();\n }\n } catch {}\n this.pnp = new PlugNPlay(_cfg);\n const availableWallets = this.pnp.getEnabledWallets();\n if (!availableWallets?.length) throw new Error('No wallets available');\n this.pendingAction = 'pay';\n this.showWalletModal = true;\n return false;\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n return false;\n }\n }\n\n private getWalletId(w: any): string { return (w && (w.id || w.provider || w.key)) || ''; }\n private getWalletLabel(w: any): string { return (w && (w.label || w.name || w.title || w.id)) || 'Wallet'; }\n private getWalletIcon(w: any): string | null { return (w && (w.icon || w.logo || w.image)) || null; }\n\n private async connectWithWallet(walletId: string) {\n if (!this.pnp) return;\n try {\n if (!walletId) throw new Error('No wallet ID provided');\n const result = await this.pnp.connect(walletId);\n const isConnected = !!(result && (result.connected === true || (result as any).principal || (result as any).owner || this.pnp?.account));\n if (!isConnected) throw new Error('Wallet connection was rejected');\n this.walletConnected = true;\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-wallet-connected', { detail: { walletType: walletId } })); } catch {}\n this.config = { ...this.config, connectedWallet: result, actorProvider: (canisterId: string, idl: any) => this.pnp!.getActor({ canisterId, idl, requiresSigning: true, anon: false }) };\n this.showWalletModal = false;\n const action = this.pendingAction; this.pendingAction = null;\n if (action === 'pay') setTimeout(() => this.pay(), 0);\n } catch (error) {\n this.errorMessage = error instanceof Error ? error.message : 'Wallet connection failed';\n this.errorSeverity = ErrorSeverity.ERROR;\n this.showWalletModal = false;\n }\n }\n\n private attachTransakMessageListener() {\n if (this.transakMessageHandlerBound) return;\n this.transakMessageHandlerBound = (event: MessageEvent) => this.onTransakMessage(event);\n try { window.addEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n }\n\n private detachTransakMessageListener() {\n if (this.transakMessageHandlerBound) {\n try { window.removeEventListener('message', this.transakMessageHandlerBound as any); } catch {}\n this.transakMessageHandlerBound = null;\n }\n }\n\n private onTransakMessage(event: MessageEvent) {\n const data: any = event?.data;\n const eventId: string | undefined = data?.event_id || data?.eventId || data?.id;\n if (!eventId || typeof eventId !== 'string') return;\n\n if (eventId === 'TRANSAK_ORDER_SUCCESSFUL') {\n this.detachTransakMessageListener();\n if (this.onrampPollingActive) return;\n // Close modal and start our own flow\n this.showOnrampModal = false;\n const orderId = (data?.data?.id) || (data?.id) || (data?.webhookData?.id) || null;\n this.startOnrampPolling(orderId || undefined);\n }\n }\n\n private startOnramp() {\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'createPaymentUsd', type: 'onramp' } })); } catch {}\n this.showWalletModal = false;\n setTimeout(() => this.createOnrampIntent(), 0);\n }\n\n private async createOnrampIntent() {\n try {\n const sdk = createSdk(this.config);\n const symbol = this.selectedSymbol || 'ICP';\n const opt = this.cryptoOptions.find(o => o.symbol === symbol);\n const canisterId = opt?.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(symbol);\n const amountUsd = Number(this.amountUsd);\n const resp = await (sdk as any).startOnrampUsd(amountUsd, canisterId, { context: 'amount-input:onramp' });\n const sessionId = resp?.metadata?.onramp?.sessionId || resp?.metadata?.onramp?.session_id || null;\n const paymentIntentId = resp?.metadata?.paymentIntentId || resp?.paymentIntentId || null;\n const errorMessage = resp?.metadata?.onramp?.errorMessage || null;\n this.onrampPaymentIntentId = paymentIntentId;\n if (sessionId) {\n this.onrampSessionId = sessionId;\n this.onrampErrorMessage = null;\n this.showOnrampModal = true;\n this.attachTransakMessageListener();\n } else {\n this.onrampSessionId = null;\n this.onrampErrorMessage = errorMessage || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n } catch (e) {\n this.onrampSessionId = null;\n this.onrampErrorMessage = (e as any)?.message || 'Failed to obtain onramp sessionId';\n this.showOnrampModal = true;\n }\n }\n\n private startOnrampPolling(orderId?: string) {\n if (this.onrampPollTimer) { try { clearInterval(this.onrampPollTimer); } catch {}; this.onrampPollTimer = null; }\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {}; this.onrampNotifyController = null; }\n\n const paymentIntentId = this.onrampPaymentIntentId;\n if (!paymentIntentId) return;\n\n const sdk = createSdk(this.config);\n const handleComplete = () => {\n this.detachTransakMessageListener();\n if (this.onrampNotifyController) { try { this.onrampNotifyController.stop(); } catch {} }\n this.onrampNotifyController = null;\n this.onrampPollingActive = false;\n };\n try { window.addEventListener('icpay-sdk-transaction-completed', (() => handleComplete()) as any, { once: true } as any); } catch {}\n this.onrampPollingActive = true;\n this.onrampNotifyController = (sdk as any).notifyIntentUntilComplete(paymentIntentId, 5000, orderId);\n this.onrampPollTimer = 1 as any;\n }\n\n private async pay() {\n if (!isBrowser || this.processing) return;\n\n // Reset error state\n this.errorMessage = null;\n this.errorSeverity = null;\n this.errorAction = null;\n\n if (!this.isValidAmount()) {\n this.errorMessage = 'Please enter a valid amount';\n this.errorSeverity = ErrorSeverity.WARNING;\n return;\n }\n\n try { window.dispatchEvent(new CustomEvent('icpay-sdk-method-start', { detail: { name: 'pay', type: 'sendUsd', amount: this.amountUsd, currency: this.selectedSymbol || this.config?.defaultSymbol } })); } catch {}\n\n this.processing = true;\n try {\n const ready = await this.ensureWallet();\n if (!ready) return;\n\n const sdk = createSdk(this.config);\n const symbol = this.selectedSymbol || 'ICP';\n const opt = this.cryptoOptions.find(o => o.symbol === symbol);\n const canisterId = opt?.canisterId || await sdk.client.getLedgerCanisterIdBySymbol(symbol);\n const amountUsd = Number(this.amountUsd);\n const meta = { context: 'amount-input' } as Record<string, any>;\n\n const resp = await sdk.sendUsd(amountUsd, canisterId, meta);\n if (this.config.onSuccess) this.config.onSuccess({ id: resp.transactionId, status: resp.status, amountUsd });\n this.succeeded = true;\n this.dispatchEvent(new CustomEvent('icpay-amount-pay', { detail: { amount: amountUsd, tx: resp }, bubbles: true }));\n } catch (e) {\n handleWidgetError(e, {\n onError: (error) => {\n this.dispatchEvent(new CustomEvent('icpay-error', { detail: error, bubbles: true }));\n if (shouldShowErrorToUser(error)) {\n this.errorMessage = getErrorMessage(error);\n this.errorSeverity = getErrorSeverity(error);\n this.errorAction = getErrorAction(error);\n }\n }\n });\n } finally {\n this.processing = false;\n }\n }\n\n render() {\n if (!this.config) return html`<div class=\"icpay-card icpay-section\">Loading...</div>`;\n const placeholder = this.config?.placeholder || 'Enter amount in USD';\n const payLabelRaw = this.config?.buttonLabel || 'Pay ${amount} with {symbol}';\n const payLabel = payLabelRaw\n .replace('{amount}', this.amountUsd ? `${Number(this.amountUsd).toFixed(2)}` : '$0.00')\n .replace('{symbol}', this.selectedSymbol || (this.config?.defaultSymbol || 'ICP'));\n const selectedLabel =\n (this.cryptoOptions.find(o => o.symbol === (this.selectedSymbol||''))?.label)\n || (this.cryptoOptions[0]?.label)\n || (this.config?.defaultSymbol || 'ICP');\n const mode = this.config?.progressBar?.mode || 'modal';\n const rawMode = (this.config?.showLedgerDropdown as any) as ('buttons'|'dropdown'|'none'|boolean|undefined);\n const globalMode: 'buttons'|'dropdown'|'none' = rawMode === 'buttons' ? 'buttons' : rawMode === 'none' ? 'none' : 'dropdown';\n const optionsCount = this.cryptoOptions?.length || 0;\n const hasMultiple = optionsCount > 1;\n const showSelector = (globalMode !== 'none') && (hasMultiple || globalMode === 'dropdown');\n const tokenSelectorMode: 'buttons'|'dropdown'|'none' = globalMode === 'dropdown' ? 'dropdown' : (hasMultiple ? 'buttons' : 'none');\n const progressEnabled = this.config?.progressBar?.enabled !== false;\n const showProgressBar = progressEnabled && (mode === 'modal' ? true : this.processing);\n\n return html`\n <div class=\"icpay-card icpay-section\">\n ${showProgressBar ? html`\n <icpay-progress-bar\n .debug=${!!this.config?.debug}\n .theme=${this.config?.theme}\n .amount=${Number(this.amountUsd || 0)}\n .ledgerSymbol=${this.selectedSymbol || this.config?.defaultSymbol || 'ICP'}\n ></icpay-progress-bar>\n ` : null}\n\n <div class=\"row\">\n <div class=\"top-row ${showSelector ? 'with-selector' : ''}\">\n <div class=\"amount-field\">\n <span class=\"currency-prefix\">$</span>\n <input type=\"number\" min=\"0\" step=\"${Number(this.config?.stepUsd ?? 0.5)}\" .value=${String(this.amountUsd || '')} placeholder=\"${placeholder}\" @input=${(e: any) => this.onInputChange(e)} />\n </div>\n ${showSelector ? html`\n <icpay-token-selector\n .options=${this.cryptoOptions}\n .value=${this.selectedSymbol || ''}\n .defaultSymbol=${this.config?.defaultSymbol || 'ICP'}\n mode=${tokenSelectorMode}\n .showLabel=${false}\n @icpay-token-change=${(e: any) => this.selectSymbol(e.detail.symbol)}\n ></icpay-token-selector>\n ` : null}\n </div>\n <button class=\"pay-button ${this.processing?'processing':''}\"\n ?disabled=${this.processing || (this.config?.disablePaymentButton === true) || (this.succeeded && this.config?.disableAfterSuccess === true)}\n @click=${() => this.pay()}>\n ${this.succeeded && this.config?.disableAfterSuccess ? 'Paid' : (this.processing ? 'Processing…' : payLabel)}\n </button>\n </div>\n <div class=\"hint\">Default: ${this.config?.defaultSymbol || 'ICP'}. Min: $${Number(this.config?.minUsd ?? 0.5).toFixed(2)}${this.config?.maxUsd ? `, Max: $${Number(this.config.maxUsd).toFixed(2)}` : ''}</div>\n\n ${this.errorMessage ? html`\n <div class=\"error-message ${this.errorSeverity}\" style=\"margin-top: 12px; padding: 8px 12px; border-radius: 6px; font-size: 14px; text-align: center;\">\n ${this.errorMessage}\n ${this.errorAction ? html`<button style=\"margin-left: 8px; padding: 4px 8px; background: transparent; border: 1px solid currentColor; border-radius: 4px; font-size: 12px; cursor: pointer;\">${this.errorAction}</button>` : ''}\n </div>\n ` : ''}\n ${(() => {\n const walletsRaw = (this as any).pnp?.getEnabledWallets?.() || [];\n const wallets = walletsRaw.map((w:any)=>({ id: this.getWalletId(w), label: this.getWalletLabel(w), icon: this.getWalletIcon(w) }));\n return renderWalletSelectorModal({\n visible: !!(this.showWalletModal && this.pnp),\n wallets,\n isConnecting: false,\n onSelect: (walletId: string) => this.connectWithWallet(walletId),\n onClose: () => { this.showWalletModal = false; },\n onCreditCard: ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true)) ? () => this.startOnramp() : undefined,\n creditCardLabel: this.config?.onramp?.creditCardLabel || 'Pay with credit card',\n showCreditCard: (this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true),\n creditCardTooltip: (() => {\n const min = 5; const amt = Number(this.amountUsd || 0); if (amt > 0 && amt < min && ((this.config?.onramp?.enabled !== false) && (this.config?.onrampDisabled !== true))) { const d = (min - amt).toFixed(2); return `Note: Minimum card amount is $${min}. You will pay about $${d} more.`; } return null;\n })(),\n });\n })()}\n\n ${this.showOnrampModal ? renderTransakOnrampModal({\n visible: this.showOnrampModal,\n sessionId: this.onrampSessionId,\n errorMessage: this.onrampErrorMessage,\n apiKey: this.config?.onramp?.apiKey,\n environment: (this.config?.onramp?.environment || 'STAGING') as any,\n width: this.config?.onramp?.width,\n height: this.config?.onramp?.height,\n onClose: () => { this.showOnrampModal = false; },\n onBack: () => { this.showOnrampModal = false; this.showWalletModal = true; }\n } as TransakOnrampOptions) : null}\n </div>\n `;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'icpay-amount-input': ICPayAmountInput } }\n\n\n"],"mappings":"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","names":["css","baseStyles","applyThemeVars","host","theme","primary","secondary","set","k","v","parseHex","hex","h","full","c","bigint","r","g","b","isLight","rgb","toLin","s","surface","surfaceAlt","border","text","accent","muted","Icpay","isBrowser","debugLog","debug","message","data","createSdk","config","sdkConfig","notifyIntentUntilComplete","paymentIntentId","intervalMs","orderId","client","clientAny","forward","type","e","quoteUsd","usdAmount","ledgerCanisterId","sendUsd","metadata","startOnrampUsd","error","LitElement","html","css","customElement","property","state","debugLog","debug","message","data","DEFAULT_STEPS","ICPayProgressBar","LitElement","methodName","methodType","step","idx","transactionId","status","errorMessage","errorCode","requestedAmount","paidAmount","requested","paid","walletType","hasBalance","balance","ledgerId","symbol","amount","currency","ledgerSymbol","i","applyThemeVars","changed","stepIndex","oldStatus","pct","html","key","s","msg","confettiPieces","_","colors","piece","displayAmount","displayCurrency","index","confirmIdx","started","css","__decorateClass","property","state","customElement","html","renderTransakOnrampModal","opts","environment","width","height","iframeSrc","LitElement","html","css","customElement","property","state","IcpayError","ERROR_CODES","defaultErrorHandler","error","handleWidgetError","errorHandler","ERROR_MESSAGES","getErrorMessage","shouldShowErrorToUser","getErrorAction","getErrorSeverity","error","LitElement","html","css","customElement","property","query","ICPayTokenSelector","LitElement","applyThemeVars","changed","onDocClick","event","onKey","single","symbol","o","opts","sym","html","current","currentOpt","css","__decorateClass","property","query","customElement","html","NFID_ICON_DATA_URL","sanitizeDataUrl","url","getWalletFriendlyName","id","fallback","lower","renderWalletSelectorModal","opts","wallets","onSelect","onClose","isConnecting","normalizedWallets","w","displayName","mainButton","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayPremiumContent","LitElement","raw","saved","_cfg1","resolveDerivationOrigin","pnp","changed","action","ledgers","createSdk","ledger","error","_cfg2","availableWallets","sdk","canisterId","o","resp","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","event","eventId","orderId","sessionId","paymentIntentId","errorMessage","handleComplete","symbol","w","walletId","result","idl","html","wallets","renderWalletSelectorModal","amt","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayTipJar","LitElement","raw","saved","_cfg1","resolveDerivationOrigin","pnp","changed","action","ledgers","createSdk","ledger","error","v","s","_cfg2","availableWallets","sdk","canisterId","o","resp","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","event","eventId","orderId","sessionId","paymentIntentId","errorMessage","handleComplete","w","walletId","result","idl","html","hasMultiple","rawMode","globalMode","showSelector","tokenSelectorMode","a","e","wallets","renderWalletSelectorModal","amt","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayArticlePaywall","LitElement","raw","saved","_cfg1","resolveDerivationOrigin","pnp","event","eventId","orderId","sdk","createSdk","canisterId","o","resp","sessionId","paymentIntentId","errorMessage","handleComplete","changed","action","ledgers","ledger","error","s","_cfg2","availableWallets","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","w","walletId","result","idl","html","wallets","renderWalletSelectorModal","amt","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayCoffeeShop","LitElement","changed","action","ledgers","createSdk","ledger","error","i","s","_cfg","resolveDerivationOrigin","availableWallets","sdk","canisterId","o","resp","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","event","eventId","orderId","sessionId","paymentIntentId","errorMessage","handleComplete","w","walletId","result","idl","html","it","wallets","renderWalletSelectorModal","amt","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayDonationThermometer","LitElement","raw","saved","_cfg1","resolveDerivationOrigin","pnp","changed","action","ledgers","createSdk","ledger","error","v","s","goal","denom","_cfg2","availableWallets","sdk","canisterId","o","resp","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","event","eventId","orderId","sessionId","paymentIntentId","errorMessage","handleComplete","w","walletId","result","idl","html","a","wallets","renderWalletSelectorModal","amt","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayPayButton","LitElement","createSdk","changed","action","ledgers","ledger","error","symbol","_cfg","resolveDerivationOrigin","availableWallets","w","walletId","result","canisterId","idl","wallets","onrampEnabled","minOnramp","amountUsd","showTooltip","diff","tooltip","renderWalletSelectorModal","sdk","o","resp","sessionId","errorMessage","paymentIntentId","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","event","eventId","orderId","handleComplete","listener","e","meta","html","hasMultiple","rawMode","globalMode","showSelector","tokenSelectorMode","selectedSymbol","amountPart","label","showProgressBar","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement","LitElement","html","css","customElement","property","state","isBrowser","PlugNPlay","debugLog","debug","message","data","ICPayAmountInput","LitElement","changed","action","ledgers","createSdk","ledger","error","step","value","rounded","symbol","min","max","_cfg","resolveDerivationOrigin","w","walletId","result","canisterId","idl","event","eventId","orderId","sdk","o","amountUsd","resp","sessionId","paymentIntentId","errorMessage","handleComplete","meta","handleWidgetError","shouldShowErrorToUser","getErrorMessage","getErrorSeverity","getErrorAction","html","placeholder","payLabel","selectedLabel","mode","rawMode","globalMode","hasMultiple","showSelector","tokenSelectorMode","showProgressBar","e","wallets","renderWalletSelectorModal","amt","renderTransakOnrampModal","baseStyles","css","__decorateClass","property","state","customElement"]}