const React = window.React; const { useState, useEffect, useRef } = React; const PaymentModal = ({ isOpen, onClose, sessionManager, onSessionPurchased }) => { const [step, setStep] = React.useState('select'); const [selectedType, setSelectedType] = React.useState(null); const [invoice, setInvoice] = React.useState(null); const [paymentStatus, setPaymentStatus] = React.useState('pending'); const [error, setError] = React.useState(''); const [paymentMethod, setPaymentMethod] = React.useState('webln'); const [preimageInput, setPreimageInput] = React.useState(''); const [isProcessing, setIsProcessing] = React.useState(false); const [qrCodeUrl, setQrCodeUrl] = React.useState(''); const [paymentTimer, setPaymentTimer] = React.useState(null); const [timeLeft, setTimeLeft] = React.useState(0); const [showSecurityDetails, setShowSecurityDetails] = React.useState(false); const pollInterval = React.useRef(null); React.useEffect(() => { if (!isOpen) { resetModal(); if (pollInterval.current) { clearInterval(pollInterval.current); } if (paymentTimer) { clearInterval(paymentTimer); } } }, [isOpen]); const resetModal = () => { setStep('select'); setSelectedType(null); setInvoice(null); setPaymentStatus('pending'); setError(''); setPaymentMethod('webln'); setPreimageInput(''); setIsProcessing(false); setQrCodeUrl(''); setTimeLeft(0); setShowSecurityDetails(false); }; const getSecurityFeaturesInfo = (sessionType) => { const features = { demo: { title: 'Demo Session - Basic Security', description: 'Limited testing session with basic security features', available: [ '🔐 Basic end-to-end encryption (AES-GCM 256)', '🔑 Simple key exchange (ECDH P-384)', '✅ Message integrity verification', '⚡ Rate limiting protection' ], unavailable: [ '🔐 ECDSA Digital Signatures', '🛡️ Metadata Protection', '🔄 Perfect Forward Secrecy', '🔐 Nested Encryption', '📦 Packet Padding', '🎭 Traffic Obfuscation', '🎪 Fake Traffic Generation', '🕵️ Decoy Channels', '🚫 Anti-Fingerprinting', '📝 Message Chunking', '🔄 Advanced Replay Protection' ], upgrade: { next: 'Basic Session (5,000 sat - $2.00)', features: [ '🔐 ECDSA Digital Signatures', '🛡️ Metadata Protection', '🔄 Perfect Forward Secrecy', '🔐 Nested Encryption', '📦 Packet Padding' ] } }, basic: { title: 'Basic Session - Enhanced Security', description: 'Full featured session with enhanced security features', available: [ '🔐 Basic end-to-end encryption (AES-GCM 256)', '🔑 Simple key exchange (ECDH P-384)', '✅ Message integrity verification', '⚡ Rate limiting protection', '🔐 ECDSA Digital Signatures', '🛡️ Metadata Protection', '🔄 Perfect Forward Secrecy', '🔐 Nested Encryption', '📦 Packet Padding', '🔒 Complete ASN.1 validation', '🔍 OID and EC point verification', '🏗️ SPKI structure validation', '🛡️ 18-layer security architecture' ], unavailable: [ '🎭 Traffic Obfuscation', '🎪 Fake Traffic Generation', '🕵️ Decoy Channels', '🚫 Anti-Fingerprinting', '📝 Message Chunking', '🔄 Advanced Replay Protection' ], upgrade: { next: 'Premium Session (20,000 sat - $8.00)', features: [ '🎭 Traffic Obfuscation', '🎪 Fake Traffic Generation', '🕵️ Decoy Channels', '🚫 Anti-Fingerprinting', '📝 Message Chunking', '🔄 Advanced Replay Protection' ] } }, premium: { title: 'Premium Session - Maximum Security', description: 'Extended session with maximum security protection', available: [ '🔐 Basic end-to-end encryption (AES-GCM 256)', '🔑 Simple key exchange (ECDH P-384)', '✅ Message integrity verification', '⚡ Rate limiting protection', '🔐 ECDSA Digital Signatures', '🛡️ Metadata Protection', '🔄 Perfect Forward Secrecy', '🔐 Nested Encryption', '📦 Packet Padding', '🎭 Traffic Obfuscation', '🎪 Fake Traffic Generation', '🕵️ Decoy Channels', '🚫 Anti-Fingerprinting', '📝 Message Chunking', '🔄 Advanced Replay Protection', '🔒 Complete ASN.1 validation', '🔍 OID and EC point verification', '🏗️ SPKI structure validation', '🛡️ 18-layer security architecture', '🚀 ASN.1 Validated' ], unavailable: [], upgrade: { next: 'Maximum security achieved!', features: ['🎉 All security features unlocked!'] } } }; return features[sessionType] || features.demo; }; const handleSelectType = async (type) => { setSelectedType(type); setError(''); if (type === 'demo') { try { if (!sessionManager || !sessionManager.createDemoSession) { throw new Error('Demo session manager not available'); } const demoSession = sessionManager.createDemoSession(); if (!demoSession.success) { throw new Error(demoSession.reason); } setInvoice({ sessionType: 'demo', amount: 0, paymentHash: demoSession.paymentHash, memo: `Demo session (${demoSession.durationMinutes} minutes)`, createdAt: Date.now(), isDemo: true, preimage: demoSession.preimage, warning: demoSession.warning, securityLevel: 'Basic' }); setPaymentStatus('demo'); } catch (error) { setError(`Demo session creation failed: ${error.message}`); return; } } else { await createRealInvoice(type); } setStep('payment'); }; const createRealInvoice = async (type) => { setPaymentStatus('creating'); setIsProcessing(true); setError(''); try { console.log(`Creating Lightning invoice for ${type} session...`); if (!sessionManager) { throw new Error('Session manager not initialized'); } const createdInvoice = await sessionManager.createLightningInvoice(type); if (!createdInvoice || !createdInvoice.paymentRequest) { throw new Error('Failed to create Lightning invoice'); } createdInvoice.securityLevel = sessionManager.getSecurityLevelForSession(type); setInvoice(createdInvoice); setPaymentStatus('created'); const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(createdInvoice.paymentRequest)}`; setQrCodeUrl(qrUrl); const expirationTime = 15 * 60 * 1000; setTimeLeft(expirationTime); const timer = setInterval(() => { setTimeLeft(prev => { const newTime = prev - 1000; if (newTime <= 0) { clearInterval(timer); setPaymentStatus('expired'); setError('Payment time has expired. Create a new invoice.'); return 0; } return newTime; }); }, 1000); setPaymentTimer(timer); startPaymentPolling(createdInvoice.checkingId); console.log('✅ Lightning invoice created successfully:', createdInvoice); } catch (err) { console.error('❌ Invoice creation failed:', err); setError(`Invoice creation error: ${err.message}`); setPaymentStatus('failed'); } finally { setIsProcessing(false); } }; const startPaymentPolling = (checkingId) => { if (pollInterval.current) { clearInterval(pollInterval.current); } pollInterval.current = setInterval(async () => { try { const status = await sessionManager.checkPaymentStatus(checkingId); if (status.paid && status.preimage) { clearInterval(pollInterval.current); setPaymentStatus('paid'); await handlePaymentSuccess(status.preimage); } } catch (error) { console.warn('Payment status check failed:', error); } }, 3000); }; const handleWebLNPayment = async () => { if (!window.webln) { setError('WebLN is not supported. Please install the Alby or Zeus wallet.'); return; } if (!invoice || !invoice.paymentRequest) { setError('Invoice is not ready for payment.'); return; } setIsProcessing(true); setError(''); setPaymentStatus('paying'); try { await window.webln.enable(); const result = await window.webln.sendPayment(invoice.paymentRequest); if (result.preimage) { setPaymentStatus('paid'); await handlePaymentSuccess(result.preimage); } else { throw new Error('Payment does not contain preimage'); } } catch (err) { console.error('❌ WebLN payment failed:', err); setError(`WebLN payment error: ${err.message}`); setPaymentStatus('created'); } finally { setIsProcessing(false); } }; const handleManualVerification = async () => { const trimmedPreimage = preimageInput.trim(); if (!trimmedPreimage) { setError('Enter payment preimage'); return; } if (trimmedPreimage.length !== 64) { setError('The preimage must be exactly 64 characters long.'); return; } if (!/^[0-9a-fA-F]{64}$/.test(trimmedPreimage)) { setError('The preimage must contain only hexadecimal characters (0-9, a-f, A-F).'); return; } const dummyPreimages = ['1'.repeat(64), 'a'.repeat(64), 'f'.repeat(64), '0'.repeat(64)]; if (dummyPreimages.includes(trimmedPreimage) && selectedType !== 'demo') { setError('The entered preimage is invalid. Please use the actual preimage from the payment.'); return; } setIsProcessing(true); setError(''); setPaymentStatus('paying'); try { await handlePaymentSuccess(trimmedPreimage); } catch (err) { setError(err.message); setPaymentStatus('created'); } finally { setIsProcessing(false); } }; const handleDemoSession = async () => { setIsProcessing(true); setError(''); try { if (!invoice?.preimage) { throw new Error('Demo preimage not available'); } const isValid = await sessionManager.verifyPayment(invoice.preimage, invoice.paymentHash); if (isValid && isValid.verified) { onSessionPurchased({ type: 'demo', preimage: invoice.preimage, paymentHash: invoice.paymentHash, amount: 0, isDemo: true, warning: invoice.warning, securityLevel: 'basic' }); setTimeout(() => { onClose(); }, 1500); } else { throw new Error(isValid?.reason || 'Demo session verification failed'); } } catch (err) { setError(`Demo session activation error: ${err.message}`); } finally { setIsProcessing(false); } }; const handlePaymentSuccess = async (preimage) => { try { console.log('🔍 Verifying payment...', { selectedType, preimage }); let isValid; if (selectedType === 'demo') { return; } else { isValid = await sessionManager.verifyPayment(preimage, invoice.paymentHash); } if (isValid) { if (pollInterval.current) { clearInterval(pollInterval.current); } if (paymentTimer) { clearInterval(paymentTimer); } onSessionPurchased({ type: selectedType, preimage, paymentHash: invoice.paymentHash, amount: invoice.amount, securityLevel: invoice.securityLevel || (selectedType === 'basic' ? 'enhanced' : 'maximum') }); setTimeout(() => { onClose(); }, 1500); } else { throw new Error('Payment verification failed. Please check the preimage for correctness or try again.'); } } catch (error) { console.error('❌ Payment verification failed:', error); throw error; } }; const copyToClipboard = async (text) => { try { await navigator.clipboard.writeText(text); } catch (err) { console.error('Failed to copy:', err); } }; const formatTime = (ms) => { const minutes = Math.floor(ms / 60000); const seconds = Math.floor((ms % 60000) / 1000); return `${minutes}:${seconds.toString().padStart(2, '0')}`; }; const getSecurityBadgeColor = (level) => { switch (level?.toLowerCase()) { case 'basic': return 'bg-blue-500/20 text-blue-300 border-blue-500/30'; case 'enhanced': return 'bg-orange-500/20 text-orange-300 border-orange-500/30'; case 'maximum': return 'bg-green-500/20 text-green-300 border-green-500/30'; default: return 'bg-gray-500/20 text-gray-300 border-gray-500/30'; } }; const pricing = sessionManager?.sessionPrices || { demo: { sats: 0, hours: 0.1, usd: 0.00 }, basic: { sats: 5000, hours: 1, usd: 2.00 }, premium: { sats: 20000, hours: 6, usd: 8.00 } }; if (!isOpen) return null; return React.createElement('div', { className: 'fixed inset-0 bg-black/80 backdrop-blur-sm z-50 flex items-center justify-center p-4' }, [ React.createElement('div', { key: 'modal', className: 'card-minimal rounded-xl p-6 max-w-lg w-full max-h-[90vh] overflow-y-auto custom-scrollbar' }, [ React.createElement('div', { key: 'header', className: 'flex items-center justify-between mb-6' }, [ React.createElement('h2', { key: 'title', className: 'text-xl font-semibold text-primary' }, step === 'select' ? 'Select session type' : step === 'details' ? 'Security Features Details' : 'Session payment'), React.createElement('button', { key: 'close', onClick: onClose, className: 'text-gray-400 hover:text-white transition-colors' }, React.createElement('i', { className: 'fas fa-times' })) ]), step === 'select' && window.SessionTypeSelector && React.createElement(window.SessionTypeSelector, { key: 'selector', onSelectType: handleSelectType, onCancel: onClose, sessionManager: sessionManager }), step === 'payment' && React.createElement('div', { key: 'payment-step', className: 'space-y-6' }, [ React.createElement('div', { key: 'session-info', className: 'text-center p-4 bg-orange-500/10 border border-orange-500/20 rounded-lg' }, [ React.createElement('h3', { key: 'session-title', className: 'text-lg font-semibold text-orange-400 mb-2' }, [ `${selectedType.charAt(0).toUpperCase() + selectedType.slice(1)} session`, invoice?.securityLevel && React.createElement('span', { key: 'security-badge', className: `text-xs px-2 py-1 rounded-full border ${getSecurityBadgeColor(invoice.securityLevel)}` }, invoice.securityLevel.toUpperCase()) ]), React.createElement('div', { key: 'session-details', className: 'text-sm text-secondary' }, [ React.createElement('div', { key: 'amount' }, `${pricing[selectedType].sats} sat for ${pricing[selectedType].hours}h`), pricing[selectedType].usd > 0 && React.createElement('div', { key: 'usd', className: 'text-gray-400' }, `≈ ${pricing[selectedType].usd} USD`), React.createElement('button', { key: 'details-btn', onClick: () => setStep('details'), className: 'mt-2 text-xs text-blue-400 hover:text-blue-300 underline cursor-pointer' }, '📋 View Security Details') ]) ]), timeLeft > 0 && paymentStatus === 'created' && React.createElement('div', { key: 'timer', className: 'text-center p-3 bg-yellow-500/10 border border-yellow-500/20 rounded' }, [ React.createElement('div', { key: 'timer-text', className: 'text-yellow-400 font-medium' }, `⏱️ Time to pay: ${formatTime(timeLeft)}`) ]), paymentStatus === 'demo' && React.createElement('div', { key: 'demo-payment', className: 'space-y-4' }, [ React.createElement('div', { key: 'demo-info', className: 'p-4 bg-green-500/10 border border-green-500/20 rounded text-green-300 text-sm text-center' }, [ React.createElement('div', { key: 'demo-title', className: 'font-medium mb-1' }, '🎮 Demo Session Available'), React.createElement('div', { key: 'demo-details', className: 'text-xs' }, `Limited to ${invoice?.durationMinutes || 6} minutes for testing`) ]), invoice?.warning && React.createElement('div', { key: 'demo-warning', className: 'p-3 bg-yellow-500/10 border border-yellow-500/20 rounded text-yellow-300 text-xs text-center' }, invoice.warning), React.createElement('div', { key: 'demo-preimage', className: 'p-3 bg-gray-800/50 rounded border border-gray-600 text-xs font-mono text-gray-300' }, [ React.createElement('div', { key: 'preimage-label', className: 'text-gray-400 mb-1' }, 'Demo Preimage:'), React.createElement('div', { key: 'preimage-value', className: 'break-all' }, invoice?.preimage || 'Generating...') ]), React.createElement('button', { key: 'demo-btn', onClick: handleDemoSession, disabled: isProcessing, className: 'w-full bg-green-600 hover:bg-green-500 text-white py-3 px-4 rounded-lg font-medium disabled:opacity-50 disabled:cursor-not-allowed' }, [ React.createElement('i', { key: 'demo-icon', className: `fas ${isProcessing ? 'fa-spinner fa-spin' : 'fa-play'} mr-2` }), isProcessing ? 'Activating...' : 'Activate Demo Session' ]) ]), paymentStatus === 'creating' && React.createElement('div', { key: 'creating', className: 'text-center p-4' }, [ React.createElement('i', { className: 'fas fa-spinner fa-spin text-orange-400 text-2xl mb-2' }), React.createElement('div', { className: 'text-primary' }, 'Creating Lightning invoice...'), React.createElement('div', { className: 'text-secondary text-sm mt-1' }, 'Connecting to the Lightning Network...') ]), (paymentStatus === 'created' || paymentStatus === 'paying') && invoice && React.createElement('div', { key: 'payment-methods', className: 'space-y-6' }, [ qrCodeUrl && React.createElement('div', { key: 'qr-section', className: 'text-center' }, [ React.createElement('div', { key: 'qr-container', className: 'bg-white p-4 rounded-lg inline-block' }, [ React.createElement('img', { key: 'qr-img', src: qrCodeUrl, alt: 'Lightning Payment QR Code', className: 'w-48 h-48' }) ]), React.createElement('div', { key: 'qr-hint', className: 'text-xs text-gray-400 mt-2' }, 'Scan with any Lightning wallet') ]), invoice.paymentRequest && React.createElement('div', { key: 'payment-request', className: 'space-y-2' }, [ React.createElement('div', { key: 'pr-label', className: 'text-sm font-medium text-primary' }, 'Lightning Payment Request:'), React.createElement('div', { key: 'pr-container', className: 'p-3 bg-gray-800/50 rounded border border-gray-600 text-xs font-mono text-gray-300 cursor-pointer hover:bg-gray-700/50 transition-colors', onClick: () => copyToClipboard(invoice.paymentRequest), title: 'Click to copy' }, [ invoice.paymentRequest.substring(0, 60) + '...', React.createElement('i', { key: 'copy-icon', className: 'fas fa-copy ml-2 text-orange-400' }) ]) ]), // WebLN Payment React.createElement('div', { key: 'webln-section', className: 'space-y-3' }, [ React.createElement('h4', { key: 'webln-title', className: 'text-primary font-medium flex items-center' }, [ React.createElement('i', { key: 'bolt-icon', className: 'fas fa-bolt text-orange-400 mr-2' }), 'WebLN wallet (recommended)' ]), React.createElement('div', { key: 'webln-info', className: 'text-xs text-gray-400 mb-2' }, 'Alby, Zeus, or other WebLN-compatible wallets'), React.createElement('button', { key: 'webln-btn', onClick: handleWebLNPayment, disabled: isProcessing || paymentStatus === 'paying', className: 'w-full bg-orange-600 hover:bg-orange-500 text-white py-3 px-4 rounded-lg font-medium disabled:opacity-50 disabled:cursor-not-allowed transition-colors' }, [ React.createElement('i', { key: 'webln-icon', className: `fas ${isProcessing ? 'fa-spinner fa-spin' : 'fa-bolt'} mr-2` }), paymentStatus === 'paying' ? 'Processing payment...' : 'Pay via WebLN' ]) ]), // Divider React.createElement('div', { key: 'divider', className: 'text-center text-gray-400 text-sm' }, '— or —'), // Manual Verification React.createElement('div', { key: 'manual-section', className: 'space-y-3' }, [ React.createElement('h4', { key: 'manual-title', className: 'text-primary font-medium' }, 'Manual payment confirmation'), React.createElement('div', { key: 'manual-info', className: 'text-xs text-gray-400' }, 'Pay the invoice in any wallet and enter the preimage.:'), React.createElement('input', { key: 'preimage-input', type: 'text', value: preimageInput, onChange: (e) => setPreimageInput(e.target.value), placeholder: 'Enter the preimage (64 hex characters)...', className: 'w-full p-3 bg-gray-800 border border-gray-600 rounded text-white placeholder-gray-400 text-sm font-mono', maxLength: 64 }), React.createElement('button', { key: 'verify-btn', onClick: handleManualVerification, disabled: isProcessing || !preimageInput.trim(), className: 'w-full bg-green-600 hover:bg-green-500 text-white py-3 px-4 rounded-lg font-medium disabled:opacity-50 disabled:cursor-not-allowed transition-colors' }, [ React.createElement('i', { key: 'verify-icon', className: `fas ${isProcessing ? 'fa-spinner fa-spin' : 'fa-check'} mr-2` }), isProcessing ? 'Checking payment...' : 'Confirm payment' ]) ]) ]), // Success State paymentStatus === 'paid' && React.createElement('div', { key: 'success', className: 'text-center p-6 bg-green-500/10 border border-green-500/20 rounded-lg' }, [ React.createElement('i', { key: 'success-icon', className: 'fas fa-check-circle text-green-400 text-3xl mb-3' }), React.createElement('div', { key: 'success-title', className: 'text-green-300 font-semibold text-lg mb-1' }, '✅ Payment confirmed!'), React.createElement('div', { key: 'success-text', className: 'text-green-400 text-sm' }, 'The session will be activated upon connecting to the chat.') ]), // Error State error && React.createElement('div', { key: 'error', className: 'p-4 bg-red-500/10 border border-red-500/20 rounded-lg' }, [ React.createElement('div', { key: 'error-content', className: 'flex items-start space-x-3' }, [ React.createElement('i', { key: 'error-icon', className: 'fas fa-exclamation-triangle text-red-400 mt-0.5' }), React.createElement('div', { key: 'error-text', className: 'flex-1' }, [ React.createElement('div', { key: 'error-message', className: 'text-red-400 text-sm' }, error), (error.includes('invoice') || paymentStatus === 'failed') && React.createElement('button', { key: 'retry-btn', onClick: () => createRealInvoice(selectedType), className: 'mt-2 text-orange-400 hover:text-orange-300 underline text-sm' }, 'Create a new invoice') ]) ]) ]), paymentStatus !== 'paid' && React.createElement('div', { key: 'back-section', className: 'pt-4 border-t border-gray-600' }, [ React.createElement('button', { key: 'back-btn', onClick: () => setStep('select'), className: 'w-full bg-gray-600 hover:bg-gray-500 text-white py-2 px-4 rounded transition-colors' }, [ React.createElement('i', { key: 'back-icon', className: 'fas fa-arrow-left mr-2' }), 'Choose another session' ]) ]) ]), // Security Details Step step === 'details' && React.createElement('div', { key: 'details-step', className: 'space-y-6' }, [ React.createElement('div', { key: 'details-header', className: 'text-center p-4 bg-blue-500/10 border border-blue-500/20 rounded-lg' }, [ React.createElement('h3', { key: 'details-title', className: 'text-lg font-semibold text-blue-400 mb-2' }, getSecurityFeaturesInfo(selectedType).title), React.createElement('p', { key: 'details-description', className: 'text-sm text-blue-300' }, getSecurityFeaturesInfo(selectedType).description) ]), // Available Features React.createElement('div', { key: 'available-features' }, [ React.createElement('h4', { key: 'available-title', className: 'text-sm font-medium text-green-300 mb-3 flex items-center' }, [ React.createElement('i', { key: 'check-icon', className: 'fas fa-check-circle mr-2' }), 'Available Security Features' ]), React.createElement('div', { key: 'available-list', className: 'grid grid-cols-1 gap-2' }, getSecurityFeaturesInfo(selectedType).available.map((feature, index) => React.createElement('div', { key: index, className: 'flex items-center gap-2 text-sm text-green-300' }, [ React.createElement('i', { key: 'check', className: 'fas fa-check text-green-400 w-4' }), React.createElement('span', { key: 'text' }, feature) ]) )) ]), // Unavailable Features (if any) getSecurityFeaturesInfo(selectedType).unavailable.length > 0 && React.createElement('div', { key: 'unavailable-features' }, [ React.createElement('h4', { key: 'unavailable-title', className: 'text-sm font-medium text-red-300 mb-3 flex items-center' }, [ React.createElement('i', { key: 'minus-icon', className: 'fas fa-minus-circle mr-2' }), 'Not Available in This Session' ]), React.createElement('div', { key: 'unavailable-list', className: 'grid grid-cols-1 gap-2' }, getSecurityFeaturesInfo(selectedType).unavailable.map((feature, index) => React.createElement('div', { key: index, className: 'flex items-center gap-2 text-sm text-red-300' }, [ React.createElement('i', { key: 'minus', className: 'fas fa-minus text-red-400 w-4' }), React.createElement('span', { key: 'text' }, feature) ]) )) ]), // Upgrade Information React.createElement('div', { key: 'upgrade-info' }, [ React.createElement('h4', { key: 'upgrade-title', className: 'text-sm font-medium text-blue-300 mb-3 flex items-center' }, [ React.createElement('i', { key: 'upgrade-icon', className: 'fas fa-arrow-up mr-2' }), 'Upgrade for More Security' ]), React.createElement('div', { key: 'upgrade-content', className: 'p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg' }, [ React.createElement('div', { key: 'upgrade-next', className: 'text-sm font-medium text-blue-300 mb-2' }, getSecurityFeaturesInfo(selectedType).upgrade.next), React.createElement('div', { key: 'upgrade-features', className: 'grid grid-cols-1 gap-1' }, getSecurityFeaturesInfo(selectedType).upgrade.features.map((feature, index) => React.createElement('div', { key: index, className: 'flex items-center gap-2 text-xs text-blue-300' }, [ React.createElement('i', { key: 'arrow', className: 'fas fa-arrow-right text-blue-400 w-3' }), React.createElement('span', { key: 'text' }, feature) ]) )) ]) ]), // Back Button React.createElement('div', { key: 'details-back-section', className: 'pt-4 border-t border-gray-600' }, [ React.createElement('button', { key: 'details-back-btn', onClick: () => setStep('payment'), className: 'w-full bg-gray-600 hover:bg-gray-500 text-white py-2 px-4 rounded transition-colors' }, [ React.createElement('i', { key: 'back-icon', className: 'fas fa-arrow-left mr-2' }), 'Back to Payment' ]) ]) ]) ]) ]); }; window.PaymentModal = PaymentModal;