onairos 4.0.18 โ†’ 4.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"src_onairosButton_jsx.js","mappings":"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","sources":["webpack://OnairosLaravel/./src/components/DataRequest.js","webpack://OnairosLaravel/./src/components/EmailAuth.js","webpack://OnairosLaravel/./src/components/LoadingScreen.jsx","webpack://OnairosLaravel/./src/components/PinSetup.js","webpack://OnairosLaravel/./src/components/TrainingComponent.jsx","webpack://OnairosLaravel/./src/components/UniversalOnboarding.jsx","webpack://OnairosLaravel/./src/components/WelcomeScreen.jsx","webpack://OnairosLaravel/./src/components/ui/PageLayout.jsx","webpack://OnairosLaravel/./src/components/ui/PrimaryButton.jsx","webpack://OnairosLaravel/./src/onairosButton.jsx","webpack://OnairosLaravel/./src/theme/colors.js","webpack://OnairosLaravel/./src/utils/apiResponseLogger.js","webpack://OnairosLaravel/./src/utils/responseFormatter.js","webpack://OnairosLaravel/./src/utils/userDataFormatter.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport PrimaryButton from './ui/PrimaryButton.jsx';\nimport { COLORS } from '../theme/colors.js';\n\nconst dataTypes = [\n { \n id: 'basic', \n name: 'Basic Profile', \n description: 'Essential profile information, account details, and basic demographics', \n icon: 'User',\n required: true,\n tooltip: 'Includes name, email, basic profile information. This data is essential for personalization and is always included.',\n privacyLink: 'https://onairos.uk/privacy#basic-info'\n },\n { \n id: 'rawMemories', \n name: 'Raw Memory Data', \n description: 'LLM conversation history from ChatGPT, Claude, Gemini, and other AI platforms', \n icon: 'Memory',\n required: false,\n tooltip: 'Your conversation history with AI assistants. Provides rich contextual data about your preferences and communication patterns.',\n privacyLink: 'https://onairos.uk/privacy#raw-memories-data'\n },\n { \n id: 'preferences', \n name: 'User Preferences', \n description: 'User preferences, interests, settings and personal choices', \n icon: 'Grid3X3',\n required: false,\n tooltip: 'Your stated preferences and interests from connected platforms. Helps customize your experience.',\n privacyLink: 'https://onairos.uk/privacy#preferences-data'\n },\n { \n id: 'personality', \n name: 'Personality Traits', \n description: 'Personality traits, behavioral patterns and psychological insights', \n icon: 'Brain',\n required: false,\n tooltip: 'AI-analyzed personality traits based on your social media activity and interactions. Used to improve content recommendations.',\n privacyLink: 'https://onairos.uk/privacy#personality-data'\n }\n];\n\n// Data Type Toggle Component with compact checkbox design\nconst DataTypeToggle = ({ dataType, isEnabled, onToggle, isLast }) => {\n const handleToggle = () => {\n if (dataType.required) return; // Don't allow toggling required items\n onToggle(dataType.id, !isEnabled);\n };\n\n const getIconComponent = (iconName) => {\n const iconProps = { className: \"w-4 h-4 text-gray-700\" };\n \n switch (iconName) {\n case 'User':\n return (\n <svg {...iconProps} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/>\n </svg>\n );\n case 'Memory':\n return (\n <svg {...iconProps} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/>\n </svg>\n );\n case 'Grid3X3':\n return (\n <svg {...iconProps} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z\"/>\n </svg>\n );\n case 'Brain':\n return (\n <svg {...iconProps} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z\"/>\n </svg>\n );\n default:\n return <span className=\"text-lg\">{iconName}</span>;\n }\n };\n\n return (\n <div className=\"flex items-center justify-between p-2.5 rounded-lg bg-gray-50\">\n <div className=\"flex items-center gap-4\">\n <div className=\"w-8 h-8 bg-gray-200 rounded-full flex items-center justify-center flex-shrink-0\">\n {getIconComponent(dataType.icon)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <span className=\"font-medium text-gray-900 text-xs\">{dataType.name}</span>\n </div>\n </div>\n <div\n onClick={handleToggle}\n className={`w-5 h-5 rounded border-2 flex items-center justify-center cursor-pointer transition-colors flex-shrink-0 ${\n isEnabled ? \"bg-gray-900 border-gray-900\" : \"bg-white border-gray-300\"\n }`}\n >\n {isEnabled && (\n <svg className=\"w-3 h-3 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </div>\n </div>\n );\n};\n\nconst DataRequest = ({ \n userEmail = 'user@example.com', \n testMode = false, \n onComplete, \n autoFetch = true,\n appName = 'Test App',\n formatResponse = false,\n responseFormat = 'simple',\n rawMemoriesOnly = false,\n rawMemoriesConfig = null,\n requestData = null,\n connectedAccounts = {}\n}) => {\n // Initialize selectedData based on requestData and rawMemoriesOnly mode\n const getInitialSelectedData = () => {\n const initial = { basic: true }; // Basic is always included\n \n if (requestData && Array.isArray(requestData)) {\n // Set based on requestData array\n requestData.forEach(dataType => {\n if (dataType !== 'basic') { // basic is always true\n initial[dataType] = true;\n }\n });\n } else if (rawMemoriesOnly) {\n // RAW memories only mode\n initial.rawMemories = true;\n } else {\n // Default mode\n initial.personality = false;\n initial.preferences = false;\n initial.rawMemories = false;\n }\n \n return initial;\n };\n\n const [selectedData, setSelectedData] = useState(getInitialSelectedData());\n const [isLoadingApi, setIsLoadingApi] = useState(false);\n const [apiError, setApiError] = useState(null);\n\n const handleDataToggle = (dataId, enabled) => {\n const dataType = dataTypes.find(dt => dt.id === dataId);\n if (dataType?.required) return; // Don't allow toggling required items\n\n setSelectedData(prev => ({\n ...prev,\n [dataId]: enabled\n }));\n };\n\n const generateUserHash = (email) => {\n let hash = 0;\n const str = email + Date.now().toString();\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return `user_${Math.abs(hash).toString(36)}`;\n };\n\n const fetchUserData = async () => {\n console.log('๐Ÿ”ฅ DataRequest: fetchUserData called');\n console.log('๐Ÿ”ฅ DataRequest: onComplete function:', typeof onComplete);\n console.log('๐Ÿ”ฅ DataRequest: selectedData:', selectedData);\n console.log('๐Ÿ”ฅ DataRequest: selectedCount:', selectedCount);\n \n setIsLoadingApi(true);\n setApiError(null);\n \n try {\n const userHash = generateUserHash(userEmail);\n \n // Get selected data types\n const approvedData = Object.entries(selectedData)\n .filter(([key, value]) => value)\n .map(([key]) => key);\n\n const mapDataTypesToConfirmations = (approvedData) => {\n const confirmations = [];\n const currentDate = new Date().toISOString();\n \n const dataTypeMapping = {\n 'basic': 'Medium',\n 'personality': 'Large', \n 'preferences': 'Traits'\n };\n \n approvedData.forEach(dataType => {\n if (dataTypeMapping[dataType]) {\n confirmations.push({\n data: dataTypeMapping[dataType],\n date: currentDate\n });\n }\n });\n \n return confirmations;\n };\n\n const apiEndpoint = testMode \n ? 'https://api2.onairos.uk/inferenceTest'\n : 'https://api2.onairos.uk/getAPIurlMobile';\n \n const baseResult = {\n userHash,\n appName,\n approvedData,\n apiUrl: apiEndpoint,\n testMode,\n timestamp: new Date().toISOString()\n };\n\n if (autoFetch) {\n if (testMode) {\n // Test mode: Skip API call completely, simulate response\n console.log('๐Ÿงช Test mode: Simulating data request API call for:', approvedData);\n \n setTimeout(() => {\n const simulatedApiData = {\n InferenceResult: {\n output: Array.from({ length: 16 }, () => [Math.random()]),\n traits: {\n personality_traits: {\n positive_traits: {\n creativity: 85.5,\n empathy: 78.2,\n leadership: 72.8,\n analytical_thinking: 88.9,\n communication: 81.3\n },\n traits_to_improve: {\n patience: 45.2,\n time_management: 52.7,\n delegation: 38.9\n }\n }\n }\n },\n persona: {\n id: 1,\n name: \"Test Persona\",\n description: \"Simulated persona for testing\"\n },\n inference_metadata: {\n size_used: \"Large\",\n total_outputs: 16,\n persona_applied: \"Test Persona\"\n }\n };\n\n // Log detailed test mode response with explanations\n const { logOnairosResponse } = require('../utils/apiResponseLogger');\n console.log('๐Ÿงช Test Mode: Simulated API Response');\n logOnairosResponse(simulatedApiData, 'TEST_MODE', { \n detailed: true, \n showRawData: false \n });\n\n const result = {\n ...baseResult,\n apiResponse: simulatedApiData,\n success: true,\n simulated: true\n };\n\n setIsLoadingApi(false);\n console.log('๐Ÿงช Test mode: Simulated data request completed');\n console.log('๐Ÿ”ฅ DataRequest: onComplete function type:', typeof onComplete);\n if (onComplete && typeof onComplete === 'function') {\n onComplete(result);\n console.log('๐Ÿ”ฅ DataRequest: onComplete called successfully (test mode)');\n } else {\n console.error('๐Ÿ”ฅ DataRequest: onComplete is not a function or is undefined (test mode)');\n }\n }, 1200); // Simulate realistic processing time\n } else {\n // Production mode: Make real API call\n try {\n const confirmations = mapDataTypesToConfirmations(approvedData);\n \n const requestBody = {\n Info: {\n storage: \"local\",\n appId: appName,\n account: userEmail,\n confirmations: confirmations,\n EncryptedUserPin: \"pending_pin_integration\",\n proofMode: false,\n Domain: window.location.hostname,\n web3Type: \"standard\"\n }\n };\n\n console.log('๐Ÿ”ฅ DataRequest: Making API call to:', apiEndpoint);\n console.log('๐Ÿ”ฅ Request body:', requestBody);\n\n const apiResponse = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody)\n });\n\n if (!apiResponse.ok) {\n throw new Error(`API request failed with status ${apiResponse.status}`);\n }\n\n const apiData = await apiResponse.json();\n \n // Log detailed API response with explanations\n const { logOnairosResponse } = require('../utils/apiResponseLogger');\n console.log('๐Ÿ”ฅ Raw API Response received from backend');\n logOnairosResponse(apiData, apiEndpoint, { \n detailed: true, \n showRawData: false // Set to true to see raw JSON\n });\n\n const result = {\n ...baseResult,\n apiResponse: apiData,\n success: true\n };\n\n setIsLoadingApi(false);\n console.log('๐Ÿ”ฅ DataRequest: Calling onComplete with result:', result);\n console.log('๐Ÿ”ฅ DataRequest: onComplete function type:', typeof onComplete);\n if (onComplete && typeof onComplete === 'function') {\n onComplete(result);\n console.log('๐Ÿ”ฅ DataRequest: onComplete called successfully');\n } else {\n console.error('๐Ÿ”ฅ DataRequest: onComplete is not a function or is undefined');\n }\n\n } catch (apiError) {\n console.error('๐Ÿ”ฅ API Error:', apiError);\n setApiError(apiError.message);\n setIsLoadingApi(false);\n \n const errorResult = {\n ...baseResult,\n apiResponse: null,\n error: apiError.message,\n success: false\n };\n \n onComplete(errorResult);\n }\n }\n } else {\n setIsLoadingApi(false);\n console.log('๐Ÿ”ฅ DataRequest: Auto-fetch disabled, calling onComplete with base result');\n console.log('๐Ÿ”ฅ DataRequest: onComplete function type:', typeof onComplete);\n if (onComplete && typeof onComplete === 'function') {\n onComplete(baseResult);\n console.log('๐Ÿ”ฅ DataRequest: onComplete called successfully (auto-fetch disabled)');\n } else {\n console.error('๐Ÿ”ฅ DataRequest: onComplete is not a function or is undefined (auto-fetch disabled)');\n }\n }\n } catch (error) {\n console.error('๐Ÿ”ฅ DataRequest Error:', error);\n setApiError(error.message);\n setIsLoadingApi(false);\n \n if (onComplete) {\n onComplete({\n error: error.message,\n success: false,\n userEmail,\n appName,\n testMode\n });\n }\n }\n };\n\n // Count selected data types\n const selectedCount = Object.values(selectedData).filter(Boolean).length;\n\n // Connected platforms - handle both object and array formats\n const getConnectedPlatforms = () => {\n if (!connectedAccounts) {\n console.log('๐Ÿ” No connectedAccounts prop');\n return [];\n }\n \n console.log('๐Ÿ” DataRequest connectedAccounts:', connectedAccounts);\n console.log('๐Ÿ” Type:', typeof connectedAccounts, 'Is Array:', Array.isArray(connectedAccounts));\n \n // If it's already an array, use it directly\n if (Array.isArray(connectedAccounts)) {\n console.log('๐Ÿ” Returning array as-is:', connectedAccounts);\n return connectedAccounts;\n }\n \n // If it's an object, extract the keys (platform names)\n const platforms = Object.entries(connectedAccounts)\n .filter(([_, v]) => Boolean(v)) // Handle truthy values\n .map(([k]) => k);\n console.log('๐Ÿ” Extracted platforms from object:', platforms);\n return platforms;\n };\n \n const connectedPlatforms = getConnectedPlatforms();\n console.log('๐Ÿ” Final connectedPlatforms:', connectedPlatforms, 'Length:', connectedPlatforms.length);\n \n const getPlatformEmoji = (name) => {\n const emojiMap = {\n Instagram: '๐Ÿ“ท', YouTube: 'โ–ถ๏ธ', LinkedIn: '๐Ÿ’ผ', Reddit: '๐Ÿค–',\n Pinterest: '๐Ÿ“Œ', GitHub: '๐Ÿ’ป', Facebook: '๐Ÿ‘ฅ', Gmail: '๐Ÿ“ง',\n Twitter: '๐Ÿฆ', ChatGPT: '๐Ÿค–', Claude: '๐Ÿง ', Gemini: 'โœจ', Grok: 'โšก'\n };\n return emojiMap[name] || '๐Ÿ”—';\n };\n\n return (\n <div className=\"flex flex-col h-full max-h-[90vh] overflow-hidden\">\n {/* Scrollable main content */}\n <div className=\"flex-1 overflow-y-auto px-6 pt-16 pb-4\">\n {/* Icon Flow */}\n <div className=\"mb-4 flex justify-center items-center gap-4 flex-shrink-0\">\n <div className=\"w-12 h-12 bg-white rounded-xl shadow-lg flex items-center justify-center border border-gray-100\">\n <svg className=\"w-6 h-6\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 2C13.1 2 14 2.9 14 4C14 5.1 13.1 6 12 6C10.9 6 10 5.1 10 4C10 2.9 10.9 2 12 2Z\"\n fill=\"black\"\n />\n <path\n d=\"M21 9V7L15 6.5V9C15 10.66 13.66 12 12 12C10.34 12 9 10.66 9 9V6.5L3 7V9C3 12.87 6.13 16 10 16V22H14V16C17.87 16 21 12.87 21 9Z\"\n fill=\"black\"\n />\n </svg>\n </div>\n <svg className=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <div className=\"w-12 h-12 bg-white rounded-xl shadow-lg flex items-center justify-center border border-gray-100\">\n <span className=\"text-xl font-serif font-bold text-black\">B</span>\n </div>\n </div>\n\n {/* Title Section */}\n <div className=\"mb-4 flex-shrink-0 text-center\">\n <h1 className=\"text-xl font-bold text-gray-900 mb-2 text-balance leading-tight\">\n {appName} wants to personalize your experience\n </h1>\n <p className=\"text-gray-600 text-sm\">Choose what to share:</p>\n </div>\n\n {/* Consent Options */}\n <div className=\"space-y-4\">\n {dataTypes\n .filter(dataType => {\n if (rawMemoriesOnly) {\n // In RAW memories only mode, show only basic and rawMemories\n return dataType.id === 'basic' || dataType.id === 'rawMemories';\n }\n // In normal mode, show all data types\n return true;\n })\n .map((dataType, index) => (\n <DataTypeToggle\n key={dataType.id}\n dataType={dataType}\n isEnabled={selectedData[dataType.id]}\n onToggle={handleDataToggle}\n isLast={index === dataTypes.length - 1}\n />\n ))}\n </div>\n </div>\n\n {/* Connected platforms line - Fixed above buttons */}\n {connectedPlatforms.length > 0 ? (\n <div className=\"px-6 py-3 text-center bg-gray-50 border-t border-gray-200 flex-shrink-0\">\n <div className=\"text-xs text-gray-500 mb-1\">Connected Platforms</div>\n <div className=\"flex justify-center items-center gap-2 flex-wrap\">\n {connectedPlatforms.map((platform, index) => {\n const logoMap = {\n Instagram: 'https://upload.wikimedia.org/wikipedia/commons/a/a5/Instagram_icon.png',\n YouTube: 'https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg',\n LinkedIn: 'https://upload.wikimedia.org/wikipedia/commons/c/ca/LinkedIn_logo_initials.png',\n Reddit: 'https://www.redditinc.com/assets/images/site/reddit-logo.png',\n Pinterest: 'https://upload.wikimedia.org/wikipedia/commons/0/08/Pinterest-logo.png',\n GitHub: 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png',\n Facebook: 'https://upload.wikimedia.org/wikipedia/commons/5/51/Facebook_f_logo_%282019%29.svg',\n Gmail: 'https://upload.wikimedia.org/wikipedia/commons/7/7e/Gmail_icon_%282020%29.svg',\n Twitter: 'https://upload.wikimedia.org/wikipedia/commons/6/6f/Logo_of_Twitter.svg',\n ChatGPT: 'https://anushkasirv.sirv.com/openai.png',\n Claude: 'https://anushkasirv.sirv.com/claude-color.png',\n Gemini: 'https://anushkasirv.sirv.com/gemini-color.png',\n Grok: 'https://anushkasirv.sirv.com/grok.png'\n };\n const imageSrc = logoMap[platform] || '';\n console.log(`๐Ÿ” Rendering platform ${index}: ${platform}, src: ${imageSrc}`);\n return (\n <img \n key={`${platform}-${index}`} \n src={imageSrc} \n alt={platform}\n title={platform}\n className=\"w-6 h-6 object-contain\"\n onError={(e) => { \n console.warn(`Failed to load image for ${platform} from ${imageSrc}`);\n e.target.style.display = 'none'; \n }}\n />\n );\n })}\n </div>\n </div>\n ) : null}\n\n {/* Fixed footer with buttons */}\n <div className=\"px-6 py-4 bg-white border-t border-gray-200 flex flex-col gap-2 shrink-0\">\n <button\n onClick={fetchUserData}\n disabled={isLoadingApi || selectedCount === 0}\n className=\"w-full rounded-full py-3 bg-gray-900 text-white text-sm font-medium hover:bg-gray-800 transition disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {isLoadingApi ? \"Processing...\" : \"Accept & Continue\"}\n {!isLoadingApi && (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n <button\n onClick={() => onComplete({ cancelled: true })}\n className=\"w-full rounded-full py-3 bg-gray-200 text-gray-700 text-sm font-medium hover:bg-gray-300 transition\"\n >\n Decline\n </button>\n\n {/* Error display */}\n {apiError && (\n <div className=\"mt-2 p-3 rounded-lg text-center bg-red-50 border border-red-200 text-red-600\">\n <p className=\"text-xs\">{apiError}</p>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default DataRequest; ","import React, { useState, useEffect } from 'react';\nimport { Mail, ArrowRight, Check } from 'lucide-react';\nimport PrimaryButton from './ui/PrimaryButton.jsx';\nimport { COLORS } from '../theme/colors.js';\n\nexport default function EmailAuth({ onSuccess, testMode = true }) {\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [step, setStep] = useState('email'); // 'email' | 'code' | 'success'\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n // Auto-focus first PIN input when code step loads\n useEffect(() => {\n if (step === 'code') {\n // Small delay to ensure DOM is ready\n setTimeout(() => {\n const firstInput = document.querySelector('input[maxLength=\"1\"]');\n if (firstInput) {\n firstInput.focus();\n }\n }, 100);\n }\n }, [step]);\n\n const validateEmail = (email) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n };\n\n const handleEmailSubmit = async (e) => {\n e.preventDefault();\n setError('');\n\n if (!validateEmail(email)) {\n setError('Please enter a valid email address');\n return;\n }\n\n setIsLoading(true);\n\n try {\n if (testMode) {\n // Test mode: Skip API call completely, simulate instant success\n console.log('๐Ÿงช Test mode: Simulating email verification request for:', email);\n setTimeout(() => {\n setStep('code');\n setIsLoading(false);\n console.log('๐Ÿงช Test mode: Email verification simulated successfully');\n }, 800); // Shorter delay for faster testing\n } else {\n // Production mode: Use proper email verification API from schema\n const baseUrl = (typeof window !== 'undefined' && window.onairosBaseUrl) || 'https://api2.onairos.uk';\n const apiKey = (typeof window !== 'undefined' && window.onairosApiKey) || 'ona_VvoHNg1fdCCUa9eBy4Iz3IfvXdgLfMFI7TNcyHLDKEadPogkbjAeE2iDOs6M7Aey';\n \n const response = await fetch(`${baseUrl}/email/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify({\n email: (email || '').trim().toLowerCase()\n }),\n });\n\n if (!response.ok) {\n throw new Error('Failed to send verification code');\n }\n\n const data = await response.json();\n if (!data.success) {\n throw new Error(data.error || 'Failed to send verification code');\n }\n\n console.log('๐Ÿ“ง Email request response:', data);\n\n setStep('code');\n setIsLoading(false);\n }\n } catch (error) {\n console.error('Email request error:', error);\n setError(error.message);\n setIsLoading(false);\n }\n };\n\n const handleGoogleAuth = async () => {\n try {\n // Use the same Google OAuth logic as UniversalOnboarding\n const sdkConfig = {\n baseUrl: 'https://api2.onairos.uk',\n apiKey: window.onairosApiKey || 'test-key',\n enableHealthMonitoring: true,\n enableAutoRefresh: true,\n enableConnectionValidation: true\n };\n\n const username = localStorage.getItem('username') || localStorage.getItem('onairosUser')?.email || 'user@example.com';\n \n const authorizeUrl = `${sdkConfig.baseUrl}/gmail/authorize`;\n const params = new URLSearchParams({\n username: username,\n sdk_type: 'web',\n return_url: window.location.origin + '/oauth-callback.html'\n });\n\n const fullUrl = `${authorizeUrl}?${params.toString()}`;\n console.log('๐Ÿ”— Starting Google OAuth from email flow...');\n console.log('๐Ÿ“‹ Google OAuth URL:', fullUrl);\n\n // Open popup for OAuth\n const popup = window.open(\n fullUrl,\n 'google_oauth',\n 'width=500,height=600,scrollbars=yes,resizable=yes'\n );\n\n if (!popup) {\n throw new Error('Popup blocked. Please allow popups for this site.');\n }\n\n // Monitor popup for completion\n const checkInterval = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkInterval);\n console.log('โœ… Google OAuth popup closed');\n // Simulate successful OAuth for now\n onSuccess({ \n email: 'user@gmail.com', \n method: 'google',\n connectedAccounts: { Google: true }\n });\n }\n }, 1000);\n\n } catch (error) {\n console.error('โŒ Google OAuth failed:', error);\n setError('Google authentication failed. Please try again.');\n }\n };\n\n const handleCodeSubmit = async (e) => {\n e.preventDefault();\n setError('');\n setIsLoading(true);\n\n try {\n if (testMode) {\n // Test mode: Skip API call completely, simulate verification\n console.log('๐Ÿงช Test mode: Simulating code verification for:', email, 'with code:', code);\n \n if (code === '123456' || code.length === 6) {\n setStep('success');\n setTimeout(() => {\n // Simulate new user for design testing\n const simulatedResponse = { \n email, \n verified: true, \n token: 'test-token-' + Date.now(),\n userName: email.split('@')[0],\n existingUser: false, // Always simulate new user for full flow testing\n accountInfo: null,\n isNewUser: true,\n flowType: 'onboarding',\n adminMode: false,\n userCreated: true,\n accountDetails: {\n email: email,\n createdAt: new Date().toISOString(),\n testAccount: true\n }\n };\n console.log('๐Ÿงช Test mode: Simulated verification successful, user data:', simulatedResponse);\n onSuccess(simulatedResponse);\n }, 600); // Faster for design testing\n } else {\n setError('Invalid code. Use any 6-digit code (e.g., 123456) for testing.');\n setIsLoading(false);\n }\n } else {\n // Production mode: Use real email verification API from schema\n const baseUrl = (typeof window !== 'undefined' && window.onairosBaseUrl) || 'https://api2.onairos.uk';\n const apiKey = (typeof window !== 'undefined' && window.onairosApiKey) || 'ona_VvoHNg1fdCCUa9eBy4Iz3IfvXdgLfMFI7TNcyHLDKEadPogkbjAeE2iDOs6M7Aey';\n \n const response = await fetch(`${baseUrl}/email/verify/confirm`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify({\n email: (email || '').trim().toLowerCase(),\n code: code.trim()\n }),\n });\n\n if (!response.ok) {\n throw new Error('Invalid verification code');\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || 'Verification failed');\n }\n\n console.log('๐Ÿ“ง Email verification response:', data);\n\n setStep('success');\n setTimeout(() => {\n // Pass complete API response for flow determination\n onSuccess({ \n email, \n verified: true, \n token: data.token || data.jwtToken,\n userName: data.userName,\n existingUser: data.existingUser,\n accountInfo: data.accountInfo,\n isNewUser: !data.existingUser, // Set based on API response\n flowType: data.existingUser ? 'dataRequest' : 'onboarding',\n adminMode: data.adminMode,\n userCreated: data.userCreated,\n accountDetails: data.accountDetails\n });\n }, 1000);\n }\n } catch (error) {\n console.error('Email verification error:', error);\n setError(error.message || 'Invalid code. Please try again.');\n setIsLoading(false);\n }\n };\n\n const renderEmailStep = () => (\n <div className=\"w-full flex flex-col\" style={{ height: '100%' }}>\n {/* Content - Flexible center area */}\n <div className=\"px-12 pt-16 pb-8 text-center flex-1 flex flex-col\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-gray-900 mb-2 text-balance leading-tight\">\n Use pre-existing Persona or create a new one in seconds\n </h1>\n <p className=\"text-gray-600 text-base\">Sign in or create an account</p>\n </div>\n\n <div className=\"mb-6\">\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Enter your email\"\n className=\"w-full max-w-sm mx-auto px-4 py-4 text-base bg-gray-50 border-0 rounded-xl placeholder:text-gray-400 focus:bg-white focus:ring-2 focus:ring-gray-200 outline-none transition-all duration-200\"\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif'\n }}\n required\n />\n </div>\n\n <div className=\"mb-6 text-center\">\n <span className=\"text-gray-500 text-sm\">Or</span>\n </div>\n\n <div className=\"mb-8\">\n <button\n type=\"button\"\n className=\"w-full max-w-sm mx-auto py-4 text-base font-medium rounded-xl border border-gray-200 hover:bg-gray-50 flex items-center justify-center gap-3 bg-transparent transition-colors\"\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif'\n }}\n onClick={handleGoogleAuth}\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n Continue with Google\n </button>\n </div>\n\n {/* Error Display */}\n {error && (\n <div className=\"mb-6\">\n <p className=\"text-sm text-center\" style={{ color: COLORS.error }}>{error}</p>\n </div>\n )}\n </div>\n\n {/* Continue Button - Fixed at bottom */}\n <div className=\"px-12 pb-8 flex-shrink-0\">\n <button\n className=\"w-full max-w-sm mx-auto bg-gray-900 hover:bg-gray-800 text-white rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 transition-colors disabled:opacity-50\"\n onClick={handleEmailSubmit}\n disabled={isLoading || !email.trim()}\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif'\n }}\n >\n {isLoading ? 'Loading...' : 'Continue'}\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n );\n\n const renderCodeStep = () => (\n <div className=\"w-full flex flex-col\" style={{ height: '100%' }}>\n {/* Heading - matching VerificationStep.tsx */}\n <div className=\"w-full pt-16 px-12 mb-10 text-center\">\n <h1 \n className=\"font-bold mb-2\"\n style={{ \n fontFamily: 'IBM Plex Sans, system-ui, sans-serif',\n fontWeight: '700',\n fontSize: '24px',\n lineHeight: '32px',\n color: COLORS.textPrimary\n }}\n >\n Enter verification code\n </h1>\n <p \n className=\"mb-2\"\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif',\n fontWeight: '400',\n fontSize: '16px',\n lineHeight: '24px',\n color: COLORS.textSecondary\n }}\n >\n We've sent a 6-digit code to {email}\n </p>\n </div>\n\n\n {/* Code Input - matching VerificationStep design with individual digit boxes */}\n <div className=\"px-12 mb-6\">\n <div className=\"flex justify-center space-x-3\">\n {Array.from({ length: 6 }, (_, index) => (\n <input\n key={index}\n type=\"text\"\n maxLength=\"1\"\n value={code[index] || ''}\n onChange={(e) => {\n const newCode = code.split('');\n newCode[index] = e.target.value;\n setCode(newCode.join(''));\n \n // Auto-focus next input\n if (e.target.value && index < 5) {\n const nextInput = e.target.parentElement?.children[index + 1];\n if (nextInput) nextInput.focus();\n }\n }}\n onKeyDown={(e) => {\n // Handle backspace to focus previous input\n if (e.key === 'Backspace' && !code[index] && index > 0) {\n const prevInput = e.target.parentElement?.children[index - 1];\n if (prevInput) prevInput.focus();\n }\n }}\n className=\"w-12 h-12 border rounded-lg text-center text-lg font-medium focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n style={{ \n borderColor: COLORS.border,\n backgroundColor: COLORS.background,\n fontFamily: 'Inter, system-ui, sans-serif'\n }}\n />\n ))}\n </div>\n </div>\n\n {/* Error Display */}\n {error && (\n <div className=\"px-12 mb-6\">\n <p className=\"text-sm text-center\" style={{ color: COLORS.error }}>{error}</p>\n </div>\n )}\n\n {/* Continue Button - positioned right below code inputs */}\n <div className=\"px-12 mb-6\">\n <div className=\"max-w-sm mx-auto\">\n <PrimaryButton\n label=\"Continue\"\n onClick={handleCodeSubmit}\n loading={isLoading}\n disabled={isLoading || code.length !== 6}\n testId=\"verify-code-button\"\n />\n </div>\n </div>\n\n {/* Spacer */}\n <div style={{ flex: 1, minHeight: '20px' }} />\n\n {/* Back to email option */}\n <div className=\"px-12 w-full\">\n <div className=\"max-w-sm mx-auto\">\n <button\n type=\"button\"\n onClick={() => setStep('email')}\n className=\"w-full py-2 px-4 font-medium transition-colors text-sm\"\n style={{ color: COLORS.textSecondary }}\n >\n Use a different email\n </button>\n </div>\n </div>\n </div>\n );\n\n const renderSuccessStep = () => (\n <div className=\"w-full flex flex-col items-center space-y-6 pt-16 px-12\">\n <div \n className=\"flex items-center justify-center w-16 h-16 rounded-full\"\n style={{ backgroundColor: '#D1FAE5' }}\n >\n <Check className=\"w-8 h-8\" style={{ color: COLORS.success }} />\n </div>\n \n <div className=\"text-center space-y-2\">\n <h2 \n className=\"text-xl font-semibold\"\n style={{ color: COLORS.textPrimary }}\n >\n Email verified!\n </h2>\n <p style={{ color: COLORS.textSecondary }}>Setting up your account...</p>\n </div>\n\n <div className=\"w-8 h-8\">\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\n </div>\n </div>\n );\n\n return (\n <div className=\"w-full\">\n {step === 'email' && renderEmailStep()}\n {step === 'code' && renderCodeStep()}\n {step === 'success' && renderSuccessStep()}\n </div>\n );\n} \n","import React, { useState, useEffect } from \"react\";\nimport Lottie from 'lottie-react';\nimport rainAnim from '../../public/rain-anim.json';\n\nexport default function LoadingScreen({ onComplete }) {\n const [currentStep, setCurrentStep] = useState(0);\n const [dotCount, setDotCount] = useState(0);\n\n const loadingStates = [\n { message: \"Validating PIN and continuing training\", progress: 20 },\n { message: \"Uploading model to secure storage\", progress: 40 },\n { message: \"Running test inference\", progress: 60 },\n { message: \"Storing results in databases\", progress: 80 },\n { message: \"Complete!\", progress: 100 },\n ];\n\n useEffect(() => {\n const stateInterval = setInterval(() => {\n setCurrentStep((prev) => {\n const nextStep = prev + 1;\n if (nextStep >= loadingStates.length) {\n // Loading complete, call onComplete after a short delay\n setTimeout(() => {\n onComplete();\n }, 1000);\n return prev; // Keep at last step\n }\n return nextStep;\n });\n }, 3000); // Change state every 3 seconds\n\n return () => clearInterval(stateInterval);\n }, [loadingStates.length, onComplete]);\n\n useEffect(() => {\n const dotInterval = setInterval(() => {\n setDotCount((prev) => (prev + 1) % 4); // 0, 1, 2, 3 dots\n }, 500); // Change dots every 500ms\n\n return () => clearInterval(dotInterval);\n }, []);\n\n const currentState = loadingStates[currentStep];\n\n return (\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647, pointerEvents: 'auto' }}>\n {/* Modal - Full height from bottom */}\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"px-6 pt-6 pb-4 flex-shrink-0\">\n </div>\n\n {/* Content - Rain animation and loading state */}\n <div className=\"flex-1 flex flex-col px-6\">\n {/* Rain Animation */}\n <div className=\"flex-1 flex items-center justify-center\">\n <div style={{ width: '100%', maxWidth: '400px', aspectRatio: '1' }}>\n <Lottie\n animationData={rainAnim}\n loop={true}\n autoplay={true}\n style={{ width: '100%', height: '100%' }}\n />\n </div>\n </div>\n\n {/* Loading State - Positioned at bottom */}\n <div className=\"flex-shrink-0 pb-12\">\n <div className=\"text-center\">\n <h1 className=\"font-bold text-gray-900 leading-tight mb-6\" style={{ fontSize: 'clamp(16px, 4vw, 20px)' }}>\n {currentState.message}\n {currentState.message !== \"Complete!\" && (\n <span className=\"inline-block w-8 text-left\">{\".\".repeat(dotCount)}</span>\n )}\n </h1>\n\n <div className=\"mx-auto\" style={{ width: 'clamp(200px, 50vw, 300px)' }}>\n <div className=\"w-full h-2 bg-gray-200 rounded-full\">\n <div\n className=\"h-2 bg-gray-900 rounded-full transition-all duration-1000 ease-out\"\n style={{ width: `${currentState.progress}%` }}\n ></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Bottom spacing */}\n <div className=\"h-20 flex-shrink-0\"></div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\n\nexport default function PinSetup({ onComplete, onBack, userEmail }) {\n const [pin, setPin] = useState('');\n const [pinRequirements, setPinRequirements] = useState({\n length: false,\n uppercase: false,\n number: false,\n });\n\n // Check PIN requirements\n useEffect(() => {\n setPinRequirements({\n length: pin.length >= 6,\n uppercase: /[A-Z]/.test(pin),\n number: /\\d/.test(pin),\n });\n }, [pin]);\n\n const allRequirementsMet = pinRequirements.length && pinRequirements.uppercase && pinRequirements.number;\n\n const handleSubmit = () => {\n if (allRequirementsMet) {\n onComplete({\n pin: pin, // This should be hashed in production\n pinCreated: true,\n timestamp: new Date().toISOString()\n });\n }\n };\n\n return (\n <div className=\"w-full h-full flex flex-col\" style={{ height: '100%', minHeight: 0 }}>\n {/* Content - Flexible center area */}\n <div className=\"px-6 pt-16 flex-1 flex flex-col\" style={{ minHeight: 0, overflow: 'hidden' }}>\n <div className=\"mb-6 flex-shrink-0\">\n <h1 className=\"text-2xl font-bold text-gray-900 mb-2\">Create a PIN</h1>\n <p className=\"text-gray-600 text-base\">A PIN so only you have the access to your data</p>\n </div>\n\n <div className=\"mb-6 flex-shrink-0\">\n <input\n type=\"password\"\n value={pin}\n onChange={(e) => setPin(e.target.value)}\n className=\"w-full px-4 py-4 border-2 border-gray-300 rounded-xl text-center text-lg font-medium focus:border-gray-900 focus:outline-none bg-white\"\n placeholder=\"Enter your PIN\"\n maxLength={20}\n style={{\n color: '#000000',\n WebkitTextFillColor: '#000000',\n backgroundColor: '#FFFFFF'\n }}\n />\n </div>\n\n {/* Scrollable requirements list */}\n <div className=\"flex-1 overflow-y-auto\" style={{ minHeight: 0 }}>\n <div className=\"space-y-3 pb-4\">\n <p className=\"text-gray-900 font-medium mb-4\">Your PIN must:</p>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded-full border-2 ${pinRequirements.length ? \"border-green-500 bg-green-500\" : \"border-gray-300 bg-white\"}`}\n >\n {pinRequirements.length && (\n <svg className=\"w-3 h-3 text-white m-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n <span className=\"text-gray-700\">Be at least 6 characters in length.</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded-full border-2 ${pinRequirements.uppercase ? \"border-green-500 bg-green-500\" : \"border-gray-300 bg-white\"}`}\n >\n {pinRequirements.uppercase && (\n <svg className=\"w-3 h-3 text-white m-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n <span className=\"text-gray-700\">Contain an uppercase letter.</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded-full border-2 ${pinRequirements.number ? \"border-green-500 bg-green-500\" : \"border-gray-300 bg-white\"}`}\n >\n {pinRequirements.number && (\n <svg className=\"w-3 h-3 text-white m-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n <span className=\"text-gray-700\">Contain a number.</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Buttons - Fixed at bottom */}\n <div className=\"px-6 pb-6 pt-4 flex-shrink-0 space-y-3\" style={{ minHeight: 'auto' }}>\n <div\n className={`w-full rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 transition-colors ${\n allRequirementsMet \n ? \"bg-gray-900 hover:bg-gray-800 text-white cursor-pointer\" \n : \"bg-gray-300 text-gray-500 cursor-not-allowed\"\n }`}\n onClick={allRequirementsMet ? handleSubmit : undefined}\n >\n Continue\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </div>\n </div>\n </div>\n );\n} ","import React, { useState, useEffect } from 'react';\nimport { COLORS } from '../theme/colors.js';\n\nexport default function TrainingComponent({ onComplete, userEmail, appName = 'App', testMode = false }) {\n const [currentStep, setCurrentStep] = useState(0);\n const [progress, setProgress] = useState(0);\n const [isComplete, setIsComplete] = useState(false);\n\n const steps = [\n {\n title: 'Setting up your personal AI',\n description: 'Initializing your secure data model',\n icon: '๐Ÿค–',\n duration: testMode ? 800 : 2000 // Much faster in test mode\n },\n {\n title: 'Processing your connections',\n description: 'Analyzing your social media patterns',\n icon: '๐Ÿ”—',\n duration: testMode ? 600 : 2500\n },\n {\n title: 'Training your model',\n description: 'Building your personalized insights',\n icon: '๐Ÿง ',\n duration: testMode ? 700 : 3000\n },\n {\n title: 'Finalizing setup',\n description: 'Preparing your Onairos experience',\n icon: 'โœจ',\n duration: testMode ? 500 : 2000\n }\n ];\n\n useEffect(() => {\n let interval;\n let stepTimeout;\n\n if (currentStep < steps.length) {\n const stepDuration = steps[currentStep].duration;\n const stepProgress = 100 / steps.length;\n\n // Update progress gradually\n interval = setInterval(() => {\n setProgress(prev => {\n const newProgress = prev + (stepProgress / (stepDuration / 100));\n return Math.min(newProgress, (currentStep + 1) * stepProgress);\n });\n }, 100);\n\n // Move to next step after duration\n stepTimeout = setTimeout(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep(prev => prev + 1);\n } else {\n setIsComplete(true);\n const completionDelay = testMode ? 400 : 1000; // Faster completion in test mode\n \n if (testMode) {\n console.log('๐Ÿงช Test mode: Training simulation completed');\n }\n \n setTimeout(() => {\n onComplete({\n trainingComplete: true,\n timestamp: new Date().toISOString(),\n userEmail: userEmail,\n appName: appName,\n testMode: testMode,\n simulatedTraining: testMode\n });\n }, completionDelay);\n }\n }, stepDuration);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n if (stepTimeout) clearTimeout(stepTimeout);\n };\n }, [currentStep, onComplete, userEmail, appName]);\n\n return (\n <div className=\"w-full flex flex-col items-center space-y-8\">\n <div className=\"text-center\">\n <div \n className=\"w-20 h-20 rounded-full flex items-center justify-center mx-auto mb-4\"\n style={{\n background: `linear-gradient(135deg, ${COLORS.info}, #8B5CF6)`\n }}\n >\n <div className=\"text-3xl\">\n {isComplete ? '๐ŸŽ‰' : steps[currentStep]?.icon}\n </div>\n </div>\n <h2 \n className=\"text-2xl font-bold mb-2\"\n style={{ color: COLORS.textPrimary }}\n >\n {isComplete ? 'All set!' : steps[currentStep]?.title}\n </h2>\n <p style={{ color: COLORS.textSecondary }}>\n {isComplete \n ? 'Your personal AI is ready to use' \n : steps[currentStep]?.description\n }\n </p>\n </div>\n\n {/* Progress Bar */}\n <div className=\"w-full\">\n <div \n className=\"flex justify-between text-sm mb-2\"\n style={{ color: COLORS.textSecondary }}\n >\n <span>Progress</span>\n <span>{Math.round(progress)}%</span>\n </div>\n <div \n className=\"w-full rounded-full h-2\"\n style={{ backgroundColor: COLORS.borderLight }}\n >\n <div \n className=\"h-2 rounded-full transition-all duration-300 ease-out\"\n style={{ \n width: `${progress}%`,\n background: `linear-gradient(90deg, ${COLORS.info}, #8B5CF6)`\n }}\n />\n </div>\n </div>\n\n {/* Steps Indicator */}\n <div className=\"flex justify-center space-x-2\">\n {steps.map((_, index) => (\n <div\n key={index}\n className=\"w-3 h-3 rounded-full transition-all duration-300\"\n style={{\n backgroundColor: index <= currentStep ? COLORS.info : COLORS.border\n }}\n />\n ))}\n </div>\n\n {/* Current Step Details */}\n <div \n className=\"p-4 rounded-lg w-full\"\n style={{ backgroundColor: COLORS.backgroundSecondary }}\n >\n <div className=\"flex items-center space-x-3\">\n <div \n className=\"w-8 h-8 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: '#DBEAFE' }}\n >\n <div className=\"text-sm\">\n {isComplete ? 'โœ…' : steps[currentStep]?.icon}\n </div>\n </div>\n <div>\n <h3 \n className=\"font-medium\"\n style={{ color: COLORS.textPrimary }}\n >\n {isComplete ? 'Training Complete' : `Step ${currentStep + 1} of ${steps.length}`}\n </h3>\n <p \n className=\"text-sm\"\n style={{ color: COLORS.textSecondary }}\n >\n {isComplete \n ? 'Your Onairos experience is ready' \n : steps[currentStep]?.description\n }\n </p>\n </div>\n </div>\n </div>\n\n {/* App Info */}\n <div className=\"text-center\">\n <p \n className=\"text-sm\"\n style={{ color: COLORS.textSecondary }}\n >\n Setting up for <span className=\"font-medium\">{appName}</span>\n </p>\n {userEmail && (\n <p \n className=\"text-xs mt-1\"\n style={{ color: COLORS.textMuted }}\n >\n {userEmail}\n </p>\n )}\n </div>\n </div>\n );\n} ","import React, { useEffect, useId, useState, useRef } from 'react';\nimport Lottie from 'lottie-react';\nimport personaAnim from '../../public/persona-anim.json';\nconst chatgptIcon = 'https://anushkasirv.sirv.com/openai.png';\nconst claudeIcon = 'https://anushkasirv.sirv.com/claude-color.png';\nconst geminiIcon = 'https://anushkasirv.sirv.com/gemini-color.png';\nconst grokIcon = 'https://anushkasirv.sirv.com/grok.png';\n\nconst sdkConfig = {\n apiKey: process.env.REACT_APP_ONAIROS_API_KEY || 'ona_VvoHNg1fdCCUa9eBy4Iz3IfvXdgLfMFI7TNcyHLDKEadPogkbjAeE2iDOs6M7Aey',\n baseUrl: process.env.REACT_APP_ONAIROS_BASE_URL || 'https://api2.onairos.uk',\n sdkType: 'web',\n enableHealthMonitoring: true,\n enableAutoRefresh: true,\n enableConnectionValidation: true,\n};\n\nconst fadeSlideInKeyframes = `\n@keyframes fadeSlideIn {\n from { opacity: 0; transform: translateX(var(--slide-x)); }\n to { opacity: 1; transform: translateX(0); }\n}\n`;\n\nexport default function UniversalOnboarding({ onComplete }) {\n const lottieRef = useRef(null);\n const lastFrameRef = useRef(0);\n const rafRef = useRef(null);\n\n const [connectedAccounts, setConnectedAccounts] = useState({});\n const [isConnecting, setIsConnecting] = useState(false);\n const [connectingPlatform, setConnectingPlatform] = useState(null);\n const [selected, setSelected] = useState('Instagram');\n const [currentPage, setCurrentPage] = useState(1);\n\n // swipe state\n const touchStartX = useRef(0);\n const touchDeltaX = useRef(0);\n\n const [vh, setVh] = useState(() => (typeof window !== 'undefined' ? window.innerHeight : 800));\n useEffect(() => {\n const onResize = () => setVh(window.innerHeight);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const FOOTER_H = 88;\n\n // persona stays as requested (background, unchanged placement)\n const personaSide = Math.min(vh * 0.52, 500);\n const PERSONA_TOP = 96;\n\n // icon layout (restore tighter spacing on page 1; place the band lower)\n const SLOT = Math.max(56, Math.min(64, Math.floor(vh * 0.07)));\n const CIRCLE = 42;\n const GAP_PAGE1 = 12;\n const GAP_PAGE2 = 20;\n const ACTIVE_SCALE = vh < 760 ? 1.12 : 1.22;\n\n const ICONS_H = 84;\n const ICONS_TOP_OFFSET = Math.max(180, Math.min(240, Math.round(vh * 0.28))); // ~28vh, clamped for all screens\n\n const igGradId = useId();\n\n // ---- official brand SVGs (compact, consistent viewboxes) ----\n const Brand = {\n ChatGPT: <img src={chatgptIcon} alt=\"ChatGPT\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Claude: <img src={claudeIcon} alt=\"Claude\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Gemini: <img src={geminiIcon} alt=\"Gemini\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Grok: <img src={grokIcon} alt=\"Grok\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Instagram: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <defs>\n <radialGradient id={igGradId} cx=\"0.5\" cy=\"1\" r=\"1\">\n <stop offset=\"0%\" stopColor=\"#FDBB4B\"/>\n <stop offset=\"40%\" stopColor=\"#E95950\"/>\n <stop offset=\"70%\" stopColor=\"#BC2A8D\"/>\n <stop offset=\"100%\" stopColor=\"#4C68D7\"/>\n </radialGradient>\n </defs>\n <path fill={`url(#${igGradId})`} d=\"M7 2h10a5 5 0 0 1 5 5v10a5 5 0 0 1-5 5H7a5 5 0 0 1-5-5V7a5 5 0 0 1 5-5zm5 5.5A4.5 4.5 0 1 0 16.5 12 4.5 4.5 0 0 0 12 7.5zm0 7.4A2.9 2.9 0 1 1 14.9 12 2.9 2.9 0 0 1 12 14.9Zm5.35-8.25a1.15 1.15 0 1 0 1.15 1.15 1.15 1.15 0 0 0-1.15-1.15Z\"/>\n </svg>\n ),\n YouTube: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <path fill=\"#FF0000\" d=\"M22.54 6.42a3 3 0 0 0-2.11-2.12C18.49 3.75 12 3.75 12 3.75s-6.49 0-8.43.55A3 3 0 0 0 1.46 6.42 31.63 31.63 0 0 0 1 12a31.63 31.63 0 0 0 .46 5.58 3 3 0 0 0 2.11 2.12C5.51 20.25 12 20.25 12 20.25s6.49 0 8.43-.55a3 3 0 0 0 2.11-2.12A31.63 31.63 0 0 0 23 12a31.63 31.63 0 0 0-.46-5.58z\"/>\n <path fill=\"#FFF\" d=\"M10 8.75v6.5l6-3.25-6-3.25z\"/>\n </svg>\n ),\n Reddit: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#FF4500\"/>\n <circle cx=\"8.75\" cy=\"12.5\" r=\"1.25\" fill=\"#FFF\"/>\n <circle cx=\"15.25\" cy=\"12.5\" r=\"1.25\" fill=\"#FFF\"/>\n <path fill=\"#FFF\" d=\"M7.9 15c.8.8 2.3 1.05 4.1 1.05S15.3 15.8 16.1 15c.2-.2.2-.5 0-.7-.2-.2-.5-.2-.7 0-.6.6-1.9.85-3.4.85S9.3 14.9 8.7 14.3c-.2-.2-.5-.2-.7 0-.2.2-.2.5 0 .7z\"/>\n </svg>\n ),\n LinkedIn: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"3\" fill=\"#0A66C2\"/>\n <rect x=\"5\" y=\"9\" width=\"3\" height=\"10\" fill=\"#FFF\"/>\n <circle cx=\"6.5\" cy=\"6.5\" r=\"1.5\" fill=\"#FFF\"/>\n <path fill=\"#FFF\" d=\"M16.8 19H13.9v-5c0-1.2-.5-1.8-1.4-1.8-.9 0-1.6.6-1.6 1.8V19H8V9h2.8v1.3c.5-.8 1.4-1.5 2.7-1.5 2 0 3.3 1.3 3.3 3.7V19z\"/>\n </svg>\n ),\n Twitter: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <path fill=\"#1DA1F2\" d=\"M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0 .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112-.065 2.062 1.323 4.51 2.093 7.14 2.093 8.57 0 13.255-7.098 13.255-13.254 0-.2-.005-.402-.014-.602.91-.658 1.7-1.477 2.323-2.41z\"/>\n </svg>\n ),\n };\n\n const aiLinks = {\n ChatGPT: 'https://chat.openai.com',\n Claude: 'https://claude.ai',\n Gemini: 'https://gemini.google.com',\n Grok: 'https://grok.x.ai',\n };\n\n const descriptions = {\n ChatGPT: <>We analyze your <strong className=\"font-semibold\">prompt style</strong> and <strong className=\"font-semibold\">chat history</strong> to match your writing and thinking patterns.</>,\n Claude: <>We learn your <strong className=\"font-semibold\">document workflow</strong> and <strong className=\"font-semibold\">reasoning preferences</strong> to tune output format and detail.</>,\n Gemini: <>We study your <strong className=\"font-semibold\">search patterns</strong> and <strong className=\"font-semibold\">multimodal usage</strong> to improve response accuracy.</>,\n Grok: <>We adapt to your <strong className=\"font-semibold\">X posting style</strong> and <strong className=\"font-semibold\">meme literacy</strong> to match your tone.</>,\n Twitter: <>We analyze your <strong className=\"font-semibold\">tweets</strong> and <strong className=\"font-semibold\">interests</strong> to understand your preferences.</>,\n YouTube: <>We study your <strong className=\"font-semibold\">watch history</strong> and <strong className=\"font-semibold\">interactions</strong> to learn your interests.</>,\n Reddit: <>We examine your <strong className=\"font-semibold\">search history</strong> and <strong className=\"font-semibold\">discussions</strong> to understand your interests.</>,\n Instagram: <>We analyze your <strong className=\"font-semibold\">photos</strong> and <strong className=\"font-semibold\">interactions</strong> to learn visual preferences.</>,\n LinkedIn: <>We study your <strong className=\"font-semibold\">professional graph</strong> and <strong className=\"font-semibold\">content</strong> to understand career interests.</>,\n };\n\n const allPlatforms = [\n // Page 1\n { name: 'Instagram', connector: 'instagram', icon: Brand.Instagram },\n { name: 'YouTube', connector: 'youtube', icon: Brand.YouTube },\n { name: 'ChatGPT', connector: 'chatgpt', icon: Brand.ChatGPT, directLink: aiLinks.ChatGPT },\n // Page 2\n { name: 'Claude', connector: 'claude', icon: Brand.Claude, directLink: aiLinks.Claude },\n { name: 'Gemini', connector: 'gemini', icon: Brand.Gemini, directLink: aiLinks.Gemini },\n { name: 'Twitter', connector: 'twitter', icon: Brand.Twitter },\n // Page 3\n { name: 'LinkedIn', connector: 'linkedin', icon: Brand.LinkedIn },\n { name: 'Reddit', connector: 'reddit', icon: Brand.Reddit },\n { name: 'Grok', connector: 'grok', icon: Brand.Grok, directLink: aiLinks.Grok },\n ];\n\n const getPlatformsForPage = (page) => {\n if (page === 1) return allPlatforms.slice(0, 3);\n if (page === 2) return allPlatforms.slice(3, 6);\n return allPlatforms.slice(6);\n };\n\n const platforms = getPlatformsForPage(currentPage);\n\n useEffect(() => {\n // Load OAuth platform returns\n const p = localStorage.getItem('onairos_oauth_platform');\n if (p) {\n localStorage.removeItem('onairos_oauth_platform');\n localStorage.removeItem('onairos_oauth_return');\n setConnectedAccounts((s) => ({ ...s, [p]: true }));\n }\n \n // Load persisted connected accounts from user data\n try {\n const userData = JSON.parse(localStorage.getItem('onairosUser') || '{}');\n if (userData.connectedAccounts && Array.isArray(userData.connectedAccounts)) {\n // Convert array to object format\n const accountsObj = userData.connectedAccounts.reduce((acc, platform) => {\n acc[platform] = true;\n return acc;\n }, {});\n setConnectedAccounts(accountsObj);\n }\n } catch (error) {\n console.warn('Failed to load persisted connected accounts:', error);\n }\n }, []);\n\n async function connectToPlatform(name) {\n const plat = allPlatforms.find((p) => p.name === name);\n if (!plat) return false;\n try {\n // For direct-link platforms (no OAuth), mark connected immediately and return\n if (plat.directLink) {\n setConnectedAccounts((s) => ({ ...s, [name]: true }));\n setIsConnecting(false);\n setConnectingPlatform(null);\n return true;\n }\n\n // Immediately reflect selection in UI without spinner while starting OAuth\n setConnectedAccounts((s) => ({ ...s, [name]: true }));\n setIsConnecting(true);\n setConnectingPlatform(name);\n \n // BYPASS: Twitter endpoint is 404, so just keep toggle ON without API call\n if (name === 'Twitter') {\n console.log('๐Ÿฆ Twitter: Bypassing API call (endpoint not available), keeping toggle ON');\n setIsConnecting(false);\n setConnectingPlatform(null);\n return true;\n }\n \n const username = localStorage.getItem('username') || (JSON.parse(localStorage.getItem('onairosUser') || '{}')?.email) || 'user@example.com';\n\n const res = await fetch(`${sdkConfig.baseUrl}/${plat.connector}/authorize`, {\n method: 'POST', headers: { 'x-api-key': sdkConfig.apiKey, 'Content-Type': 'application/json' },\n body: JSON.stringify({ session: { username } }),\n });\n if (!res.ok) throw new Error('auth failed');\n const data = await res.json();\n\n const candidates = (\n {\n youtube: ['youtubeURL','youtubeUrl','youtube_url'],\n linkedin: ['linkedinURL','linkedinUrl','linkedin_url'],\n reddit: ['redditURL','redditUrl','reddit_url'],\n pinterest: ['pinterestURL','pinterestUrl','pinterest_url'],\n instagram: ['instagramURL','instagramUrl','instagram_url'],\n github: ['githubURL','githubUrl','github_url'],\n facebook: ['facebookURL','facebookUrl','facebook_url'],\n gmail: ['gmailURL','gmailUrl','gmail_url'],\n }[plat.connector]\n ) || [`${plat.connector}URL`, `${plat.connector}Url`, `${plat.connector}_url`, 'platformURL', 'authUrl', 'url'];\n\n let oauthUrl = null; for (const k of candidates) if (data[k]) { oauthUrl = data[k]; break; }\n if (!oauthUrl) throw new Error('no url');\n\n const popup = window.open(oauthUrl, `${plat.connector}_oauth`, 'width=500,height=600,scrollbars=yes,resizable=yes,status=no,location=no,toolbar=no,menubar=no');\n if (!popup) throw new Error('popup blocked');\n\n let touched = false; const it = setInterval(() => {\n try { if (popup.location && popup.location.hostname === 'onairos.uk') { touched = true; popup.close(); } } catch { if (!touched) touched = true; }\n try { if (popup.closed) { clearInterval(it); setIsConnecting(false); setConnectingPlatform(null); } } catch {}\n }, 800);\n\n setTimeout(() => { try { if (!popup.closed && touched) popup.close(); } catch {} }, 10000);\n setTimeout(() => { if (!popup.closed) { popup.close(); clearInterval(it); setIsConnecting(false); setConnectingPlatform(null); } }, 300000);\n return true;\n } catch {\n // On failure, revert the optimistic toggle\n setConnectedAccounts((s) => ({ ...s, [name]: false }));\n setIsConnecting(false); setConnectingPlatform(null); return false;\n }\n }\n\n const handleSwitch = async (name) => {\n if (isConnecting && connectingPlatform !== name) return;\n const on = !!connectedAccounts[name];\n if (on) setConnectedAccounts((s) => ({ ...s, [name]: false }));\n else await connectToPlatform(name);\n };\n\n const connectedCount = Object.values(connectedAccounts).filter(Boolean).length;\n\n useEffect(() => {\n if (!lottieRef.current) return;\n const totalFrames = (personaAnim.op || 0) - (personaAnim.ip || 0);\n const TOTAL_PLATFORMS = 9; // Total number of platforms across all pages\n const progress = connectedCount / TOTAL_PLATFORMS;\n const target = Math.max(0, Math.floor(progress * totalFrames));\n const start = lastFrameRef.current || 0;\n const duration = 420; const startTs = performance.now();\n const step = (now) => {\n const t = Math.min(1, (now - startTs) / duration);\n const eased = t < 0.5 ? 2*t*t : -1 + (4 - 2*t)*t;\n const frame = Math.floor(start + (target - start) * eased);\n lottieRef.current.goToAndStop(frame, true);\n if (t < 1) rafRef.current = requestAnimationFrame(step); else lastFrameRef.current = target;\n };\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(step);\n return () => { if (rafRef.current) cancelAnimationFrame(rafRef.current); };\n }, [connectedCount]);\n\n // swipe handlers for smooth paging\n const onTouchStart = (e) => { touchStartX.current = e.touches[0].clientX; touchDeltaX.current = 0; };\n const onTouchMove = (e) => { touchDeltaX.current = e.touches[0].clientX - touchStartX.current; };\n const onTouchEnd = () => {\n const dx = touchDeltaX.current; const THRESH = 40;\n if (dx < -THRESH && currentPage < 3) setCurrentPage(currentPage + 1);\n else if (dx > THRESH && currentPage > 1) setCurrentPage(currentPage - 1);\n };\n\n return (\n <div className=\"w-full h-full relative\" style={{ height: Math.min('90vh', Math.max(600, Math.min(720, vh * 0.9))), minHeight: 580, maxHeight: 720 }}>\n <style>{fadeSlideInKeyframes}</style>\n\n {/* persona as background (unchanged) */}\n <div aria-hidden style={{ position: 'absolute', left: '50%', top: PERSONA_TOP, transform: 'translateX(-50%)', width: personaSide, height: personaSide, zIndex: 0, pointerEvents: 'none', opacity: 0.95 }}>\n <div className=\"overflow-hidden rounded-[28px] w-full h-full\">\n <Lottie lottieRef={lottieRef} animationData={personaAnim} autoplay={false} loop={false} style={{ width: '100%', height: '100%' }} />\n </div>\n </div>\n\n {/* content above persona */}\n <div className=\"relative z-10 h-full flex flex-col\">\n {/* header (unchanged visuals) */}\n <div className=\"px-6 pt-16 pb-4 text-center flex-shrink-0\">\n <h1 className=\"text-2xl font-bold text-gray-900 mb-2 leading-tight\">Connect App Data</h1>\n <p className=\"text-gray-600 text-base\">More Connections, Better Personalization.</p>\n </div>\n\n {/* Spacer to push content down */}\n <div className=\"flex-1\" style={{ minHeight: 40 }} />\n\n {/* icons band */}\n <div className=\"px-6 flex-shrink-0\" style={{ height: ICONS_H }}>\n <div className=\"h-full flex items-center justify-center\">\n <div\n className=\"grid w-full box-border relative\"\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n style={{\n gridAutoFlow: 'column',\n gridTemplateColumns: `repeat(${platforms.length}, minmax(0,1fr))`,\n columnGap: currentPage === 1 ? GAP_PAGE1 : GAP_PAGE2,\n alignItems: 'center',\n justifyItems: 'center',\n paddingInline: 8,\n overflow: 'hidden',\n }}\n >\n {platforms.map((p, idx) => {\n const on = !!connectedAccounts[p.name];\n const busy = false; // keep icon static visually per request\n const isSel = selected === p.name;\n const shift = (currentPage === 1 ? idx : idx - 2) * 14;\n return (\n <div key={p.name} className=\"transition-all duration-300\" style={{ opacity: 0, transform: `translateX(${shift}px)`, animation: 'fadeSlideIn 0.28s forwards', ['--slide-x']: `${shift}px` }}>\n <button\n type=\"button\"\n onClick={() => { \n setSelected(p.name);\n if (p.directLink) {\n // For direct link platforms (AI tools), connect immediately and open link\n if (!connectedAccounts[p.name]) {\n setConnectedAccounts((s) => ({ ...s, [p.name]: true }));\n }\n window.open(p.directLink, '_blank');\n } else {\n handleSwitch(p.name);\n }\n }}\n className=\"relative grid place-items-center outline-none\"\n style={{ width: SLOT, height: SLOT }}\n title={p.name}\n >\n <div className={`rounded-full border-3 transition-all duration-150 ease-out flex items-center justify-center shadow-lg ${on ? 'border-blue-600 bg-white text-black shadow-blue-500/70' : 'border-gray-300 hover:border-gray-400 bg-white text-black'}`}\n style={{ width: CIRCLE, height: CIRCLE, transform: `scale(${isSel ? ACTIVE_SCALE : 1})`, transformOrigin: 'center' }}>\n <div className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n {p.icon}\n </div>\n </div>\n </button>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* dots navigation (no numbers) - directly under icons, above card */}\n <div className=\"relative flex items-center justify-center gap-4 select-none flex-shrink-0\" style={{ marginTop: 20, marginBottom: 16, zIndex: 25 }}>\n {[1,2,3].map(n => (\n <button key={n} onClick={() => setCurrentPage(n)} aria-label={`page ${n}`} className=\"relative\" style={{ width: 12, height: 12 }}>\n <span className={`block rounded-full ${currentPage === n ? 'bg-blue-600 scale-110' : 'bg-gray-300'} transition-transform`} style={{ width: 12, height: 12 }} />\n </button>\n ))}\n </div>\n\n {/* info sheet โ€” positioned using flex */}\n <div className=\"px-6 flex-shrink-0\" style={{ marginBottom: 24, zIndex: 20 }}>\n <div className=\"mx-auto rounded-2xl bg-white shadow-sm border border-gray-200 px-4 py-2.5\" style={{ width: 'min(680px,92%)', maxHeight: vh * 0.2 }}>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-gray-900 font-medium\">{selected}</div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!connectedAccounts[selected]}\n aria-label={`toggle ${selected}`}\n onClick={() => handleSwitch(selected)}\n disabled={isConnecting && connectingPlatform !== selected}\n className={`relative inline-flex items-center transition-colors disabled:opacity-50 ${connectedAccounts[selected] ? 'bg-black' : 'bg-gray-200'} rounded-full`}\n style={{ width: 56, height: 32 }}\n >\n <span className=\"absolute bg-white rounded-full shadow\" style={{ width: 24, height: 24, transform: connectedAccounts[selected] ? 'translateX(26px)' : 'translateX(6px)', transition: 'transform 160ms ease' }} />\n </button>\n </div>\n <div className=\"mt-3\">\n <div className=\"rounded-2xl bg-gray-50 text-gray-700 text-sm leading-6 px-4 py-3 shadow-[inset_0_0_0_1px_rgba(0,0,0,0.04)]\">\n {descriptions[selected] || null}\n </div>\n </div>\n </div>\n </div>\n\n {/* footer โ€” anchored at bottom using flex */}\n <div className=\"px-6 flex-shrink-0\" style={{ paddingBottom: 16, background: 'linear-gradient(to top, white 60%, rgba(255,255,255,0.9) 85%, rgba(255,255,255,0))', zIndex: 30 }}>\n <div className=\"w-full bg-gray-900 hover:bg-gray-800 text-white rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 cursor-pointer transition-colors\" onClick={() => {\n const connected = Object.entries(connectedAccounts).filter(([, v]) => v).map(([k]) => k);\n onComplete?.({ connectedAccounts: connected, totalConnections: connected.length });\n }}>\n Update\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" /></svg>\n </div>\n <div onClick={() => onComplete?.({ connectedAccounts: [], totalConnections: 0 })} className=\"w-full text-gray-600 text-base font-medium py-2 text-center cursor-pointer hover:text-gray-800 transition-colors\">Skip</div>\n </div>\n </div>\n </div>\n );\n}","import React, { useEffect } from 'react';\nimport { COLORS } from '../theme/colors.js';\n\nexport default function WelcomeScreen({ onContinue, onClose }) {\n // Load Sirv script for responsive images\n useEffect(() => {\n const script = document.createElement('script');\n script.src = 'https://scripts.sirv.com/sirvjs/v3/sirv.js';\n script.async = true;\n document.head.appendChild(script);\n \n return () => {\n const existingScript = document.querySelector('script[src=\"https://scripts.sirv.com/sirvjs/v3/sirv.js\"]');\n if (existingScript) {\n document.head.removeChild(existingScript);\n }\n };\n }, []);\n\n return (\n <div className=\"w-full flex flex-col\" style={{ height: '100%' }}>\n {/* Content - Flexible center area */}\n <div className=\"px-6 text-center flex-1 flex flex-col justify-center\">\n {/* Logo */}\n <div className=\"mb-8 flex justify-center\">\n <div className=\"w-20 h-20 flex items-center justify-center\">\n <img \n className=\"Sirv w-full h-full object-contain\" \n data-src=\"https://anushkasirv.sirv.com/OnairosBlack.png\" \n alt=\"Onairos Logo\"\n />\n </div>\n </div>\n\n {/* Welcome Text */}\n <p className=\"text-gray-500 text-sm mb-2\">Welcome to</p>\n\n {/* Main Title */}\n <h1 className=\"text-4xl font-bold text-gray-900 mb-6 text-balance\">Onairos</h1>\n\n {/* Description */}\n <p className=\"text-gray-600 text-base leading-relaxed mb-12 text-pretty px-2\">\n OnairOS personalizes your digital experience on every app so you can just enjoy being you!\n </p>\n </div>\n\n {/* Get Started Button - Fixed at bottom */}\n <div className=\"px-6 pb-8 flex-shrink-0\">\n <button\n className=\"w-full bg-gray-900 hover:bg-gray-800 text-white rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 transition-colors\"\n onClick={onContinue}\n >\n Get Started\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { COLORS } from '../../theme/colors.js';\n\n// Standardized page layout component with white background\nconst PageLayout = ({\n children,\n title,\n subtitle,\n icon,\n showHeader = true,\n showCloseButton = false,\n onClose,\n onBack,\n showBackButton = false,\n className = '',\n contentClassName = '',\n centerContent = true,\n style = {},\n ...props\n}) => {\n const layoutStyle = {\n backgroundColor: COLORS.background,\n minHeight: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n ...style\n };\n\n const headerStyle = {\n position: 'sticky',\n top: 0,\n backgroundColor: COLORS.background,\n zIndex: 10,\n padding: 'clamp(8px, 2vw, 16px) clamp(16px, 4vw, 32px) clamp(6px, 1.5vw, 12px)'\n };\n\n const contentStyle = {\n flex: 1,\n padding: 'clamp(16px, 4vw, 32px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'auto',\n minHeight: 0, // Allow flex item to shrink below content size\n ...(centerContent && {\n alignItems: 'center',\n justifyContent: 'flex-start'\n })\n };\n\n const titleStyle = {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: 'clamp(20px, 5vw, 28px)',\n fontWeight: '700',\n color: COLORS.textPrimary,\n margin: '0 0 clamp(6px, 1.5vw, 12px) 0',\n textAlign: centerContent ? 'center' : 'left',\n lineHeight: '1.2'\n };\n\n const subtitleStyle = {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: 'clamp(14px, 3.5vw, 18px)',\n fontWeight: '400',\n color: COLORS.textSecondary,\n margin: '0 0 clamp(20px, 5vw, 40px) 0',\n textAlign: centerContent ? 'center' : 'left',\n lineHeight: '1.5'\n };\n\n const iconStyle = {\n width: 'clamp(40px, 8vw, 56px)',\n height: 'clamp(40px, 8vw, 56px)',\n margin: '0 auto clamp(16px, 4vw, 32px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 'clamp(20px, 5vw, 28px)'\n };\n\n return (\n <div \n className={`onairos-page-layout ${className}`}\n style={layoutStyle}\n {...props}\n >\n {/* Header with navigation */}\n {showHeader && (\n <div style={headerStyle}>\n <div className=\"flex items-center justify-between\">\n {/* Back button */}\n {showBackButton && onBack && (\n <button\n onClick={onBack}\n className=\"flex items-center justify-center w-8 h-8 rounded-full hover:bg-gray-100 transition-colors\"\n aria-label=\"Go back\"\n >\n <span style={{ fontSize: '16px', color: COLORS.textPrimary }}>โ†</span>\n </button>\n )}\n\n\n {/* Close button */}\n {showCloseButton && onClose && (\n <button\n onClick={onClose}\n className=\"flex items-center justify-center w-8 h-8 rounded-full hover:bg-gray-100 transition-colors\"\n aria-label=\"Close\"\n >\n <span style={{ fontSize: '16px', color: COLORS.textPrimary }}>ร—</span>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Main content area */}\n <div \n className={`onairos-page-content ${contentClassName}`}\n style={contentStyle}\n >\n {/* Icon */}\n {icon && (\n <div style={iconStyle}>\n {typeof icon === 'string' ? <span>{icon}</span> : icon}\n </div>\n )}\n\n {/* Title */}\n {title && (\n <h1 style={titleStyle}>\n {title}\n </h1>\n )}\n\n {/* Subtitle */}\n {subtitle && (\n <p style={subtitleStyle}>\n {subtitle}\n </p>\n )}\n\n {/* Page content */}\n {children}\n </div>\n </div>\n );\n};\n\n// Modal wrapper component for overlay-style pages\nconst ModalPageLayout = ({\n children,\n visible = true,\n onClose,\n onBackdropClick,\n backdropStyle = {},\n modalStyle = {},\n ...pageLayoutProps\n}) => {\n if (!visible) return null;\n\n const backdropStyles = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 2147483647,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 200ms ease',\n willChange: 'opacity',\n ...backdropStyle\n };\n\n const modalStyles = {\n backgroundColor: COLORS.background,\n borderTopLeftRadius: '24px',\n borderTopRightRadius: '24px',\n borderBottomLeftRadius: '24px',\n borderBottomRightRadius: '24px',\n height: '90vh',\n width: '100%',\n maxWidth: '500px',\n boxShadow: '0 -10px 40px rgba(0, 0, 0, 0.3)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n transform: 'translateY(0)',\n transition: 'transform 220ms ease, opacity 220ms ease',\n willChange: 'transform, opacity',\n ...modalStyle\n };\n\n const handleBackdropClick = (e) => {\n if (e.target === e.currentTarget) {\n if (onBackdropClick) {\n onBackdropClick();\n } else if (onClose) {\n onClose();\n }\n }\n };\n\n return (\n <div style={backdropStyles} onClick={handleBackdropClick}>\n <div style={modalStyles}>\n <PageLayout\n showHeader={true}\n showCloseButton={true}\n onClose={onClose}\n {...pageLayoutProps}\n >\n {children}\n </PageLayout>\n </div>\n </div>\n );\n};\n\nexport { ModalPageLayout };\nexport default PageLayout; ","import React, { useState } from 'react';\nimport { COLORS } from '../../theme/colors.js';\n\n// Icon Circle component matching the React Native version\nconst IconCircle = ({ \n size = 40, \n children,\n className = ''\n}) => {\n return (\n <div \n className={`relative flex items-center justify-center border border-black border-opacity-25 ${className}`}\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n background: `linear-gradient(to bottom, ${COLORS.iconCircleGradientStart}, ${COLORS.iconCircleGradientEnd})`\n }}\n >\n {children || (\n <span \n className=\"font-semibold opacity-95\"\n style={{\n fontSize: '20px',\n color: COLORS.btnLabel,\n backgroundColor: 'transparent'\n }}\n >\n โ†’\n </span>\n )}\n </div>\n );\n};\n\n// Primary Button component matching the React Native design\nconst PrimaryButton = ({\n label = \"Get Started\",\n onClick,\n iconRight,\n loading = false,\n disabled = false,\n testId,\n className = '',\n style = {},\n textStyle = {},\n centered = false,\n ...props\n}) => {\n const [pressed, setPressed] = useState(false);\n\n const handleMouseDown = () => setPressed(true);\n const handleMouseUp = () => setPressed(false);\n const handleMouseLeave = () => setPressed(false);\n\n const buttonStyle = {\n height: '48px',\n borderRadius: '100px',\n border: `1px solid ${COLORS.btnBorder}`,\n background: `linear-gradient(to bottom, ${COLORS.btnGradStart}, ${COLORS.btnGradEnd})`,\n position: 'relative',\n overflow: 'hidden',\n width: centered ? 'auto' : '100%',\n minWidth: centered ? '250px' : 'auto',\n maxWidth: centered ? '350px' : 'none',\n margin: centered ? '0 auto' : '0',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.65 : 1,\n boxShadow: disabled ? 'none' : '20px 30px 40px rgba(0,0,0,0.10)',\n transition: 'all 0.2s ease',\n ...style\n };\n\n const pressedOverlayStyle = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.1)',\n borderRadius: '100px',\n opacity: pressed ? 1 : 0,\n transition: 'opacity 0.1s ease'\n };\n\n const textContainerStyle = {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'transparent'\n };\n\n const iconPositionStyle = {\n position: 'absolute',\n right: '4px',\n top: '4px',\n bottom: '4px',\n width: '40px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'transparent'\n };\n\n const labelStyle = {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontWeight: '600',\n fontSize: '16px',\n color: COLORS.btnLabel,\n textAlign: 'center',\n backgroundColor: 'transparent',\n ...textStyle\n };\n\n return (\n <button\n className={`relative ${className}`}\n style={buttonStyle}\n onClick={onClick}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n disabled={disabled || loading}\n data-testid={testId}\n aria-label={label}\n {...props}\n >\n {/* Pressed state overlay */}\n <div style={pressedOverlayStyle} />\n\n {/* Centered text container */}\n <div style={textContainerStyle}>\n {loading ? (\n <div \n className=\"animate-spin rounded-full border-2 border-white border-t-transparent\"\n style={{ width: '20px', height: '20px' }}\n />\n ) : (\n <span style={labelStyle}>{label}</span>\n )}\n </div>\n\n {/* Icon in fixed position on right */}\n <div style={iconPositionStyle}>\n {!loading && (iconRight || <IconCircle />)}\n </div>\n </button>\n );\n};\n\nexport { IconCircle };\nexport default PrimaryButton; ","import React, { useEffect, useState } from 'react';\nimport WelcomeScreen from './components/WelcomeScreen.jsx';\nimport EmailAuth from './components/EmailAuth.js';\nimport UniversalOnboarding from './components/UniversalOnboarding.jsx';\nimport PinSetup from './components/PinSetup.js';\nimport DataRequest from './components/DataRequest.js';\nimport TrainingComponent from './components/TrainingComponent.jsx';\nimport LoadingScreen from './components/LoadingScreen.jsx';\nimport { formatOnairosResponse } from './utils/responseFormatter.js';\nimport { ModalPageLayout } from './components/ui/PageLayout.jsx';\n\nexport function OnairosButton({\n requestData, \n webpageName, \n inferenceData = null, \n onComplete = null, \n autoFetch = true, // Auto-enabled for seamless testing experience\n testMode = false, // Production mode by default - set to true for testing\n proofMode = false, \n textLayout = 'below', \n textColor = 'white',\n login = false,\n buttonType = 'pill',\n loginReturn = null,\n loginType = 'signIn',\n visualType = 'full',\n appIcon = null,\n enableTraining = true,\n formatResponse = true,\n responseFormat = { includeDictionary: true, includeArray: true },\n priorityPlatform = null, // Platform to prioritize (e.g., 'gmail', 'pinterest', 'linkedin')\n rawMemoriesOnly = false, // Show only LLM connections when true\n rawMemoriesConfig = null // Configuration for RAW memories collection\n}) {\n\n const [showOverlay, setShowOverlay] = useState(false);\n const [currentFlow, setCurrentFlow] = useState('welcome'); // 'welcome' | 'email' | 'onboarding' | 'pin' | 'dataRequest' (training is within onboarding)\n const [userData, setUserData] = useState(null);\n const [error, setError] = useState(null);\n\n // Check for existing user session\n useEffect(() => {\n const checkExistingSession = () => {\n // In test mode, always start fresh to see the full flow\n if (testMode) {\n console.log('๐Ÿงช Test mode: Starting fresh flow, clearing any cached user data');\n localStorage.removeItem('onairosUser');\n setCurrentFlow('welcome');\n return;\n }\n \n const savedUser = localStorage.getItem('onairosUser');\n if (savedUser) {\n try {\n const user = JSON.parse(savedUser);\n setUserData(user);\n // If user has completed onboarding and PIN setup, go directly to data request\n if (user.onboardingComplete && user.pinCreated) {\n setCurrentFlow('dataRequest');\n } else if (user.verified && !user.onboardingComplete) {\n setCurrentFlow('onboarding');\n } else if (user.onboardingComplete && !user.pinCreated) {\n setCurrentFlow('pin');\n }\n } catch (error) {\n console.error('Error parsing saved user data:', error);\n localStorage.removeItem('onairosUser');\n }\n }\n };\n\n checkExistingSession();\n }, [testMode]);\n\n const openTerminal = async () => {\n try {\n console.log('๐Ÿ”ฅ openTerminal called - resetting flow');\n console.log('๐Ÿ”ฅ testMode prop:', testMode);\n console.log('๐Ÿ”ฅ window.onairosApiKey:', window.onairosApiKey);\n // ALWAYS reset flow on open to start fresh every time\n setCurrentFlow('welcome');\n setUserData(null);\n try { localStorage.removeItem('onairosUser'); } catch {}\n setShowOverlay(true);\n } catch (error) {\n console.error('Error in openTerminal:', error);\n }\n };\n\n const handleCloseOverlay = () => {\n setShowOverlay(false);\n setError(null);\n // Reset flow and session so next open starts fresh\n setCurrentFlow('welcome');\n try { localStorage.removeItem('onairosUser'); } catch {}\n setUserData(null);\n };\n\n // Handle clicks on the backdrop to close modal\n const handleBackdropClick = (e) => {\n if (e.target === e.currentTarget) {\n handleCloseOverlay();\n }\n };\n\n const handleWelcomeContinue = () => {\n console.log('๐Ÿ”ฅ Welcome screen continue clicked');\n setCurrentFlow('email');\n };\n\n const handleEmailAuthSuccess = (authData) => {\n console.log('๐Ÿ”ฅ Email auth successful:', authData);\n console.log('๐Ÿ”ง User State:', {\n isNewUser: authData.isNewUser,\n userState: authData.userState,\n flowType: authData.flowType,\n existingUser: authData.existingUser,\n hasAccountInfo: !!authData.accountInfo\n });\n \n // Determine flow based on API response - more explicit checking\n const isNewUser = authData.isNewUser === true || \n authData.existingUser === false || \n authData.flowType === 'onboarding' || \n authData.userState === 'new' ||\n !authData.accountInfo; // No account info means new user\n \n console.log('๐Ÿ” Flow determination:', {\n finalDecision: isNewUser ? 'NEW USER โ†’ onboarding (data connectors)' : 'EXISTING USER โ†’ dataRequest (data permissions)',\n reasoning: {\n isNewUser: authData.isNewUser,\n existingUserFalse: authData.existingUser === false,\n flowTypeOnboarding: authData.flowType === 'onboarding',\n noAccountInfo: !authData.accountInfo\n }\n });\n \n const newUserData = {\n ...authData,\n verified: true,\n onboardingComplete: !isNewUser, // New users need onboarding, returning users have completed it\n pinCreated: !isNewUser // Assume returning users have PIN, new users need to create it\n };\n \n setUserData(newUserData);\n localStorage.setItem('onairosUser', JSON.stringify(newUserData));\n \n // Flow decision logic - prioritize new user detection\n if (isNewUser) {\n console.log('๐Ÿš€ NEW USER detected โ†’ Starting onboarding flow (data connectors page)');\n setCurrentFlow('onboarding');\n } else {\n console.log('๐Ÿ‘‹ EXISTING USER detected โ†’ Going directly to data request (data permissions page)');\n setCurrentFlow('dataRequest');\n }\n };\n\n const handleOnboardingComplete = (onboardingData) => {\n console.log('Onboarding completed:', onboardingData);\n const updatedUserData = {\n ...userData,\n onboardingComplete: true,\n connectedAccounts: onboardingData.connectedAccounts || []\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n setCurrentFlow('pin');\n };\n\n const handlePinSetupComplete = async (pinData) => {\n console.log('PIN setup completed:', pinData);\n const updatedUserData = {\n ...userData,\n ...pinData,\n pinCreated: true\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // ๐Ÿ”ฅ FIX: Don't trigger training here - wait for user to approve data request\n console.log('โœ… PIN created - moving to data request (training will start after approval)');\n \n // Go directly to data request - user must approve before training starts\n setCurrentFlow('dataRequest');\n };\n\n const handleLoadingComplete = () => {\n setCurrentFlow('dataRequest');\n };\n\n const handleTrainingComplete = (trainingResult) => {\n console.log('๐ŸŽ“ Training completed:', trainingResult);\n const updatedUserData = {\n ...userData,\n trainingCompleted: true,\n ...trainingResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // Move to data request after training\n setCurrentFlow('dataRequest');\n };\n\n const handleDataRequestComplete = async (requestResult) => {\n console.log('๐Ÿ”ฅ OnairosButton: Data request completed:', requestResult);\n \n // Update user data with request result\n const updatedUserData = {\n ...userData,\n lastDataRequest: requestResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n // Do NOT auto-trigger training here. The host app (e.g., DelphiDemo)\n // will call the backend-chosen apiUrl for combined training/inference.\n\n // Close overlay immediately\n console.log('๐Ÿ”ฅ Closing overlay after data request completion');\n // Use centralized close to also reset flow and session\n handleCloseOverlay();\n\n // Format response if requested and API response is present\n let formattedResult = requestResult;\n if (formatResponse && requestResult?.apiResponse) {\n try {\n formattedResult = {\n ...requestResult,\n apiResponse: formatOnairosResponse(requestResult.apiResponse, responseFormat)\n };\n console.log('๐Ÿ”ฅ Response formatted with dictionary:', formattedResult.apiResponse?.personalityDict || 'No personality data');\n } catch (error) {\n console.warn('๐Ÿ”ฅ Error formatting response:', error);\n // Continue with original result if formatting fails\n }\n }\n\n // Enhanced user data formatting for better display\n const { logFormattedUserData } = require('./utils/userDataFormatter');\n \n // Add user data to the result for comprehensive formatting\n const completeResult = {\n ...formattedResult,\n userData: updatedUserData\n };\n\n // Log formatted user data for better readability\n const enhancedResult = logFormattedUserData(completeResult);\n\n // Call onComplete callback if provided\n console.log('๐Ÿ”ฅ Calling onComplete callback with enhanced result');\n if (onComplete) {\n try {\n onComplete(enhancedResult);\n console.log('๐Ÿ”ฅ onComplete callback executed successfully with enhanced formatting');\n } catch (error) {\n console.error('๐Ÿ”ฅ Error in onComplete callback:', error);\n }\n } else {\n console.log('๐Ÿ”ฅ No onComplete callback provided');\n }\n };\n\n const getFlowTitle = () => {\n switch (currentFlow) {\n case 'welcome':\n return ''; // WelcomeScreen handles its own titles\n case 'email':\n return ''; // EmailAuth handles its own titles\n case 'onboarding':\n return 'Connect Your Data';\n case 'pin':\n return 'Secure Your Account';\n case 'training':\n return 'Training Your Model';\n case 'dataRequest':\n return 'Data Request';\n default:\n return '';\n }\n };\n\n const getFlowSubtitle = () => {\n switch (currentFlow) {\n case 'welcome':\n return ''; // WelcomeScreen handles its own subtitles\n case 'email':\n return ''; // EmailAuth handles its own subtitles\n case 'onboarding':\n return 'Choose which accounts to connect for a personalized experience';\n case 'pin':\n return 'Create a secure PIN to protect your data';\n case 'training':\n return 'Building your personalized insights';\n case 'dataRequest':\n return `Select the data you want to share with ${webpageName}`;\n default:\n return '';\n }\n };\n\n const getFlowIcon = () => {\n switch (currentFlow) {\n case 'welcome':\n return ''; // WelcomeScreen handles its own layout\n case 'email':\n return ''; // EmailAuth handles its own layout\n case 'onboarding':\n return '๐Ÿ”—';\n case 'pin':\n return '๐Ÿ”’';\n case 'training':\n return 'โšก';\n case 'dataRequest':\n return '๐Ÿ“Š';\n default:\n return '';\n }\n };\n\n const renderCurrentFlow = () => {\n switch (currentFlow) {\n case 'welcome':\n return (\n <WelcomeScreen \n onContinue={handleWelcomeContinue}\n onClose={handleCloseOverlay}\n webpageName={webpageName}\n appIcon={appIcon}\n testMode={testMode}\n />\n );\n case 'email':\n return (\n <div className=\"h-[min(85vh,700px)]\">\n <EmailAuth \n onSuccess={handleEmailAuthSuccess}\n testMode={testMode} // Use the testMode prop from initialization\n />\n </div>\n );\n \n case 'onboarding':\n return (\n <UniversalOnboarding \n onComplete={handleOnboardingComplete}\n onBack={() => setCurrentFlow('email')}\n appIcon={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n appName={webpageName}\n username={userData?.email || userData?.username}\n testMode={testMode}\n priorityPlatform={priorityPlatform}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n );\n \n case 'pin':\n return (\n <PinSetup \n onComplete={handlePinSetupComplete}\n userEmail={userData?.email}\n />\n );\n \n case 'training':\n return (\n <TrainingComponent \n onComplete={handleTrainingComplete}\n userEmail={userData?.email}\n appName={webpageName}\n connectedAccounts={userData?.connectedAccounts || []}\n testMode={testMode}\n />\n );\n \n case 'dataRequest':\n console.log('๐Ÿ” [DEBUG] Rendering DataRequest with userData:', {\n email: userData?.email,\n userName: userData?.userName,\n hasUserData: !!userData,\n userDataKeys: userData ? Object.keys(userData) : []\n });\n return (\n <DataRequest \n onComplete={handleDataRequestComplete}\n userEmail={userData?.email || userData?.userName}\n requestData={requestData}\n appName={webpageName}\n autoFetch={autoFetch}\n testMode={testMode}\n appIcon={appIcon}\n connectedAccounts={userData?.connectedAccounts || {}}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n );\n \n default:\n return (\n <div className=\"flex flex-col items-center space-y-4 p-6\">\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\n <p className=\"text-gray-600\">Loading...</p>\n </div>\n );\n }\n };\n\n // Styling and button class based on visual type\n const buttonClass = \n `flex items-center justify-center font-bold rounded cursor-pointer ${\n buttonType === 'pill' ? 'px-4 py-2' : 'w-12 h-12'\n } bg-transparent OnairosConnect`;\n\n const buttonStyle = {\n flexDirection: textLayout === 'below' ? 'column' : 'row',\n backgroundColor: 'transparent',\n color: textColor,\n border: '1px solid transparent',\n };\n\n // Icon and text style based on the visualType\n const logoStyle = {\n width: '20px',\n height: '20px',\n marginRight: visualType === 'full' ? '12px' : '0',\n };\n\n const getText = () => {\n switch (loginType) {\n case 'signUp':\n return 'Sign Up with Onairos';\n case 'signOut':\n return 'Sign Out of Onairos';\n default:\n return 'Sign In with Onairos';\n }\n };\n\n return (\n <>\n <button\n className={buttonClass}\n onClick={openTerminal}\n style={buttonStyle}\n >\n {(visualType === 'full' || visualType === 'icon') && (\n <img\n src={login ? \"https://onairos.sirv.com/Images/OnairosWhite.png\" : \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n alt=\"Onairos Logo\"\n style={logoStyle}\n />\n )}\n {visualType !== 'icon' && (\n <span className={`${textColor === 'black' ? 'text-black' : 'text-white'} ${visualType === 'icon' ? 'sr-only' : ''} ${textLayout === 'right' ? 'ml-2' : textLayout === 'left' ? 'mr-2' : ''}`}>\n {getText()}\n </span>\n )}\n </button>\n\n {/* Modal with New Design */}\n {showOverlay && (\n <>\n {currentFlow === 'email' ? (\n // Special case for email - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={handleCloseOverlay}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Email Content */}\n <div className=\"h-[min(85vh,700px)]\">\n <EmailAuth \n onSuccess={handleEmailAuthSuccess}\n testMode={testMode}\n />\n </div>\n </div>\n </div>\n ) : currentFlow === 'onboarding' ? (\n // Special case for onboarding - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={() => setCurrentFlow('email')}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Onboarding Content */}\n <UniversalOnboarding \n onComplete={handleOnboardingComplete}\n onBack={() => setCurrentFlow('email')}\n appIcon={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n appName={webpageName}\n username={userData?.email || userData?.username}\n testMode={testMode}\n priorityPlatform={priorityPlatform}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n </div>\n </div>\n ) : currentFlow === 'dataRequest' ? (\n // Special case for dataRequest - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={() => setCurrentFlow('onboarding')}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* DataRequest Content */}\n <DataRequest \n onComplete={handleDataRequestComplete}\n userEmail={userData?.email || userData?.userName}\n requestData={requestData}\n appName={webpageName}\n autoFetch={autoFetch}\n testMode={testMode}\n appIcon={appIcon}\n connectedAccounts={userData?.connectedAccounts || {}}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n </div>\n </div>\n ) : currentFlow === 'pin' ? (\n // Special case for pin - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={() => setCurrentFlow('onboarding')}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* PinSetup Content - Must take remaining height */}\n <div className=\"flex-1 min-h-0\">\n <PinSetup \n onComplete={handlePinSetupComplete}\n onBack={() => setCurrentFlow('onboarding')}\n userEmail={userData?.email}\n />\n </div>\n </div>\n </div>\n ) : currentFlow === 'loading' ? (\n // Loading screen\n <LoadingScreen onComplete={handleLoadingComplete} />\n ) : (\n // All other flows use PageLayout wrapper\n <ModalPageLayout\n visible={showOverlay}\n onClose={handleCloseOverlay}\n showBackButton={currentFlow === 'training'}\n onBack={() => {\n if (currentFlow === 'email') setCurrentFlow('welcome');\n if (currentFlow === 'onboarding') setCurrentFlow('email');\n if (currentFlow === 'pin') setCurrentFlow('onboarding'); \n if (currentFlow === 'training') setCurrentFlow('pin');\n }}\n title={getFlowTitle()}\n subtitle={getFlowSubtitle()}\n icon={getFlowIcon()}\n centerContent={true}\n >\n {renderCurrentFlow()}\n </ModalPageLayout>\n )}\n </>\n )}\n </>\n );\n}\n\nexport default OnairosButton;","// Theme colors for Onairos SDK - derived from mobile design\nexport const COLORS = {\n // Button gradient colors\n btnGradStart: '#1A1A1A',\n btnGradEnd: '#000000',\n \n // Button text and icon colors\n btnLabel: '#FFFFFF',\n btnBorder: 'rgba(0, 0, 0, 0.2)',\n \n // Icon circle gradient colors\n iconCircleGradientStart: '#333333',\n iconCircleGradientEnd: '#1A1A1A',\n \n // Background colors\n background: '#FFFFFF',\n backgroundSecondary: '#F8F9FA',\n \n // Text colors\n textPrimary: '#1A1A1A',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n \n // Border colors\n border: '#E5E7EB',\n borderLight: '#F3F4F6',\n \n // Status colors\n success: '#10B981',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#3B82F6',\n \n // Interactive states\n hover: 'rgba(0, 0, 0, 0.05)',\n pressed: 'rgba(0, 0, 0, 0.1)',\n focus: 'rgba(59, 130, 246, 0.1)',\n};\n\nexport default COLORS; ","/**\n * API Response Logger for Onairos SDK\n * Provides detailed console logging with explanatory labels for API responses\n * \n * Response Format from Backend:\n * {\n * InferenceResult: {\n * output: [[0.95], [0.89], ...], // Content preference scores (0-1 scale)\n * traits: {\n * personality_traits: {\n * positive_traits: {...}, // Strengths (0-100 scale)\n * traits_to_improve: {...} // Growth areas (0-100 scale)\n * }\n * }\n * },\n * persona: {...}, // Optional: test persona info\n * inference_metadata: {...}, // Optional: context about inference\n * llmData: {...}, // Optional: LLM conversation data\n * available_personas: [...] // Optional: persona list\n * }\n */\n\n/**\n * Format a score as a visual bar\n * @param {number} score - Score between 0 and 1\n * @param {number} maxBars - Maximum number of bars to display\n * @returns {string} Visual bar representation\n */\nfunction formatScoreBar(score, maxBars = 10) {\n const filledBars = Math.round(score * maxBars);\n const emptyBars = maxBars - filledBars;\n return 'โ–ˆ'.repeat(filledBars) + 'โ–‘'.repeat(emptyBars);\n}\n\n/**\n * Format a percentage score as a visual bar\n * @param {number} score - Score between 0 and 100\n * @param {number} maxBars - Maximum number of bars to display\n * @returns {string} Visual bar representation\n */\nfunction formatPercentageBar(score, maxBars = 10) {\n const filledBars = Math.round((score / 100) * maxBars);\n const emptyBars = maxBars - filledBars;\n return 'โ–ˆ'.repeat(filledBars) + 'โ–‘'.repeat(emptyBars);\n}\n\n/**\n * Get emoji indicator for score level\n * @param {number} score - Score between 0 and 1\n * @returns {string} Emoji indicator\n */\nfunction getScoreEmoji(score) {\n if (score >= 0.8) return '๐Ÿ”ฅ';\n if (score >= 0.6) return 'โญ';\n if (score >= 0.4) return '๐Ÿ‘';\n if (score >= 0.2) return '๐Ÿ“Š';\n return '๐Ÿ“‰';\n}\n\n/**\n * Get emoji indicator for percentage score\n * @param {number} score - Score between 0 and 100\n * @returns {string} Emoji indicator\n */\nfunction getPercentageEmoji(score) {\n if (score >= 80) return '๐Ÿ”ฅ';\n if (score >= 60) return 'โญ';\n if (score >= 40) return '๐Ÿ‘';\n if (score >= 20) return '๐Ÿ“Š';\n return '๐Ÿ“‰';\n}\n\n/**\n * Log content preference scores with detailed explanations\n * @param {Array} output - Array of content preference scores\n */\nfunction logContentPreferences(output) {\n if (!output || !Array.isArray(output)) {\n console.log(' No content preference data available');\n return;\n }\n\n console.log(' ๐Ÿ“Š Content Preference Scores (0.0 = Not Interested, 1.0 = Highly Interested)');\n console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n \n // Category names for the 16 content types\n const categories = [\n 'Technology & Innovation',\n 'Entertainment & Media', \n 'Health & Wellness',\n 'Business & Finance',\n 'Education & Learning',\n 'Travel & Adventure',\n 'Food & Cooking',\n 'Sports & Fitness',\n 'Art & Creativity',\n 'Science & Research',\n 'Fashion & Style',\n 'Gaming & Esports',\n 'Music & Audio',\n 'News & Politics',\n 'Home & Garden',\n 'Automotive & Transport'\n ];\n\n const formattedScores = output.map((scoreArray, index) => {\n const score = Array.isArray(scoreArray) ? scoreArray[0] : scoreArray;\n const categoryName = categories[index] || `Category ${index + 1}`;\n return {\n Category: categoryName,\n Score: score.toFixed(3),\n 'Visual': `${formatScoreBar(score)} ${getScoreEmoji(score)}`,\n 'Interest Level': score >= 0.8 ? 'Very High' : \n score >= 0.6 ? 'High' : \n score >= 0.4 ? 'Moderate' : \n score >= 0.2 ? 'Low' : 'Very Low'\n };\n });\n\n console.table(formattedScores);\n \n // Summary statistics\n const scores = output.map(s => Array.isArray(s) ? s[0] : s);\n const avgScore = scores.reduce((a, b) => a + b, 0) / scores.length;\n const maxScore = Math.max(...scores);\n const minScore = Math.min(...scores);\n const topCategory = categories[scores.indexOf(maxScore)];\n \n console.log(` ๐Ÿ“ˆ Summary: Avg ${avgScore.toFixed(3)} | Max ${maxScore.toFixed(3)} (${topCategory}) | Min ${minScore.toFixed(3)}`);\n}\n\n/**\n * Log personality traits with detailed explanations\n * @param {Object} traits - Personality traits object\n */\nfunction logPersonalityTraits(traits) {\n if (!traits || !traits.personality_traits) {\n console.log(' No personality trait data available');\n return;\n }\n\n const { positive_traits, traits_to_improve } = traits.personality_traits;\n\n // Log positive traits (strengths)\n if (positive_traits && Object.keys(positive_traits).length > 0) {\n console.log(' โœจ Positive Traits (Strengths) - Scale: 0-100');\n console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n \n const positiveData = Object.entries(positive_traits).map(([trait, score]) => ({\n Trait: trait.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()),\n Score: score.toFixed(1),\n 'Visual': `${formatPercentageBar(score)} ${getPercentageEmoji(score)}`,\n 'Level': score >= 80 ? 'Exceptional' : \n score >= 60 ? 'Strong' : \n score >= 40 ? 'Moderate' : \n score >= 20 ? 'Developing' : 'Emerging'\n }));\n \n console.table(positiveData);\n }\n\n // Log traits to improve (growth areas)\n if (traits_to_improve && Object.keys(traits_to_improve).length > 0) {\n console.log(' ๐ŸŽฏ Traits to Improve (Growth Areas) - Scale: 0-100');\n console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n \n const improvementData = Object.entries(traits_to_improve).map(([trait, score]) => ({\n Trait: trait.replace(/_/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()),\n Score: score.toFixed(1),\n 'Visual': `${formatPercentageBar(score)} ${getPercentageEmoji(score)}`,\n 'Priority': score >= 80 ? 'High Priority' : \n score >= 60 ? 'Medium Priority' : \n score >= 40 ? 'Low Priority' : \n score >= 20 ? 'Optional' : 'Minimal'\n }));\n \n console.table(improvementData);\n }\n}\n\n/**\n * Log persona information\n * @param {Object} persona - Persona object\n */\nfunction logPersonaInfo(persona) {\n if (!persona) return;\n\n console.log(' ๐Ÿ‘ค Applied Persona');\n console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` Name: ${persona.name || 'Unknown'}`);\n console.log(` ID: ${persona.id || 'N/A'}`);\n if (persona.description) {\n console.log(` Description: ${persona.description}`);\n }\n}\n\n/**\n * Log inference metadata\n * @param {Object} metadata - Inference metadata object\n */\nfunction logInferenceMetadata(metadata) {\n if (!metadata) return;\n\n console.log(' โ„น๏ธ Inference Metadata');\n console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n if (metadata.size_used) console.log(` Model Size: ${metadata.size_used}`);\n if (metadata.total_outputs) console.log(` Total Outputs: ${metadata.total_outputs}`);\n if (metadata.persona_applied) console.log(` Persona Applied: ${metadata.persona_applied}`);\n if (metadata.inference_categories) {\n console.log(` Categories: ${metadata.inference_categories.join(', ')}`);\n }\n}\n\n/**\n * Log LLM conversation data\n * @param {Object} llmData - LLM data object\n */\nfunction logLLMData(llmData) {\n if (!llmData || !llmData.hasLlmData) {\n console.log(' No LLM conversation data included');\n return;\n }\n\n console.log(' ๐Ÿ’ฌ LLM Conversation Data');\n console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');\n console.log(` Total Interactions: ${llmData.totalInteractions || 0}`);\n \n if (llmData.platforms) {\n console.log(' Platforms:');\n Object.entries(llmData.platforms).forEach(([platform, count]) => {\n console.log(` ${platform}: ${count} interactions`);\n });\n }\n \n if (llmData.recentInteractions && llmData.recentInteractions.length > 0) {\n console.log(` Recent Interactions: ${llmData.recentInteractions.length} available`);\n }\n}\n\n/**\n * Main logging function for Onairos API responses\n * Logs the complete API response with detailed explanations\n * \n * @param {Object} response - The complete API response object\n * @param {string} endpoint - The endpoint that was called (for context)\n * @param {Object} options - Logging options\n * @param {boolean} options.detailed - Whether to show detailed logs (default: true)\n * @param {boolean} options.showRawData - Whether to show raw response data (default: false)\n */\nexport function logOnairosResponse(response, endpoint = 'unknown', options = {}) {\n const { detailed = true, showRawData = false } = options;\n\n console.group('๐ŸŽฏ Onairos API Response');\n console.log(`๐Ÿ“ก Endpoint: ${endpoint}`);\n console.log(`โฐ Timestamp: ${new Date().toISOString()}`);\n console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');\n\n if (!response) {\n console.error('โŒ No response data received');\n console.groupEnd();\n return;\n }\n\n // Log InferenceResult data\n if (response.InferenceResult) {\n console.group('๐Ÿ“Š Inference Result');\n \n // Log content preferences (output scores)\n if (response.InferenceResult.output) {\n console.group('๐ŸŽฏ Content Preferences');\n logContentPreferences(response.InferenceResult.output);\n console.groupEnd();\n }\n \n // Log personality traits\n if (response.InferenceResult.traits) {\n console.group('๐Ÿง  Personality Analysis');\n logPersonalityTraits(response.InferenceResult.traits);\n console.groupEnd();\n }\n \n console.groupEnd();\n }\n\n // Log persona information (test mode)\n if (response.persona) {\n console.group('๐Ÿ‘ค Persona Information');\n logPersonaInfo(response.persona);\n console.groupEnd();\n }\n\n // Log inference metadata\n if (response.inference_metadata) {\n console.group('โ„น๏ธ Metadata');\n logInferenceMetadata(response.inference_metadata);\n console.groupEnd();\n }\n\n // Log LLM data if included\n if (response.llmData) {\n console.group('๐Ÿ’ฌ LLM Data');\n logLLMData(response.llmData);\n console.groupEnd();\n }\n\n // Log available personas if present\n if (response.available_personas && Array.isArray(response.available_personas)) {\n console.group('๐Ÿ‘ฅ Available Personas');\n console.log(` Total: ${response.available_personas.length} personas available`);\n console.table(response.available_personas.map(p => ({\n ID: p.id,\n Name: p.name,\n Description: p.description?.substring(0, 50) + '...'\n })));\n console.groupEnd();\n }\n\n // Show raw data if requested\n if (showRawData) {\n console.group('๐Ÿ“ฆ Raw Response Data');\n console.log(response);\n console.groupEnd();\n }\n\n console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');\n console.log('โœ… Response logging complete');\n console.groupEnd();\n}\n\n/**\n * Log a simplified version of the response (for production)\n * @param {Object} response - The API response\n * @param {string} endpoint - The endpoint called\n */\nexport function logOnairosResponseSimple(response, endpoint = 'unknown') {\n console.log('๐ŸŽฏ Onairos API Response:', {\n endpoint,\n timestamp: new Date().toISOString(),\n hasInferenceResult: !!response?.InferenceResult,\n hasContentPreferences: !!response?.InferenceResult?.output,\n hasPersonalityTraits: !!response?.InferenceResult?.traits,\n hasLLMData: !!response?.llmData?.hasLlmData,\n contentCategoriesCount: response?.InferenceResult?.output?.length || 0,\n personalityTraitsCount: response?.InferenceResult?.traits?.personality_traits ? \n Object.keys(response.InferenceResult.traits.personality_traits.positive_traits || {}).length +\n Object.keys(response.InferenceResult.traits.personality_traits.traits_to_improve || {}).length : 0\n });\n}\n\nexport default {\n logOnairosResponse,\n logOnairosResponseSimple\n};\n\n\n","/**\n * Response formatter utility for Onairos SDK\n * Converts array-based responses to dictionary format for better developer experience\n */\n\n// Standard 16 personality types in order that the API returns them\nexport const PERSONALITY_TYPES = [\n 'Analyst',\n 'Diplomat', \n 'Sentinel',\n 'Explorer',\n 'Architect',\n 'Logician',\n 'Commander',\n 'Debater',\n 'Advocate',\n 'Mediator',\n 'Protagonist',\n 'Campaigner',\n 'Logistician',\n 'Defender',\n 'Executive',\n 'Consul'\n];\n\n// Standard trait categories that might be returned\nexport const TRAIT_CATEGORIES = [\n 'Openness',\n 'Conscientiousness',\n 'Extraversion',\n 'Agreeableness',\n 'Neuroticism'\n];\n\n/**\n * Formats API response to include both array and dictionary formats\n * @param {Object} apiResponse - Raw API response from Onairos\n * @param {Object} options - Formatting options\n * @param {boolean} options.includeDictionary - Whether to include dictionary format (default: true)\n * @param {boolean} options.includeArray - Whether to include original array format (default: true)\n * @returns {Object} Formatted response with both formats\n */\nexport function formatOnairosResponse(apiResponse, options = {}) {\n const { includeDictionary = true, includeArray = true } = options;\n \n if (!apiResponse) {\n return apiResponse;\n }\n\n const formatted = { ...apiResponse };\n\n // Handle personality scores if present\n if (apiResponse.InferenceResult?.traits || apiResponse.traits || apiResponse.scores) {\n const scores = apiResponse.InferenceResult?.traits || apiResponse.traits || apiResponse.scores;\n \n if (Array.isArray(scores) && scores.length >= 16) {\n if (includeDictionary) {\n // Create personality dictionary\n const personalityDict = {};\n PERSONALITY_TYPES.forEach((type, index) => {\n personalityDict[type] = scores[index];\n });\n \n // Add to formatted response\n if (formatted.InferenceResult) {\n formatted.InferenceResult.personalityDict = personalityDict;\n } else {\n formatted.personalityDict = personalityDict;\n }\n }\n \n if (!includeArray) {\n // Remove array format if not requested\n if (formatted.InferenceResult?.traits) {\n delete formatted.InferenceResult.traits;\n }\n if (formatted.traits) {\n delete formatted.traits;\n }\n if (formatted.scores) {\n delete formatted.scores;\n }\n }\n }\n }\n\n // Handle trait data if present (for preferences/traits)\n if (apiResponse.traitResult || apiResponse.traits) {\n const traits = apiResponse.traitResult || apiResponse.traits;\n \n if (Array.isArray(traits) && includeDictionary) {\n const traitDict = {};\n TRAIT_CATEGORIES.forEach((category, index) => {\n if (traits[index] !== undefined) {\n traitDict[category] = traits[index];\n }\n });\n \n formatted.traitDict = traitDict;\n }\n }\n\n return formatted;\n}\n\n/**\n * Legacy formatter for backward compatibility\n * Converts scores array to personality dictionary only\n * @param {Array} scores - Array of personality scores\n * @returns {Object} Dictionary with personality type names as keys\n */\nexport function formatPersonalityScores(scores) {\n if (!Array.isArray(scores) || scores.length < 16) {\n console.warn('Invalid scores array provided to formatPersonalityScores');\n return {};\n }\n\n const personalityDict = {};\n PERSONALITY_TYPES.forEach((type, index) => {\n personalityDict[type] = scores[index];\n });\n \n return personalityDict;\n}\n\n/**\n * Get personality type names in order\n * @returns {Array} Array of personality type names\n */\nexport function getPersonalityTypes() {\n return [...PERSONALITY_TYPES];\n}\n\n/**\n * Get trait category names in order \n * @returns {Array} Array of trait category names\n */\nexport function getTraitCategories() {\n return [...TRAIT_CATEGORIES];\n} ","/**\n * Enhanced User Data Formatter for onComplete Callback\n * Provides structured, readable formatting of Onairos user data\n */\n\n/**\n * Formats user data for better readability in onComplete callback\n * @param {Object} result - The complete result object from data request\n * @returns {Object} Enhanced result with formatted user data display\n */\nexport function formatUserDataForDisplay(result) {\n if (!result) return result;\n\n const formatted = { ...result };\n \n // Create a structured summary of the user data\n const userDataSummary = {\n // Basic request information\n requestInfo: {\n timestamp: result.timestamp || new Date().toISOString(),\n appName: result.appName || 'Unknown App',\n userHash: result.userHash || 'Unknown User',\n testMode: result.testMode || false,\n dataTypesRequested: result.approvedData || []\n },\n \n // User authentication and profile data\n userProfile: {\n email: result.userData?.email || 'Not provided',\n userType: result.userData?.userType || 'Unknown',\n onboardingComplete: result.userData?.onboardingComplete || false,\n pinCreated: result.userData?.pinCreated || false,\n trainingComplete: result.userData?.trainingComplete || false,\n modelReady: result.userData?.modelReady || false\n },\n \n // Connected platforms/accounts\n connectedAccounts: formatConnectedAccounts(result.userData?.connectedAccounts || []),\n \n // API response data (personality, preferences, etc.)\n aiData: formatAIResponseData(result.apiResponse),\n \n // Success status and any errors\n status: {\n success: result.success || false,\n hasApiResponse: !!result.apiResponse,\n hasErrors: !!result.error || !!result.apiError\n }\n };\n\n // Add the formatted summary to the result\n formatted.userDataSummary = userDataSummary;\n \n // Create a pretty-printed version for console logging\n formatted.prettyPrint = createPrettyPrintVersion(userDataSummary);\n \n return formatted;\n}\n\n/**\n * Formats connected accounts data\n * @param {Array} accounts - Array of connected account objects\n * @returns {Object} Formatted accounts summary\n */\nfunction formatConnectedAccounts(accounts) {\n if (!Array.isArray(accounts) || accounts.length === 0) {\n return {\n count: 0,\n platforms: [],\n summary: 'No connected accounts'\n };\n }\n\n return {\n count: accounts.length,\n platforms: accounts.map(account => ({\n name: account.platform || account.name || 'Unknown Platform',\n status: account.status || 'Unknown',\n connectedAt: account.connectedAt || 'Unknown date',\n hasData: account.hasData || false\n })),\n summary: `${accounts.length} platform(s) connected: ${accounts.map(a => a.platform || a.name).join(', ')}`\n };\n}\n\n/**\n * Formats AI response data (personality scores, traits, etc.)\n * @param {Object} apiResponse - The API response containing AI data\n * @returns {Object} Formatted AI data summary\n */\nfunction formatAIResponseData(apiResponse) {\n if (!apiResponse) {\n return {\n available: false,\n summary: 'No AI data available'\n };\n }\n\n const aiData = {\n available: true,\n dataTypes: []\n };\n\n // Check for personality data\n if (apiResponse.InferenceResult?.traits || apiResponse.personalityDict || apiResponse.traits) {\n const personalityData = {\n type: 'personality',\n available: true\n };\n\n // If we have dictionary format, use it for better readability\n if (apiResponse.personalityDict) {\n personalityData.data = apiResponse.personalityDict;\n personalityData.summary = `Personality analysis with ${Object.keys(apiResponse.personalityDict).length} traits`;\n } else if (apiResponse.InferenceResult?.traits) {\n personalityData.data = apiResponse.InferenceResult.traits;\n personalityData.summary = `Personality scores array with ${apiResponse.InferenceResult.traits.length} values`;\n } else if (apiResponse.traits) {\n personalityData.data = apiResponse.traits;\n personalityData.summary = `Personality traits with ${Array.isArray(apiResponse.traits) ? apiResponse.traits.length : Object.keys(apiResponse.traits).length} items`;\n }\n\n aiData.dataTypes.push(personalityData);\n }\n\n // Check for preferences/traits data\n if (apiResponse.traitResult || apiResponse.traitDict) {\n const preferencesData = {\n type: 'preferences',\n available: true\n };\n\n if (apiResponse.traitDict) {\n preferencesData.data = apiResponse.traitDict;\n preferencesData.summary = `Preferences analysis with ${Object.keys(apiResponse.traitDict).length} categories`;\n } else if (apiResponse.traitResult) {\n preferencesData.data = apiResponse.traitResult;\n preferencesData.summary = `Trait results with ${Array.isArray(apiResponse.traitResult) ? apiResponse.traitResult.length : Object.keys(apiResponse.traitResult).length} items`;\n }\n\n aiData.dataTypes.push(preferencesData);\n }\n\n // Check for basic info/output\n if (apiResponse.InferenceResult?.output || apiResponse.output) {\n aiData.dataTypes.push({\n type: 'basic_info',\n available: true,\n data: apiResponse.InferenceResult?.output || apiResponse.output,\n summary: 'Basic user information and insights'\n });\n }\n\n // Create overall summary\n aiData.summary = aiData.dataTypes.length > 0 \n ? `AI analysis complete with ${aiData.dataTypes.length} data type(s): ${aiData.dataTypes.map(d => d.type).join(', ')}`\n : 'AI data structure present but no recognized data types found';\n\n return aiData;\n}\n\n/**\n * Creates a pretty-printed version for console logging\n * @param {Object} userDataSummary - The formatted user data summary\n * @returns {string} Pretty-printed string for console output\n */\nfunction createPrettyPrintVersion(userDataSummary) {\n const lines = [];\n \n lines.push('๐ŸŽ‰ ONAIROS USER DATA SUMMARY');\n lines.push('=' .repeat(50));\n \n // Request Info\n lines.push('\\n๐Ÿ“‹ REQUEST INFORMATION:');\n lines.push(` App: ${userDataSummary.requestInfo.appName}`);\n lines.push(` User: ${userDataSummary.requestInfo.userHash}`);\n lines.push(` Mode: ${userDataSummary.requestInfo.testMode ? 'Test' : 'Production'}`);\n lines.push(` Data Types: ${userDataSummary.requestInfo.dataTypesRequested.join(', ') || 'None'}`);\n lines.push(` Timestamp: ${new Date(userDataSummary.requestInfo.timestamp).toLocaleString()}`);\n \n // User Profile\n lines.push('\\n๐Ÿ‘ค USER PROFILE:');\n lines.push(` Email: ${userDataSummary.userProfile.email}`);\n lines.push(` Type: ${userDataSummary.userProfile.userType}`);\n lines.push(` Onboarding: ${userDataSummary.userProfile.onboardingComplete ? 'โœ…' : 'โŒ'}`);\n lines.push(` PIN Setup: ${userDataSummary.userProfile.pinCreated ? 'โœ…' : 'โŒ'}`);\n lines.push(` Training: ${userDataSummary.userProfile.trainingComplete ? 'โœ…' : 'โŒ'}`);\n lines.push(` Model Ready: ${userDataSummary.userProfile.modelReady ? 'โœ…' : 'โŒ'}`);\n \n // Connected Accounts\n lines.push('\\n๐Ÿ”— CONNECTED ACCOUNTS:');\n lines.push(` ${userDataSummary.connectedAccounts.summary}`);\n if (userDataSummary.connectedAccounts.platforms.length > 0) {\n userDataSummary.connectedAccounts.platforms.forEach(platform => {\n lines.push(` โ€ข ${platform.name}: ${platform.status} ${platform.hasData ? '(has data)' : '(no data)'}`);\n });\n }\n \n // AI Data\n lines.push('\\n๐Ÿค– AI ANALYSIS DATA:');\n lines.push(` ${userDataSummary.aiData.summary}`);\n if (userDataSummary.aiData.dataTypes.length > 0) {\n userDataSummary.aiData.dataTypes.forEach(dataType => {\n lines.push(` โ€ข ${dataType.type.toUpperCase()}: ${dataType.summary}`);\n });\n }\n \n // Status\n lines.push('\\nโœ… STATUS:');\n lines.push(` Success: ${userDataSummary.status.success ? 'โœ…' : 'โŒ'}`);\n lines.push(` API Response: ${userDataSummary.status.hasApiResponse ? 'โœ…' : 'โŒ'}`);\n lines.push(` Errors: ${userDataSummary.status.hasErrors ? 'โŒ Yes' : 'โœ… None'}`);\n \n lines.push('\\n' + '=' .repeat(50));\n \n return lines.join('\\n');\n}\n\n/**\n * Console logging helper that prints formatted user data\n * @param {Object} result - The result object from onComplete\n */\nexport function logFormattedUserData(result) {\n const formatted = formatUserDataForDisplay(result);\n \n console.log('\\n' + formatted.prettyPrint + '\\n');\n \n // Also log the structured data for programmatic access\n console.log('๐Ÿ“Š Structured User Data Summary:', formatted.userDataSummary);\n \n return formatted;\n}\n\nexport default {\n formatUserDataForDisplay,\n logFormattedUserData\n};\n"],"names":["dataTypes","id","name","description","icon","required","tooltip","privacyLink","DataTypeToggle","_ref","dataType","isEnabled","onToggle","isLast","React","className","iconName","iconProps","_extends","fill","viewBox","d","getIconComponent","onClick","handleToggle","concat","fillRule","clipRule","_ref2","userEmail","testMode","onComplete","autoFetch","appName","formatResponse","responseFormat","rawMemoriesOnly","rawMemoriesConfig","requestData","connectedAccounts","selectedData","setSelectedData","useState","getInitialSelectedData","initial","basic","Array","isArray","forEach","rawMemories","personality","preferences","isLoadingApi","setIsLoadingApi","apiError","setApiError","handleDataToggle","dataId","enabled","find","dt","prev","_objectSpread","selectedCount","Object","values","filter","Boolean","length","connectedPlatforms","getConnectedPlatforms","console","log","platforms","entries","_ref5","_","v","map","_ref6","k","stroke","strokeLinecap","strokeLinejoin","strokeWidth","index","key","platform","imageSrc","Instagram","YouTube","LinkedIn","Reddit","Pinterest","GitHub","Facebook","Gmail","Twitter","ChatGPT","Claude","Gemini","Grok","src","alt","title","onError","e","warn","target","style","display","async","userHash","email","hash","str","Date","now","toString","i","charCodeAt","Math","abs","generateUserHash","approvedData","_ref3","value","_ref4","mapDataTypesToConfirmations","confirmations","currentDate","toISOString","dataTypeMapping","push","data","date","apiEndpoint","baseResult","apiUrl","timestamp","setTimeout","simulatedApiData","InferenceResult","output","from","random","traits","personality_traits","positive_traits","creativity","empathy","leadership","analytical_thinking","communication","traits_to_improve","patience","time_management","delegation","persona","inference_metadata","size_used","total_outputs","persona_applied","logOnairosResponse","require","detailed","showRawData","result","apiResponse","success","simulated","error","requestBody","Info","storage","appId","account","EncryptedUserPin","proofMode","Domain","window","location","hostname","web3Type","fetch","method","headers","body","JSON","stringify","ok","Error","status","apiData","json","message","errorResult","disabled","cancelled","EmailAuth","onSuccess","setEmail","code","setCode","step","setStep","isLoading","setIsLoading","setError","useEffect","firstInput","document","querySelector","focus","handleEmailSubmit","preventDefault","test","validateEmail","baseUrl","onairosBaseUrl","apiKey","onairosApiKey","response","trim","toLowerCase","handleGoogleAuth","_localStorage$getItem","sdkConfig","enableHealthMonitoring","enableAutoRefresh","enableConnectionValidation","username","localStorage","getItem","authorizeUrl","params","URLSearchParams","sdk_type","return_url","origin","fullUrl","popup","open","checkInterval","setInterval","closed","clearInterval","Google","handleCodeSubmit","simulatedResponse","verified","token","userName","split","existingUser","accountInfo","isNewUser","flowType","adminMode","userCreated","accountDetails","createdAt","testAccount","jwtToken","height","type","onChange","placeholder","fontFamily","color","COLORS","fontWeight","fontSize","lineHeight","textPrimary","textSecondary","maxLength","newCode","join","_e$target$parentEleme","nextInput","parentElement","children","onKeyDown","_e$target$parentEleme2","prevInput","borderColor","border","backgroundColor","background","PrimaryButton","label","loading","testId","flex","minHeight","Check","LoadingScreen","currentStep","setCurrentStep","dotCount","setDotCount","loadingStates","progress","stateInterval","nextStep","dotInterval","currentState","zIndex","pointerEvents","maxWidth","width","aspectRatio","Lottie","animationData","rainAnim","loop","autoplay","repeat","PinSetup","onBack","pin","setPin","pinRequirements","setPinRequirements","uppercase","number","allRequirementsMet","overflow","WebkitTextFillColor","handleSubmit","pinCreated","undefined","TrainingComponent","_steps$currentStep","_steps$currentStep2","_steps$currentStep3","_steps$currentStep4","_steps$currentStep5","setProgress","isComplete","setIsComplete","steps","duration","interval","stepTimeout","stepDuration","stepProgress","newProgress","min","completionDelay","trainingComplete","simulatedTraining","clearTimeout","info","round","borderLight","backgroundSecondary","textMuted","chatgptIcon","claudeIcon","geminiIcon","grokIcon","process","env","REACT_APP_ONAIROS_API_KEY","REACT_APP_ONAIROS_BASE_URL","sdkType","fadeSlideInKeyframes","UniversalOnboarding","lottieRef","useRef","lastFrameRef","rafRef","setConnectedAccounts","isConnecting","setIsConnecting","connectingPlatform","setConnectingPlatform","selected","setSelected","currentPage","setCurrentPage","touchStartX","touchDeltaX","vh","setVh","innerHeight","onResize","addEventListener","removeEventListener","personaSide","SLOT","max","floor","ACTIVE_SCALE","igGradId","useId","Brand","objectFit","cx","cy","r","offset","stopColor","x","y","rx","aiLinks","descriptions","allPlatforms","connector","directLink","page","slice","p","removeItem","s","userData","parse","accountsObj","reduce","acc","handleSwitch","plat","_JSON$parse","res","session","candidates","youtube","linkedin","reddit","pinterest","instagram","github","facebook","gmail","oauthUrl","touched","it","close","_unused","_unused2","_unused3","_unused4","connectToPlatform","connectedCount","current","totalFrames","personaAnim","start","startTs","performance","t","eased","frame","goToAndStop","requestAnimationFrame","cancelAnimationFrame","maxHeight","position","left","top","transform","opacity","onTouchStart","touches","clientX","onTouchMove","onTouchEnd","dx","gridAutoFlow","gridTemplateColumns","columnGap","alignItems","justifyItems","paddingInline","idx","on","isSel","shift","animation","transformOrigin","marginTop","marginBottom","n","role","transition","paddingBottom","connected","totalConnections","xmlns","WelcomeScreen","onContinue","onClose","script","createElement","head","appendChild","existingScript","removeChild","PageLayout","subtitle","showHeader","showCloseButton","showBackButton","contentClassName","centerContent","props","_objectWithoutProperties","_excluded","layoutStyle","flexDirection","headerStyle","padding","contentStyle","justifyContent","titleStyle","margin","textAlign","subtitleStyle","ModalPageLayout","visible","onBackdropClick","backdropStyle","modalStyle","pageLayoutProps","_excluded2","backdropStyles","right","bottom","willChange","modalStyles","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","boxShadow","currentTarget","IconCircle","size","borderRadius","iconCircleGradientStart","iconCircleGradientEnd","btnLabel","iconRight","textStyle","centered","pressed","setPressed","buttonStyle","btnBorder","btnGradStart","btnGradEnd","minWidth","cursor","pressedOverlayStyle","labelStyle","onMouseDown","handleMouseDown","onMouseUp","handleMouseUp","onMouseLeave","handleMouseLeave","OnairosButton","webpageName","inferenceData","textLayout","textColor","login","buttonType","loginReturn","loginType","visualType","appIcon","enableTraining","includeDictionary","includeArray","priorityPlatform","showOverlay","setShowOverlay","currentFlow","setCurrentFlow","setUserData","checkExistingSession","savedUser","user","onboardingComplete","handleCloseOverlay","handleWelcomeContinue","handleEmailAuthSuccess","authData","userState","hasAccountInfo","finalDecision","reasoning","existingUserFalse","flowTypeOnboarding","noAccountInfo","newUserData","setItem","handleOnboardingComplete","onboardingData","updatedUserData","handlePinSetupComplete","pinData","handleTrainingComplete","trainingResult","trainingCompleted","handleDataRequestComplete","requestResult","lastDataRequest","formattedResult","_formattedResult$apiR","formatOnairosResponse","personalityDict","logFormattedUserData","enhancedResult","buttonClass","logoStyle","marginRight","getText","DataRequest","handleLoadingComplete","getFlowTitle","getFlowSubtitle","getFlowIcon","renderCurrentFlow","hasUserData","userDataKeys","keys","warning","hover","formatScoreBar","score","maxBars","arguments","filledBars","emptyBars","formatPercentageBar","getScoreEmoji","getPercentageEmoji","endpoint","options","group","groupEnd","metadata","llmData","categories","formattedScores","scoreArray","Category","Score","toFixed","table","scores","avgScore","a","b","maxScore","minScore","topCategory","indexOf","logContentPreferences","positiveData","trait","Trait","replace","l","toUpperCase","improvementData","logPersonalityTraits","inference_categories","hasLlmData","totalInteractions","count","recentInteractions","available_personas","_p$description","ID","Name","Description","substring","logOnairosResponseSimple","_response$InferenceRe","_response$InferenceRe2","_response$llmData","_response$InferenceRe3","_response$InferenceRe4","hasInferenceResult","hasContentPreferences","hasPersonalityTraits","hasLLMData","contentCategoriesCount","personalityTraitsCount","PERSONALITY_TYPES","TRAIT_CATEGORIES","_apiResponse$Inferenc","formatted","_apiResponse$Inferenc2","_formatted$InferenceR","traitResult","traitDict","category","formatPersonalityScores","getPersonalityTypes","getTraitCategories","formatUserDataForDisplay","_result$userData","_result$userData2","_result$userData3","_result$userData4","_result$userData5","_result$userData6","_result$userData7","userDataSummary","requestInfo","dataTypesRequested","userProfile","userType","modelReady","formatConnectedAccounts","aiData","formatAIResponseData","hasApiResponse","hasErrors","prettyPrint","lines","toLocaleString","summary","hasData","createPrettyPrintVersion","accounts","connectedAt","_apiResponse$Inferenc3","available","personalityData","preferencesData","_apiResponse$Inferenc4"],"sourceRoot":""}
1
+ {"version":3,"file":"src_onairosButton_jsx.js","mappings":"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","sources":["webpack://OnairosLaravel/./src/components/DataRequest.js","webpack://OnairosLaravel/./src/components/EmailAuth.js","webpack://OnairosLaravel/./src/components/LoadingScreen.jsx","webpack://OnairosLaravel/./src/components/PinSetup.js","webpack://OnairosLaravel/./src/components/TrainingComponent.jsx","webpack://OnairosLaravel/./src/components/UniversalOnboarding.jsx","webpack://OnairosLaravel/./src/components/WelcomeScreen.jsx","webpack://OnairosLaravel/./src/components/connectors/ChatGPTConnector.js","webpack://OnairosLaravel/./src/components/ui/PageLayout.jsx","webpack://OnairosLaravel/./src/components/ui/PrimaryButton.jsx","webpack://OnairosLaravel/./src/onairosButton.jsx","webpack://OnairosLaravel/./src/theme/colors.js","webpack://OnairosLaravel/./src/utils/responseFormatter.js","webpack://OnairosLaravel/./src/utils/userDataFormatter.js"],"sourcesContent":["import React, { useState } from \"react\";\n\n/* -------------------------\n ICON COMPONENTS\n-------------------------- */\nconst Icon = ({ type }) => {\n const base = \"w-4 h-4 text-gray-700\";\n\n switch (type) {\n case \"User\":\n return (\n <svg className={base} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4\n 1.79-4 4 1.79 4 4 4zm0 2c-2.67\n 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/>\n </svg>\n );\n case \"Memory\":\n return (\n <svg className={base} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2\n 12s4.48 10 10 10 10-4.48 10-10S17.52\n 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/>\n </svg>\n );\n case \"Grid3X3\":\n return (\n <svg className={base} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M3 13h8V3H3v10zm0 8h8v-6H3v6zm10\n 0h8V11h-8v10zm0-18v6h8V3h-8z\"/>\n </svg>\n );\n case \"Brain\":\n return (\n <svg className={base} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M11.99 2C6.47 2 2 6.48 2\n 12s4.47 10 9.99 10C17.52\n 22 22 17.52 22 12S17.52\n 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8\n 8-8 8 3.58 8 8-3.58 8-8\n 8zm3.5-9c.83 0 1.5-.67\n 1.5-1.5S16.33 8 15.5\n 8 14 8.67 14 9.5s.67 1.5\n 1.5 1.5zm-7 0c.83 0 1.5-.67\n 1.5-1.5S9.33 8 8.5\n 8 7 8.67 7 9.5s.67 1.5\n 1.5 1.5zm3.5 6.5c2.33\n 0 4.31-1.46 5.11-3.5H6.89c.8\n 2.04 2.78 3.5 5.11 3.5z\"/>\n </svg>\n );\n default:\n return null;\n }\n};\n\n/* -------------------------\n TOGGLE (soft apple style)\n-------------------------- */\nconst DataTypeToggle = ({ dataType, enabled, onToggle }) => {\n const handle = () => {\n if (dataType.required) return;\n onToggle(dataType.id, !enabled);\n };\n\n return (\n <button\n onClick={handle}\n className=\"\n w-full flex items-center justify-between\n py-2.5 px-2\n bg-white/40 backdrop-blur-sm\n hover:bg-white/70\n transition rounded-xl shadow-sm\n \"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"w-7 h-7 flex items-center justify-center rounded-full bg-gray-100\">\n <Icon type={dataType.icon} />\n </div>\n <span className=\"text-[14px] text-gray-900 font-medium\">\n {dataType.name}\n </span>\n </div>\n\n <div\n className={`w-5 h-5 rounded-md border flex items-center justify-center shadow-sm\n transition\n ${enabled\n ? \"bg-gray-900 border-gray-900\"\n : \"bg-white border-gray-300\"\n }`}\n >\n {enabled && (\n <svg className=\"w-3 h-3 text-white\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M16.707 5.293a1 1 0 010\n 1.414l-8 8a1 1 0 01-1.414\n 0l-4-4a1 1 0 011.414-1.414L8\n 12.586l7.293-7.293a1 1 0\n 011.414 0z\"/>\n </svg>\n )}\n </div>\n </button>\n );\n};\n\n/* -------------------------\n MAIN COMPONENT\n-------------------------- */\n\nconst options = [\n { id: \"basic\", name: \"Basic Profile\", icon: \"User\", required: true },\n { id: \"rawMemories\", name: \"Raw Memory Data\", icon: \"Memory\" },\n { id: \"preferences\", name: \"User Preferences\", icon: \"Grid3X3\" },\n { id: \"personality\", name: \"Personality Traits\", icon: \"Brain\" },\n];\n\nconst DataRequest = ({ appName = \"My App\", onComplete, connectedPlatforms = [] }) => {\n const [selected, setSelected] = useState({\n basic: true,\n rawMemories: false,\n preferences: false,\n personality: false,\n });\n\n const [freq, setFreq] = useState(\"weekly\");\n\n const toggle = (id, val) =>\n setSelected((p) => ({ ...p, [id]: val }));\n\n const selectedCount = Object.values(selected).filter(Boolean).length;\n\n // Ensure we actually show connected platforms even if prop isn't passed\n const getConnected = () => {\n // If array provided, use it\n if (Array.isArray(connectedPlatforms) && connectedPlatforms.length > 0) return connectedPlatforms;\n // If object provided, map truthy keys\n if (connectedPlatforms && typeof connectedPlatforms === \"object\" && !Array.isArray(connectedPlatforms)) {\n return Object.entries(connectedPlatforms).filter(([_, v]) => Boolean(v)).map(([k]) => k);\n }\n // Fallback: try localStorage onairosUser\n try {\n const u = JSON.parse(localStorage.getItem(\"onairosUser\") || \"{}\");\n if (u && u.connectedAccounts && typeof u.connectedAccounts === \"object\") {\n return Object.entries(u.connectedAccounts).filter(([_, v]) => Boolean(v)).map(([k]) => k);\n }\n } catch {}\n return [];\n };\n const platforms = getConnected();\n\n const freqToPercent = (f) => (f === \"once\" ? 0 : f === \"weekly\" ? 50 : 100);\n const handleRailClick = (e) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));\n const ratio = x / rect.width;\n if (ratio < 1 / 3) setFreq(\"once\");\n else if (ratio < 2 / 3) setFreq(\"weekly\");\n else setFreq(\"daily\");\n };\n\n return (\n <div className=\"flex flex-col h-full max-h-[90vh] bg-white/70 backdrop-blur-2xl rounded-3xl overflow-hidden\">\n\n {/* CONTENT */}\n <div className=\"flex-1 overflow-y-auto px-6 pt-10 pb-4\">\n\n {/* ICONS */}\n <div className=\"flex justify-center items-center gap-4 mb-6\">\n <div className=\"w-12 h-12 rounded-2xl bg-white shadow flex items-center justify-center\">\n <Icon type=\"User\" />\n </div>\n <svg className=\"w-4 h-4 text-gray-400\" fill=\"none\" stroke=\"currentColor\">\n <path strokeWidth={2} strokeLinecap=\"round\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n <div className=\"w-12 h-12 rounded-2xl bg-white shadow flex items-center justify-center\">\n <span className=\"text-xl font-serif font-bold\">B</span>\n </div>\n </div>\n\n {/* TITLE */}\n <div className=\"text-center mb-8\">\n <h1 className=\"text-[24px] md:text-[26px] font-semibold text-gray-900 leading-tight tracking-tight\">\n {appName} wants to personalize your experience\n </h1>\n <p className=\"text-[13px] text-gray-500 mt-1\">choose what to share</p>\n </div>\n\n {/* TOGGLES */}\n <div className=\"grid grid-cols-2 gap-4 mb-10\">\n {options.map((opt) => (\n <DataTypeToggle\n key={opt.id}\n dataType={opt}\n enabled={selected[opt.id]}\n onToggle={toggle}\n />\n ))}\n </div>\n\n {/* FREQUENCY PANEL */}\n <div className=\"p-5 rounded-3xl bg-white/50 backdrop-blur-md border border-black/5 shadow-sm\">\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-sm font-medium text-gray-900\">\n How often can {appName} receive updates?\n </span>\n <span className=\"text-[11px] text-gray-500\">\n {freq === \"once\"\n ? \"one-time only\"\n : freq === \"weekly\"\n ? \"once per week\"\n : \"once per day\"}\n </span>\n </div>\n\n {/* SLIDER: subtle rail, monochrome progress, click-to-set */}\n <div\n className=\"relative h-2.5 rounded-full bg-gray-200/90 overflow-hidden mb-4 border border-black/5 shadow-inner cursor-pointer\"\n onClick={handleRailClick}\n >\n <div\n className=\"absolute h-full transition-all rounded-full\"\n style={{\n width: `${freqToPercent(freq)}%`,\n background: \"linear-gradient(90deg, rgba(31,41,55,0.95) 0%, rgba(107,114,128,0.9) 60%, rgba(209,213,219,0.85) 100%)\",\n }}\n />\n {/* Tick marks for 3 stops */}\n <span className=\"absolute left-0 top-1/2 -translate-y-1/2 w-[2px] h-3 bg-black/10\" />\n <span className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[2px] h-3 bg-black/10\" />\n <span className=\"absolute right-0 top-1/2 -translate-y-1/2 w-[2px] h-3 bg-black/10\" />\n {/* Thumb indicator (sleek) */}\n <span\n className=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-4.5 h-4.5 rounded-full bg-white border border-black/20 shadow-md\"\n style={{\n left: `${freqToPercent(freq)}%`,\n }}\n />\n </div>\n\n <div className=\"grid grid-cols-3 text-center text-[12px] font-medium\">\n <button onClick={() => setFreq(\"once\")} className=\"text-gray-700\">1ร— only</button>\n <button onClick={() => setFreq(\"weekly\")} className=\"text-gray-900 font-semibold\">1ร— weekly</button>\n <button onClick={() => setFreq(\"daily\")} className=\"text-gray-700\">1ร— daily</button>\n </div>\n\n <p className=\"text-[11px] text-gray-500 mt-3 leading-snug\">\n This only controls update frequency; It does not grant more access.\n </p>\n </div>\n\n {/* CONNECTED PLATFORMS (appears at the bottom of content; no overlap with footer) */}\n {platforms && platforms.length > 0 ? (\n <div className=\"mt-6 mb-2 rounded-2xl bg-white/60 backdrop-blur border border-black/5 p-3\">\n <div className=\"text-center text-xs text-gray-500 mb-2\">Connected Platforms</div>\n <div className=\"flex justify-center items-center gap-2 flex-wrap\">\n {platforms.map((platform, index) => {\n const logoMap = {\n Instagram: 'https://upload.wikimedia.org/wikipedia/commons/a/a5/Instagram_icon.png',\n YouTube: 'https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg',\n LinkedIn: 'https://upload.wikimedia.org/wikipedia/commons/c/ca/LinkedIn_logo_initials.png',\n Reddit: 'https://www.redditinc.com/assets/images/site/reddit-logo.png',\n Pinterest: 'https://upload.wikimedia.org/wikipedia/commons/0/08/Pinterest-logo.png',\n GitHub: 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png',\n Facebook: 'https://upload.wikimedia.org/wikipedia/commons/5/51/Facebook_f_logo_%282019%29.svg',\n Gmail: 'https://upload.wikimedia.org/wikipedia/commons/7/7e/Gmail_icon_%282020%29.svg',\n Twitter: 'https://upload.wikimedia.org/wikipedia/commons/6/6f/Logo_of_Twitter.svg',\n ChatGPT: 'https://anushkasirv.sirv.com/openai.png',\n Claude: 'https://anushkasirv.sirv.com/claude-color.png',\n Gemini: 'https://anushkasirv.sirv.com/gemini-color.png',\n Grok: 'https://anushkasirv.sirv.com/grok.png'\n };\n const src = logoMap[platform] || '';\n return (\n <img\n key={`${platform}-${index}`}\n src={src}\n alt={platform}\n title={platform}\n className=\"w-6 h-6 rounded-md shadow-sm hover:scale-110 transition\"\n onError={(e) => { e.currentTarget.style.display = 'none'; }}\n />\n );\n })}\n </div>\n </div>\n ) : null}\n </div>\n\n {/* FOOTER */}\n <div className=\"px-6 py-5 bg-white/80 backdrop-blur border-t border-black/5\">\n <button\n className=\"w-full rounded-full py-3 bg-gray-900 !text-white text-sm font-medium shadow-sm flex items-center justify-center gap-2 mb-3\"\n disabled={selectedCount === 0}\n onClick={() => {\n if (selectedCount === 0) return;\n onComplete?.({\n approved: Object.keys(selected).filter(id => selected[id]),\n freq,\n });\n }}\n >\n Accept & Continue\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\">\n <path strokeWidth={2} strokeLinecap=\"round\" d=\"M9 5l7 7-7 7\"/>\n </svg>\n </button>\n\n <style>{`\n .decline-button {\n color: #000000 !important;\n }\n .decline-button * {\n color: #000000 !important;\n }\n .decline-button span {\n color: #000000 !important;\n }\n button.decline-button {\n color: #000000 !important;\n }\n .decline-button-text {\n color: #000000 !important;\n -webkit-text-fill-color: #000000 !important;\n }\n `}</style>\n <button\n className=\"w-full rounded-full py-3 bg-gray-100 text-sm font-medium shadow-sm decline-button\"\n style={{ color: '#000000' }}\n onClick={() => {\n onComplete?.({\n approved: [],\n freq,\n declined: true,\n });\n }}\n >\n <span className=\"decline-button-text\" style={{ color: '#000000' }}>Decline</span>\n </button>\n </div>\n </div>\n );\n};\n\nexport default DataRequest;\n","import React, { useState, useEffect } from 'react';\nimport { Mail, ArrowRight, Check } from 'lucide-react';\nimport PrimaryButton from './ui/PrimaryButton.jsx';\nimport { COLORS } from '../theme/colors.js';\n\nexport default function EmailAuth({ onSuccess, testMode = true }) {\n const [email, setEmail] = useState('');\n const [code, setCode] = useState('');\n const [step, setStep] = useState('email'); // 'email' | 'code' | 'success'\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n const [emailSent, setEmailSent] = useState(true); // Track if email was actually sent\n const [emailServiceMessage, setEmailServiceMessage] = useState(''); // Store service message\n\n // Auto-focus first PIN input when code step loads\n useEffect(() => {\n if (step === 'code') {\n // Small delay to ensure DOM is ready\n setTimeout(() => {\n const firstInput = document.querySelector('input[maxLength=\"1\"]');\n if (firstInput) {\n firstInput.focus();\n }\n }, 100);\n }\n }, [step]);\n\n const validateEmail = (email) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n };\n\n const handleEmailSubmit = async (e) => {\n e.preventDefault();\n setError('');\n setEmailSent(true); // Reset email status\n setEmailServiceMessage(''); // Reset service message\n\n if (!validateEmail(email)) {\n setError('Please enter a valid email address');\n return;\n }\n\n setIsLoading(true);\n\n try {\n if (testMode) {\n // Test mode: Skip API call completely, simulate instant success\n console.log('๐Ÿงช Test mode: Simulating email verification request for:', email);\n setTimeout(() => {\n setStep('code');\n setIsLoading(false);\n console.log('๐Ÿงช Test mode: Email verification simulated successfully');\n }, 800); // Shorter delay for faster testing\n } else {\n // Production mode: Use proper email verification API from schema\n const baseUrl = (typeof window !== 'undefined' && window.onairosBaseUrl) || 'https://api2.onairos.uk';\n const apiKey = (typeof window !== 'undefined' && window.onairosApiKey) || 'ona_VvoHNg1fdCCUa9eBy4Iz3IfvXdgLfMFI7TNcyHLDKEadPogkbjAeE2iDOs6M7Aey';\n \n const response = await fetch(`${baseUrl}/email/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify({\n email: (email || '').trim().toLowerCase()\n }),\n });\n\n if (!response.ok) {\n throw new Error('Failed to send verification code');\n }\n\n const data = await response.json();\n if (!data.success) {\n throw new Error(data.error || 'Failed to send verification code');\n }\n\n console.log('๐Ÿ“ง Email request response:', data);\n\n // Store email service status\n setEmailSent(data.emailSent !== false); // Default to true if not specified\n setEmailServiceMessage(data.message || '');\n\n setStep('code');\n setIsLoading(false);\n }\n } catch (error) {\n console.error('Email request error:', error);\n setError(error.message);\n setIsLoading(false);\n }\n };\n\n const handleGoogleAuth = async () => {\n try {\n setIsLoading(true);\n setError('');\n\n // Create temporary account identifier for OAuth flow\n const tempId = `google_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n localStorage.setItem('onairos_temp_google_id', tempId);\n console.log('โœ… Temporary account created for Google OAuth');\n\n const sdkConfig = {\n baseUrl: 'https://api2.onairos.uk',\n apiKey: window.onairosApiKey || 'test-key',\n };\n\n const username = localStorage.getItem('username') || \n (JSON.parse(localStorage.getItem('onairosUser') || '{}')?.email) || \n tempId;\n \n console.log('๐Ÿ”— Requesting Gmail OAuth URL for Google authentication...');\n \n // Request OAuth URL from backend\n const res = await fetch(`${sdkConfig.baseUrl}/gmail/authorize`, {\n method: 'POST',\n headers: {\n 'x-api-key': sdkConfig.apiKey,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n session: { username }\n })\n });\n\n if (!res.ok) {\n throw new Error('Failed to get OAuth URL');\n }\n\n const data = await res.json();\n const oauthUrl = data.gmailURL || data.gmailUrl || data.gmail_url || data.url;\n \n if (!oauthUrl) {\n throw new Error('No OAuth URL received from backend');\n }\n\n console.log('๐Ÿš€ Opening Google OAuth popup...');\n\n // Open popup for OAuth\n const popup = window.open(\n oauthUrl,\n 'google_oauth',\n 'width=500,height=600,scrollbars=yes,resizable=yes,status=no,location=no,toolbar=no,menubar=no'\n );\n\n if (!popup) {\n throw new Error('Popup blocked. Please allow popups for this site.');\n }\n\n // Set up postMessage listener for cross-origin communication\n const messageHandler = (event) => {\n // Only accept messages from onairos.uk origin\n if (event.origin !== 'https://api2.onairos.uk' && \n event.origin !== 'https://onairos.uk' &&\n !event.origin.includes('onairos.uk')) {\n return;\n }\n\n if (event.data && event.data.type === 'oauth-success' && event.data.platform === 'gmail') {\n console.log('โœ… OAuth success received via postMessage:', event.data);\n window.removeEventListener('message', messageHandler);\n handleOAuthSuccess(event.data.email || event.data.gmailEmail);\n }\n };\n\n window.addEventListener('message', messageHandler);\n console.log('๐Ÿ‘‚ [POSTMESSAGE] Listener registered, waiting for messages...');\n\n // Poll localStorage for OAuth completion (oauth-callback.html sets this)\n let pollCount = 0;\n const maxPolls = 300; // 5 minutes max (300 * 1 second)\n const localStorageKey = 'onairos_gmail_success';\n const timestampKey = 'onairos_gmail_timestamp';\n\n const pollInterval = setInterval(() => {\n pollCount++;\n \n try {\n // Check if popup is closed (user might have closed it manually)\n // If closed after OAuth redirect (pollCount > 10 = ~10 seconds), try fallback\n if (popup.closed && pollCount > 10) {\n clearInterval(pollInterval);\n window.removeEventListener('message', messageHandler);\n console.log('โš ๏ธ OAuth popup was closed, trying fallback to get email from backend...');\n retrieveAndContinueWithGoogleEmail(username, tempId);\n return;\n }\n\n // Check localStorage for success signal\n const success = localStorage.getItem(localStorageKey);\n const timestamp = localStorage.getItem(timestampKey);\n \n if (success === 'true' && timestamp) {\n const timestampNum = parseInt(timestamp, 10);\n const now = Date.now();\n \n // Only process if timestamp is recent (within last 30 seconds)\n if (now - timestampNum < 30000) {\n console.log('โœ… Cross-origin detected - OAuth popup navigated to onairos.uk');\n clearInterval(pollInterval);\n window.removeEventListener('message', messageHandler);\n \n // Try to get email from URL params (stored by oauth-callback.html)\n // The callback URL includes: ?success=true&platform=gmail&email=...\n // We need to retrieve email from backend since we can't access popup.location\n retrieveAndContinueWithGoogleEmail(username, tempId);\n }\n }\n\n // Check for cross-origin navigation (don't access popup.location - causes COOP error)\n // Instead, rely on localStorage and postMessage signals\n if (pollCount === 1) {\n console.log('โœ… Cross-origin detected - waiting for postMessage/localStorage...');\n }\n\n // Timeout after max polls\n if (pollCount >= maxPolls) {\n clearInterval(pollInterval);\n window.removeEventListener('message', messageHandler);\n setIsLoading(false);\n console.log('โณ [TIMEOUT] PostMessage not received after 5 minutes, closing popup and trying fallback...');\n \n // Try fallback: retrieve email from backend\n if (popup.closed) {\n retrieveAndContinueWithGoogleEmail(username, tempId);\n } else {\n try {\n popup.close();\n } catch (e) {}\n setError('OAuth timeout. Please try again.');\n }\n }\n } catch (error) {\n console.error('Error in OAuth polling:', error);\n }\n }, 1000);\n\n // Cleanup function\n const cleanup = () => {\n clearInterval(pollInterval);\n window.removeEventListener('message', messageHandler);\n try {\n localStorage.removeItem(localStorageKey);\n localStorage.removeItem(timestampKey);\n } catch (e) {}\n };\n\n // Store cleanup function for component unmount\n if (typeof window !== 'undefined') {\n window._onairosOAuthCleanup = cleanup;\n }\n\n } catch (error) {\n console.error('โŒ Google OAuth failed:', error);\n setError('Google authentication failed. Please try again.');\n setIsLoading(false);\n }\n };\n\n // Helper function to retrieve Gmail email from backend and continue flow\n const retrieveAndContinueWithGoogleEmail = async (username, tempId) => {\n try {\n console.log('๐Ÿ“ง Retrieving Gmail email from backend for user:', username || tempId);\n \n // First, try to get email from localStorage (set by oauth-callback.html)\n let gmailEmail = localStorage.getItem('onairos_gmail_email');\n if (gmailEmail) {\n console.log('โœ… Gmail email retrieved from localStorage:', gmailEmail);\n handleOAuthSuccess(gmailEmail);\n return;\n }\n\n const sdkConfig = {\n baseUrl: 'https://api2.onairos.uk',\n apiKey: window.onairosApiKey || 'test-key',\n };\n\n // Try to get email from backend\n const emailRes = await fetch(`${sdkConfig.baseUrl}/gmail/get-email`, {\n method: 'POST',\n headers: {\n 'x-api-key': sdkConfig.apiKey,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n username: username || tempId\n })\n });\n\n if (emailRes.ok) {\n const emailData = await emailRes.json();\n gmailEmail = emailData.email;\n console.log('โœ… Gmail email retrieved from backend:', gmailEmail);\n } else {\n console.warn('โš ๏ธ Could not retrieve Gmail email from backend');\n // Last resort: use temp username or prompt user\n gmailEmail = username && username.includes('@') ? username : `${tempId}@gmail.com`;\n console.log('โš ๏ธ Using fallback email:', gmailEmail);\n }\n\n // Continue with email verification flow using Gmail email\n handleOAuthSuccess(gmailEmail);\n\n } catch (error) {\n console.error('โŒ Error retrieving Gmail email:', error);\n // Continue anyway with fallback\n handleOAuthSuccess(`${tempId}@gmail.com`);\n }\n };\n\n // Helper function to handle OAuth success (Gmail)\n const handleOAuthSuccess = async (gmailEmail) => {\n try {\n setIsLoading(true);\n console.log('โœ… Google OAuth completed successfully, email:', gmailEmail);\n\n // For Gmail SSO we trust Google's email verification and skip the 6โ€‘digit code.\n // We still record the email locally and immediately continue into onboarding.\n const normalizedEmail = (gmailEmail || '').trim().toLowerCase();\n setEmail(normalizedEmail);\n\n // Simulate a successful verification response and jump straight to success โ†’ UniversalOnboarding\n setStep('success');\n setIsLoading(false);\n\n setTimeout(() => {\n onSuccess({\n email: normalizedEmail,\n verified: true,\n token: null,\n userName: normalizedEmail.split('@')[0],\n existingUser: false,\n accountInfo: null,\n isNewUser: true,\n flowType: 'onboarding',\n adminMode: false,\n userCreated: true,\n accountDetails: {\n email: normalizedEmail,\n createdAt: new Date().toISOString(),\n ssoProvider: 'gmail'\n }\n });\n }, 400);\n \n } catch (error) {\n console.error('โŒ Error handling OAuth success:', error);\n setError('Failed to continue with Google authentication. Please try again.');\n setIsLoading(false);\n }\n };\n\n const handleCodeSubmit = async (e) => {\n e.preventDefault();\n setError('');\n setIsLoading(true);\n\n try {\n if (testMode) {\n // Test mode: Skip API call completely, simulate verification\n console.log('๐Ÿงช Test mode: Simulating code verification for:', email, 'with code:', code);\n \n if (code === '123456' || code.length === 6) {\n setStep('success');\n setTimeout(() => {\n // Simulate new user for design testing\n const simulatedResponse = { \n email, \n verified: true, \n token: 'test-token-' + Date.now(),\n userName: email.split('@')[0],\n existingUser: false, // Always simulate new user for full flow testing\n accountInfo: null,\n isNewUser: true,\n flowType: 'onboarding',\n adminMode: false,\n userCreated: true,\n accountDetails: {\n email: email,\n createdAt: new Date().toISOString(),\n testAccount: true\n }\n };\n console.log('๐Ÿงช Test mode: Simulated verification successful, user data:', simulatedResponse);\n onSuccess(simulatedResponse);\n }, 600); // Faster for design testing\n } else {\n setError('Invalid code. Use any 6-digit code (e.g., 123456) for testing.');\n setIsLoading(false);\n }\n } else {\n // Production mode: Use real email verification API from schema\n const baseUrl = (typeof window !== 'undefined' && window.onairosBaseUrl) || 'https://api2.onairos.uk';\n const apiKey = (typeof window !== 'undefined' && window.onairosApiKey) || 'ona_VvoHNg1fdCCUa9eBy4Iz3IfvXdgLfMFI7TNcyHLDKEadPogkbjAeE2iDOs6M7Aey';\n \n const response = await fetch(`${baseUrl}/email/verify/confirm`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'Authorization': `Bearer ${apiKey}`\n },\n body: JSON.stringify({\n email: (email || '').trim().toLowerCase(),\n code: code.trim()\n }),\n });\n\n if (!response.ok) {\n throw new Error('Invalid verification code');\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || 'Verification failed');\n }\n\n console.log('๐Ÿ“ง Email verification response:', data);\n\n setStep('success');\n setTimeout(() => {\n // Pass complete API response for flow determination\n onSuccess({ \n email, \n verified: true, \n token: data.token || data.jwtToken,\n userName: data.userName,\n existingUser: data.existingUser,\n accountInfo: data.accountInfo,\n isNewUser: !data.existingUser, // Set based on API response\n flowType: data.existingUser ? 'dataRequest' : 'onboarding',\n adminMode: data.adminMode,\n userCreated: data.userCreated,\n accountDetails: data.accountDetails\n });\n }, 1000);\n }\n } catch (error) {\n console.error('Email verification error:', error);\n setError(error.message || 'Invalid code. Please try again.');\n setIsLoading(false);\n }\n };\n\n const renderEmailStep = () => (\n <div className=\"w-full flex flex-col\" style={{ height: '100%' }}>\n {/* Content - Flexible center area */}\n <div className=\"px-12 pt-16 pb-8 text-center flex-1 flex flex-col\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-gray-900 mb-2 text-balance leading-tight\">\n Use pre-existing Persona or create a new one in seconds\n </h1>\n <p className=\"text-gray-600 text-base\">Sign in or create an account</p>\n </div>\n\n <div className=\"mb-6\">\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Enter your email\"\n className=\"w-full max-w-sm mx-auto px-4 py-4 text-base bg-gray-50 border-0 rounded-xl !text-black placeholder:text-gray-400 focus:bg-white focus:ring-2 focus:ring-gray-200 outline-none transition-all duration-200\"\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif',\n WebkitTextFillColor: '#000000'\n }}\n required\n />\n </div>\n\n <div className=\"mb-6 text-center\">\n <span className=\"text-gray-500 text-sm\">Or</span>\n </div>\n\n <div className=\"mb-8\">\n <style>{`\n .google-button-text {\n color: #000000 !important;\n }\n `}</style>\n <button\n type=\"button\"\n className=\"w-full max-w-sm mx-auto py-4 text-base font-medium rounded-xl border border-gray-200 hover:bg-gray-50 flex items-center justify-center gap-3 bg-transparent transition-colors google-button-text\"\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif',\n color: '#000000'\n }}\n onClick={handleGoogleAuth}\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n <span className=\"google-button-text\" style={{ color: '#000000' }}>Continue with Google</span>\n </button>\n </div>\n\n {/* Error Display */}\n {error && (\n <div className=\"mb-6\">\n <p className=\"text-sm text-center\" style={{ color: COLORS.error }}>{error}</p>\n </div>\n )}\n </div>\n\n {/* Continue Button - Fixed at bottom */}\n <div className=\"px-12 pb-8 flex-shrink-0\">\n <button\n className=\"w-full max-w-sm mx-auto bg-gray-900 hover:bg-gray-800 text-white rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 transition-colors disabled:opacity-50\"\n onClick={handleEmailSubmit}\n disabled={isLoading || !email.trim()}\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif'\n }}\n >\n {isLoading ? 'Loading...' : 'Continue'}\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n );\n\n const renderCodeStep = () => (\n <div className=\"w-full flex flex-col\" style={{ height: '100%' }}>\n {/* Heading - matching VerificationStep.tsx */}\n <div className=\"w-full pt-16 px-12 mb-10 text-center\">\n <h1 \n className=\"font-bold mb-2\"\n style={{ \n fontFamily: 'IBM Plex Sans, system-ui, sans-serif',\n fontWeight: '700',\n fontSize: '24px',\n lineHeight: '32px',\n color: COLORS.textPrimary\n }}\n >\n Enter verification code\n </h1>\n <p \n className=\"mb-2\"\n style={{ \n fontFamily: 'Inter, system-ui, sans-serif',\n fontWeight: '400',\n fontSize: '16px',\n lineHeight: '24px',\n color: COLORS.textSecondary\n }}\n >\n {emailSent ? `We've sent a 6-digit code to ${email}` : `A verification code has been generated for ${email}`}\n </p>\n {!emailSent && (\n <div \n className=\"mb-4 mx-auto max-w-sm px-4 py-3 rounded-lg border\"\n style={{ \n backgroundColor: '#FEF3C7',\n borderColor: '#FCD34D',\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#92400E'\n }}\n >\n <p className=\"font-medium mb-1\">โš ๏ธ Email service unavailable</p>\n <p className=\"text-sm\">\n {emailServiceMessage.includes('testing mode') || emailServiceMessage.includes('server logs') \n ? 'Any 6-digit code will be accepted. Check server logs for the actual code.'\n : 'The verification code was generated but could not be sent. Please check server logs or contact support.'}\n </p>\n </div>\n )}\n </div>\n\n\n {/* Code Input - matching VerificationStep design with individual digit boxes */}\n <div className=\"px-12 mb-6\">\n <div className=\"flex justify-center space-x-3\">\n {Array.from({ length: 6 }, (_, index) => (\n <input\n key={index}\n type=\"text\"\n maxLength=\"1\"\n value={code[index] || ''}\n onChange={(e) => {\n const newCode = code.split('');\n newCode[index] = e.target.value;\n setCode(newCode.join(''));\n \n // Auto-focus next input\n if (e.target.value && index < 5) {\n const nextInput = e.target.parentElement?.children[index + 1];\n if (nextInput) nextInput.focus();\n }\n }}\n onKeyDown={(e) => {\n // Handle backspace to focus previous input\n if (e.key === 'Backspace' && !code[index] && index > 0) {\n const prevInput = e.target.parentElement?.children[index - 1];\n if (prevInput) prevInput.focus();\n }\n }}\n className=\"w-12 h-12 border rounded-lg text-center text-lg font-medium focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n style={{ \n borderColor: COLORS.border,\n backgroundColor: COLORS.background,\n fontFamily: 'Inter, system-ui, sans-serif'\n }}\n />\n ))}\n </div>\n </div>\n\n {/* Error Display */}\n {error && (\n <div className=\"px-12 mb-6\">\n <p className=\"text-sm text-center\" style={{ color: COLORS.error }}>{error}</p>\n </div>\n )}\n\n {/* Continue Button - positioned right below code inputs */}\n <div className=\"px-12 mb-6\">\n <div className=\"max-w-sm mx-auto\">\n <PrimaryButton\n label=\"Continue\"\n onClick={handleCodeSubmit}\n loading={isLoading}\n disabled={isLoading || code.length !== 6}\n testId=\"verify-code-button\"\n className=\"!text-white\"\n textStyle={{ color: '#FFFFFF' }}\n />\n </div>\n </div>\n\n {/* Spacer */}\n <div style={{ flex: 1, minHeight: '20px' }} />\n\n {/* Back to email option */}\n <div className=\"px-12 w-full\">\n <div className=\"max-w-sm mx-auto\">\n <button\n type=\"button\"\n onClick={() => setStep('email')}\n className=\"w-full py-2 px-4 font-medium transition-colors text-sm\"\n style={{ color: COLORS.textSecondary }}\n >\n Use a different email\n </button>\n </div>\n </div>\n </div>\n );\n\n const renderSuccessStep = () => (\n <div className=\"w-full flex flex-col items-center space-y-6 pt-16 px-12\">\n <div \n className=\"flex items-center justify-center w-16 h-16 rounded-full\"\n style={{ backgroundColor: '#D1FAE5' }}\n >\n <Check className=\"w-8 h-8\" style={{ color: COLORS.success }} />\n </div>\n \n <div className=\"text-center space-y-2\">\n <h2 \n className=\"text-xl font-semibold\"\n style={{ color: COLORS.textPrimary }}\n >\n Email verified!\n </h2>\n <p style={{ color: COLORS.textSecondary }}>Setting up your account...</p>\n </div>\n\n <div className=\"w-8 h-8\">\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\n </div>\n </div>\n );\n\n return (\n <div className=\"w-full\">\n {step === 'email' && renderEmailStep()}\n {step === 'code' && renderCodeStep()}\n {step === 'success' && renderSuccessStep()}\n </div>\n );\n} \n","import React, { useState, useEffect } from \"react\";\nimport Lottie from 'lottie-react';\nimport rainAnim from '../../public/rain-anim.json';\n\nexport default function LoadingScreen({ onComplete }) {\n const [currentStep, setCurrentStep] = useState(0);\n const [dotCount, setDotCount] = useState(0);\n\n const loadingStates = [\n { message: \"Validating PIN and continuing training\", progress: 20 },\n { message: \"Uploading model to secure storage\", progress: 40 },\n { message: \"Running test inference\", progress: 60 },\n { message: \"Storing results in databases\", progress: 80 },\n { message: \"Complete!\", progress: 100 },\n ];\n\n useEffect(() => {\n const stateInterval = setInterval(() => {\n setCurrentStep((prev) => {\n const nextStep = prev + 1;\n if (nextStep >= loadingStates.length) {\n // Loading complete, call onComplete after a short delay\n setTimeout(() => {\n onComplete();\n }, 1000);\n return prev; // Keep at last step\n }\n return nextStep;\n });\n }, 3000); // Change state every 3 seconds\n\n return () => clearInterval(stateInterval);\n }, [loadingStates.length, onComplete]);\n\n useEffect(() => {\n const dotInterval = setInterval(() => {\n setDotCount((prev) => (prev + 1) % 4); // 0, 1, 2, 3 dots\n }, 500); // Change dots every 500ms\n\n return () => clearInterval(dotInterval);\n }, []);\n\n const currentState = loadingStates[currentStep];\n\n return (\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647, pointerEvents: 'auto' }}>\n {/* Modal - Full height from bottom */}\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"px-6 pt-6 pb-4 flex-shrink-0\">\n </div>\n\n {/* Content - Rain animation and loading state */}\n <div className=\"flex-1 flex flex-col px-6\">\n {/* Rain Animation */}\n <div className=\"flex-1 flex items-center justify-center\">\n <div style={{ width: '100%', maxWidth: '400px', aspectRatio: '1' }}>\n <Lottie\n animationData={rainAnim}\n loop={true}\n autoplay={true}\n style={{ width: '100%', height: '100%' }}\n />\n </div>\n </div>\n\n {/* Loading State - Positioned at bottom */}\n <div className=\"flex-shrink-0 pb-12\">\n <div className=\"text-center\">\n <h1 className=\"font-bold text-gray-900 leading-tight mb-6\" style={{ fontSize: 'clamp(16px, 4vw, 20px)' }}>\n {currentState.message}\n {currentState.message !== \"Complete!\" && (\n <span className=\"inline-block w-8 text-left\">{\".\".repeat(dotCount)}</span>\n )}\n </h1>\n\n <div className=\"mx-auto\" style={{ width: 'clamp(200px, 50vw, 300px)' }}>\n <div className=\"w-full h-2 bg-gray-200 rounded-full\">\n <div\n className=\"h-2 bg-gray-900 rounded-full transition-all duration-1000 ease-out\"\n style={{ width: `${currentState.progress}%` }}\n ></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Bottom spacing */}\n <div className=\"h-20 flex-shrink-0\"></div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\n\nexport default function PinSetup({ onComplete, onBack, userEmail }) {\n const [pin, setPin] = useState('');\n const [pinRequirements, setPinRequirements] = useState({\n length: false,\n uppercase: false,\n number: false,\n });\n\n // Check PIN requirements\n useEffect(() => {\n setPinRequirements({\n length: pin.length >= 6,\n uppercase: /[A-Z]/.test(pin),\n number: /\\d/.test(pin),\n });\n }, [pin]);\n\n const allRequirementsMet = pinRequirements.length && pinRequirements.uppercase && pinRequirements.number;\n\n const handleSubmit = () => {\n if (allRequirementsMet) {\n onComplete({\n pin: pin, // This should be hashed in production\n pinCreated: true,\n timestamp: new Date().toISOString()\n });\n }\n };\n\n return (\n <div className=\"w-full h-full flex flex-col\" style={{ height: '100%', minHeight: 0 }}>\n {/* Content - Flexible center area */}\n <div className=\"px-6 pt-16 flex-1 flex flex-col\" style={{ minHeight: 0, overflow: 'hidden' }}>\n <div className=\"mb-6 flex-shrink-0\">\n <h1 className=\"text-2xl font-bold text-gray-900 mb-2\">Create a PIN</h1>\n <p className=\"text-gray-600 text-base\">A PIN so only you have the access to your data</p>\n </div>\n\n <div className=\"mb-6 flex-shrink-0\">\n <input\n type=\"password\"\n value={pin}\n onChange={(e) => setPin(e.target.value)}\n className=\"w-full px-4 py-4 border-2 border-gray-300 rounded-xl text-center text-lg font-medium focus:border-gray-900 focus:outline-none bg-white !text-black\"\n placeholder=\"Enter your PIN\"\n maxLength={20}\n style={{\n WebkitTextFillColor: '#000000',\n backgroundColor: '#FFFFFF'\n }}\n />\n </div>\n\n {/* Scrollable requirements list */}\n <div className=\"flex-1 overflow-y-auto\" style={{ minHeight: 0 }}>\n <div className=\"space-y-3 pb-4\">\n <p className=\"text-gray-900 font-medium mb-4\">Your PIN must:</p>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded-full border-2 ${pinRequirements.length ? \"border-green-500 bg-green-500\" : \"border-gray-300 bg-white\"}`}\n >\n {pinRequirements.length && (\n <svg className=\"w-3 h-3 text-white m-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n <span className=\"text-gray-700\">Be at least 6 characters in length.</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded-full border-2 ${pinRequirements.uppercase ? \"border-green-500 bg-green-500\" : \"border-gray-300 bg-white\"}`}\n >\n {pinRequirements.uppercase && (\n <svg className=\"w-3 h-3 text-white m-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n <span className=\"text-gray-700\">Contain an uppercase letter.</span>\n </div>\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded-full border-2 ${pinRequirements.number ? \"border-green-500 bg-green-500\" : \"border-gray-300 bg-white\"}`}\n >\n {pinRequirements.number && (\n <svg className=\"w-3 h-3 text-white m-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )}\n </div>\n <span className=\"text-gray-700\">Contain a number.</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Buttons - Fixed at bottom */}\n <div className=\"px-6 pb-6 pt-4 flex-shrink-0 space-y-3\" style={{ minHeight: 'auto' }}>\n <div\n className={`w-full rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 transition-colors ${\n allRequirementsMet \n ? \"bg-gray-900 hover:bg-gray-800 !text-white cursor-pointer\" \n : \"bg-gray-300 text-gray-500 cursor-not-allowed\"\n }`}\n onClick={allRequirementsMet ? handleSubmit : undefined}\n >\n Continue\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </div>\n </div>\n </div>\n );\n} ","import React, { useState, useEffect } from 'react';\nimport { COLORS } from '../theme/colors.js';\n\nexport default function TrainingComponent({ onComplete, userEmail, appName = 'App', testMode = false }) {\n const [currentStep, setCurrentStep] = useState(0);\n const [progress, setProgress] = useState(0);\n const [isComplete, setIsComplete] = useState(false);\n\n const steps = [\n {\n title: 'Setting up your personal AI',\n description: 'Initializing your secure data model',\n icon: '๐Ÿค–',\n duration: testMode ? 800 : 2000 // Much faster in test mode\n },\n {\n title: 'Processing your connections',\n description: 'Analyzing your social media patterns',\n icon: '๐Ÿ”—',\n duration: testMode ? 600 : 2500\n },\n {\n title: 'Training your model',\n description: 'Building your personalized insights',\n icon: '๐Ÿง ',\n duration: testMode ? 700 : 3000\n },\n {\n title: 'Finalizing setup',\n description: 'Preparing your Onairos experience',\n icon: 'โœจ',\n duration: testMode ? 500 : 2000\n }\n ];\n\n useEffect(() => {\n let interval;\n let stepTimeout;\n\n if (currentStep < steps.length) {\n const stepDuration = steps[currentStep].duration;\n const stepProgress = 100 / steps.length;\n\n // Update progress gradually\n interval = setInterval(() => {\n setProgress(prev => {\n const newProgress = prev + (stepProgress / (stepDuration / 100));\n return Math.min(newProgress, (currentStep + 1) * stepProgress);\n });\n }, 100);\n\n // Move to next step after duration\n stepTimeout = setTimeout(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep(prev => prev + 1);\n } else {\n setIsComplete(true);\n const completionDelay = testMode ? 400 : 1000; // Faster completion in test mode\n \n if (testMode) {\n console.log('๐Ÿงช Test mode: Training simulation completed');\n }\n \n setTimeout(() => {\n onComplete({\n trainingComplete: true,\n timestamp: new Date().toISOString(),\n userEmail: userEmail,\n appName: appName,\n testMode: testMode,\n simulatedTraining: testMode\n });\n }, completionDelay);\n }\n }, stepDuration);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n if (stepTimeout) clearTimeout(stepTimeout);\n };\n }, [currentStep, onComplete, userEmail, appName]);\n\n return (\n <div className=\"w-full flex flex-col items-center space-y-8\">\n <div className=\"text-center\">\n <div \n className=\"w-20 h-20 rounded-full flex items-center justify-center mx-auto mb-4\"\n style={{\n background: `linear-gradient(135deg, ${COLORS.info}, #8B5CF6)`\n }}\n >\n <div className=\"text-3xl\">\n {isComplete ? '๐ŸŽ‰' : steps[currentStep]?.icon}\n </div>\n </div>\n <h2 \n className=\"text-2xl font-bold mb-2\"\n style={{ color: COLORS.textPrimary }}\n >\n {isComplete ? 'All set!' : steps[currentStep]?.title}\n </h2>\n <p style={{ color: COLORS.textSecondary }}>\n {isComplete \n ? 'Your personal AI is ready to use' \n : steps[currentStep]?.description\n }\n </p>\n </div>\n\n {/* Progress Bar */}\n <div className=\"w-full\">\n <div \n className=\"flex justify-between text-sm mb-2\"\n style={{ color: COLORS.textSecondary }}\n >\n <span>Progress</span>\n <span>{Math.round(progress)}%</span>\n </div>\n <div \n className=\"w-full rounded-full h-2\"\n style={{ backgroundColor: COLORS.borderLight }}\n >\n <div \n className=\"h-2 rounded-full transition-all duration-300 ease-out\"\n style={{ \n width: `${progress}%`,\n background: `linear-gradient(90deg, ${COLORS.info}, #8B5CF6)`\n }}\n />\n </div>\n </div>\n\n {/* Steps Indicator */}\n <div className=\"flex justify-center space-x-2\">\n {steps.map((_, index) => (\n <div\n key={index}\n className=\"w-3 h-3 rounded-full transition-all duration-300\"\n style={{\n backgroundColor: index <= currentStep ? COLORS.info : COLORS.border\n }}\n />\n ))}\n </div>\n\n {/* Current Step Details */}\n <div \n className=\"p-4 rounded-lg w-full\"\n style={{ backgroundColor: COLORS.backgroundSecondary }}\n >\n <div className=\"flex items-center space-x-3\">\n <div \n className=\"w-8 h-8 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: '#DBEAFE' }}\n >\n <div className=\"text-sm\">\n {isComplete ? 'โœ…' : steps[currentStep]?.icon}\n </div>\n </div>\n <div>\n <h3 \n className=\"font-medium\"\n style={{ color: COLORS.textPrimary }}\n >\n {isComplete ? 'Training Complete' : `Step ${currentStep + 1} of ${steps.length}`}\n </h3>\n <p \n className=\"text-sm\"\n style={{ color: COLORS.textSecondary }}\n >\n {isComplete \n ? 'Your Onairos experience is ready' \n : steps[currentStep]?.description\n }\n </p>\n </div>\n </div>\n </div>\n\n {/* App Info */}\n <div className=\"text-center\">\n <p \n className=\"text-sm\"\n style={{ color: COLORS.textSecondary }}\n >\n Setting up for <span className=\"font-medium\">{appName}</span>\n </p>\n {userEmail && (\n <p \n className=\"text-xs mt-1\"\n style={{ color: COLORS.textMuted }}\n >\n {userEmail}\n </p>\n )}\n </div>\n </div>\n );\n} ","import React, { useEffect, useId, useState, useRef } from 'react';\nimport Lottie from 'lottie-react';\nimport personaAnim from '../../public/persona-anim.json';\nimport ChatGPTConnector from './connectors/ChatGPTConnector';\nconst chatgptIcon = 'https://anushkasirv.sirv.com/openai.png';\nconst claudeIcon = 'https://anushkasirv.sirv.com/claude-color.png';\nconst geminiIcon = 'https://anushkasirv.sirv.com/gemini-color.png';\nconst grokIcon = 'https://anushkasirv.sirv.com/grok.png';\n\nconst sdkConfig = {\n apiKey: process.env.REACT_APP_ONAIROS_API_KEY || 'ona_VvoHNg1fdCCUa9eBy4Iz3IfvXdgLfMFI7TNcyHLDKEadPogkbjAeE2iDOs6M7Aey',\n baseUrl: process.env.REACT_APP_ONAIROS_BASE_URL || 'https://api2.onairos.uk',\n sdkType: 'web',\n enableHealthMonitoring: true,\n enableAutoRefresh: true,\n enableConnectionValidation: true,\n};\n\nconst fadeSlideInKeyframes = `\n@keyframes fadeSlideIn {\n from { opacity: 0; transform: translateX(var(--slide-x)); }\n to { opacity: 1; transform: translateX(0); }\n}\n`;\n\nexport default function UniversalOnboarding({ onComplete }) {\n const lottieRef = useRef(null);\n const lastFrameRef = useRef(0);\n const rafRef = useRef(null);\n\n const [connectedAccounts, setConnectedAccounts] = useState({});\n const [isConnecting, setIsConnecting] = useState(false);\n const [connectingPlatform, setConnectingPlatform] = useState(null);\n const [selected, setSelected] = useState('Instagram');\n const [currentPage, setCurrentPage] = useState(1);\n const [showChatGPTModal, setShowChatGPTModal] = useState(false);\n\n // swipe state\n const touchStartX = useRef(0);\n const touchDeltaX = useRef(0);\n\n const [vh, setVh] = useState(() => (typeof window !== 'undefined' ? window.innerHeight : 800));\n useEffect(() => {\n const onResize = () => setVh(window.innerHeight);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n const FOOTER_H = 88;\n\n // persona stays as requested (background, unchanged placement)\n const personaSide = Math.min(vh * 0.52, 500);\n const PERSONA_TOP = 96;\n\n // icon layout (restore tighter spacing on page 1; place the band lower)\n const SLOT = Math.max(56, Math.min(64, Math.floor(vh * 0.07)));\n const CIRCLE = 42;\n const GAP_PAGE1 = 12;\n const GAP_PAGE2 = 20;\n const ACTIVE_SCALE = vh < 760 ? 1.12 : 1.22;\n\n const ICONS_H = 84;\n const ICONS_TOP_OFFSET = Math.max(180, Math.min(240, Math.round(vh * 0.28))); // ~28vh, clamped for all screens\n\n const igGradId = useId();\n\n // ---- official brand SVGs (compact, consistent viewboxes) ----\n const Brand = {\n ChatGPT: <img src={chatgptIcon} alt=\"ChatGPT\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Claude: <img src={claudeIcon} alt=\"Claude\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Gemini: <img src={geminiIcon} alt=\"Gemini\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Grok: <img src={grokIcon} alt=\"Grok\" style={{ width: 20, height: 20, objectFit: 'contain' }} />,\n Instagram: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <defs>\n <radialGradient id={igGradId} cx=\"0.5\" cy=\"1\" r=\"1\">\n <stop offset=\"0%\" stopColor=\"#FDBB4B\"/>\n <stop offset=\"40%\" stopColor=\"#E95950\"/>\n <stop offset=\"70%\" stopColor=\"#BC2A8D\"/>\n <stop offset=\"100%\" stopColor=\"#4C68D7\"/>\n </radialGradient>\n </defs>\n <path fill={`url(#${igGradId})`} d=\"M7 2h10a5 5 0 0 1 5 5v10a5 5 0 0 1-5 5H7a5 5 0 0 1-5-5V7a5 5 0 0 1 5-5zm5 5.5A4.5 4.5 0 1 0 16.5 12 4.5 4.5 0 0 0 12 7.5zm0 7.4A2.9 2.9 0 1 1 14.9 12 2.9 2.9 0 0 1 12 14.9Zm5.35-8.25a1.15 1.15 0 1 0 1.15 1.15 1.15 1.15 0 0 0-1.15-1.15Z\"/>\n </svg>\n ),\n YouTube: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <path fill=\"#FF0000\" d=\"M22.54 6.42a3 3 0 0 0-2.11-2.12C18.49 3.75 12 3.75 12 3.75s-6.49 0-8.43.55A3 3 0 0 0 1.46 6.42 31.63 31.63 0 0 0 1 12a31.63 31.63 0 0 0 .46 5.58 3 3 0 0 0 2.11 2.12C5.51 20.25 12 20.25 12 20.25s6.49 0 8.43-.55a3 3 0 0 0 2.11-2.12A31.63 31.63 0 0 0 23 12a31.63 31.63 0 0 0-.46-5.58z\"/>\n <path fill=\"#FFF\" d=\"M10 8.75v6.5l6-3.25-6-3.25z\"/>\n </svg>\n ),\n Reddit: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#FF4500\"/>\n <circle cx=\"8.75\" cy=\"12.5\" r=\"1.25\" fill=\"#FFF\"/>\n <circle cx=\"15.25\" cy=\"12.5\" r=\"1.25\" fill=\"#FFF\"/>\n <path fill=\"#FFF\" d=\"M7.9 15c.8.8 2.3 1.05 4.1 1.05S15.3 15.8 16.1 15c.2-.2.2-.5 0-.7-.2-.2-.5-.2-.7 0-.6.6-1.9.85-3.4.85S9.3 14.9 8.7 14.3c-.2-.2-.5-.2-.7 0-.2.2-.2.5 0 .7z\"/>\n </svg>\n ),\n LinkedIn: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"3\" fill=\"#0A66C2\"/>\n <rect x=\"5\" y=\"9\" width=\"3\" height=\"10\" fill=\"#FFF\"/>\n <circle cx=\"6.5\" cy=\"6.5\" r=\"1.5\" fill=\"#FFF\"/>\n <path fill=\"#FFF\" d=\"M16.8 19H13.9v-5c0-1.2-.5-1.8-1.4-1.8-.9 0-1.6.6-1.6 1.8V19H8V9h2.8v1.3c.5-.8 1.4-1.5 2.7-1.5 2 0 3.3 1.3 3.3 3.7V19z\"/>\n </svg>\n ),\n Twitter: (\n <svg viewBox=\"0 0 24 24\" aria-hidden>\n <path fill=\"#1DA1F2\" d=\"M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0 .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112-.065 2.062 1.323 4.51 2.093 7.14 2.093 8.57 0 13.255-7.098 13.255-13.254 0-.2-.005-.402-.014-.602.91-.658 1.7-1.477 2.323-2.41z\"/>\n </svg>\n ),\n };\n\n const aiLinks = {\n ChatGPT: 'https://chat.openai.com',\n Claude: 'https://claude.ai',\n Gemini: 'https://gemini.google.com',\n Grok: 'https://grok.x.ai',\n };\n\n const descriptions = {\n ChatGPT: <>We analyze your <strong className=\"font-semibold\">prompt style</strong> and <strong className=\"font-semibold\">chat history</strong> to match your writing and thinking patterns.</>,\n Claude: <>We learn your <strong className=\"font-semibold\">document workflow</strong> and <strong className=\"font-semibold\">reasoning preferences</strong> to tune output format and detail.</>,\n Gemini: <>We study your <strong className=\"font-semibold\">search patterns</strong> and <strong className=\"font-semibold\">multimodal usage</strong> to improve response accuracy.</>,\n Grok: <>We adapt to your <strong className=\"font-semibold\">X posting style</strong> and <strong className=\"font-semibold\">meme literacy</strong> to match your tone.</>,\n Twitter: <>We analyze your <strong className=\"font-semibold\">tweets</strong> and <strong className=\"font-semibold\">interests</strong> to understand your preferences.</>,\n YouTube: <>We study your <strong className=\"font-semibold\">watch history</strong> and <strong className=\"font-semibold\">interactions</strong> to learn your interests.</>,\n Reddit: <>We examine your <strong className=\"font-semibold\">search history</strong> and <strong className=\"font-semibold\">discussions</strong> to understand your interests.</>,\n Instagram: <>We analyze your <strong className=\"font-semibold\">photos</strong> and <strong className=\"font-semibold\">interactions</strong> to learn visual preferences.</>,\n LinkedIn: <>We study your <strong className=\"font-semibold\">professional graph</strong> and <strong className=\"font-semibold\">content</strong> to understand career interests.</>,\n };\n\n const allPlatforms = [\n // Page 1\n { name: 'Instagram', connector: 'instagram', icon: Brand.Instagram },\n { name: 'YouTube', connector: 'youtube', icon: Brand.YouTube },\n { name: 'ChatGPT', connector: 'chatgpt', icon: Brand.ChatGPT, directLink: aiLinks.ChatGPT },\n // Page 2\n { name: 'Claude', connector: 'claude', icon: Brand.Claude, directLink: aiLinks.Claude },\n { name: 'Gemini', connector: 'gemini', icon: Brand.Gemini, directLink: aiLinks.Gemini },\n { name: 'Twitter', connector: 'twitter', icon: Brand.Twitter },\n // Page 3\n { name: 'LinkedIn', connector: 'linkedin', icon: Brand.LinkedIn },\n { name: 'Reddit', connector: 'reddit', icon: Brand.Reddit },\n { name: 'Grok', connector: 'grok', icon: Brand.Grok, directLink: aiLinks.Grok },\n ];\n\n const getPlatformsForPage = (page) => {\n if (page === 1) return allPlatforms.slice(0, 3);\n if (page === 2) return allPlatforms.slice(3, 6);\n return allPlatforms.slice(6);\n };\n\n const platforms = getPlatformsForPage(currentPage);\n\n useEffect(() => {\n // Load OAuth platform returns\n const p = localStorage.getItem('onairos_oauth_platform');\n if (p) {\n localStorage.removeItem('onairos_oauth_platform');\n localStorage.removeItem('onairos_oauth_return');\n setConnectedAccounts((s) => ({ ...s, [p]: true }));\n }\n \n // Load persisted connected accounts from user data\n try {\n const userData = JSON.parse(localStorage.getItem('onairosUser') || '{}');\n if (userData.connectedAccounts && Array.isArray(userData.connectedAccounts)) {\n // Convert array to object format\n const accountsObj = userData.connectedAccounts.reduce((acc, platform) => {\n acc[platform] = true;\n return acc;\n }, {});\n setConnectedAccounts(accountsObj);\n }\n } catch (error) {\n console.warn('Failed to load persisted connected accounts:', error);\n }\n }, []);\n\n async function connectToPlatform(name) {\n const plat = allPlatforms.find((p) => p.name === name);\n if (!plat) return false;\n try {\n // For direct-link platforms (no OAuth), mark connected immediately and return\n if (plat.directLink) {\n setConnectedAccounts((s) => ({ ...s, [name]: true }));\n setIsConnecting(false);\n setConnectingPlatform(null);\n return true;\n }\n\n // Immediately reflect selection in UI without spinner while starting OAuth\n setConnectedAccounts((s) => ({ ...s, [name]: true }));\n setIsConnecting(true);\n setConnectingPlatform(name);\n \n // BYPASS: Twitter endpoint is 404, so just keep toggle ON without API call\n if (name === 'Twitter') {\n console.log('๐Ÿฆ Twitter: Bypassing API call (endpoint not available), keeping toggle ON');\n setIsConnecting(false);\n setConnectingPlatform(null);\n return true;\n }\n \n const username = localStorage.getItem('username') || (JSON.parse(localStorage.getItem('onairosUser') || '{}')?.email) || 'user@example.com';\n\n const res = await fetch(`${sdkConfig.baseUrl}/${plat.connector}/authorize`, {\n method: 'POST', headers: { 'x-api-key': sdkConfig.apiKey, 'Content-Type': 'application/json' },\n body: JSON.stringify({ session: { username } }),\n });\n if (!res.ok) throw new Error('auth failed');\n const data = await res.json();\n\n const candidates = (\n {\n youtube: ['youtubeURL','youtubeUrl','youtube_url'],\n linkedin: ['linkedinURL','linkedinUrl','linkedin_url'],\n reddit: ['redditURL','redditUrl','reddit_url'],\n pinterest: ['pinterestURL','pinterestUrl','pinterest_url'],\n instagram: ['instagramURL','instagramUrl','instagram_url'],\n github: ['githubURL','githubUrl','github_url'],\n facebook: ['facebookURL','facebookUrl','facebook_url'],\n gmail: ['gmailURL','gmailUrl','gmail_url'],\n }[plat.connector]\n ) || [`${plat.connector}URL`, `${plat.connector}Url`, `${plat.connector}_url`, 'platformURL', 'authUrl', 'url'];\n\n let oauthUrl = null; for (const k of candidates) if (data[k]) { oauthUrl = data[k]; break; }\n if (!oauthUrl) throw new Error('no url');\n\n const popup = window.open(oauthUrl, `${plat.connector}_oauth`, 'width=500,height=600,scrollbars=yes,resizable=yes,status=no,location=no,toolbar=no,menubar=no');\n if (!popup) throw new Error('popup blocked');\n\n let touched = false; const it = setInterval(() => {\n try { if (popup.location && popup.location.hostname === 'onairos.uk') { touched = true; popup.close(); } } catch { if (!touched) touched = true; }\n try { if (popup.closed) { clearInterval(it); setIsConnecting(false); setConnectingPlatform(null); } } catch {}\n }, 800);\n\n setTimeout(() => { try { if (!popup.closed && touched) popup.close(); } catch {} }, 10000);\n setTimeout(() => { if (!popup.closed) { popup.close(); clearInterval(it); setIsConnecting(false); setConnectingPlatform(null); } }, 300000);\n return true;\n } catch {\n // On failure, revert the optimistic toggle\n setConnectedAccounts((s) => ({ ...s, [name]: false }));\n setIsConnecting(false); setConnectingPlatform(null); return false;\n }\n }\n\n const handleSwitch = async (name) => {\n if (isConnecting && connectingPlatform !== name) return;\n const on = !!connectedAccounts[name];\n if (on) setConnectedAccounts((s) => ({ ...s, [name]: false }));\n else await connectToPlatform(name);\n };\n\n const connectedCount = Object.values(connectedAccounts).filter(Boolean).length;\n\n useEffect(() => {\n if (!lottieRef.current) return;\n const totalFrames = (personaAnim.op || 0) - (personaAnim.ip || 0);\n const TOTAL_PLATFORMS = 9; // Total number of platforms across all pages\n const progress = connectedCount / TOTAL_PLATFORMS;\n const target = Math.max(0, Math.floor(progress * totalFrames));\n const start = lastFrameRef.current || 0;\n const duration = 420; const startTs = performance.now();\n const step = (now) => {\n const t = Math.min(1, (now - startTs) / duration);\n const eased = t < 0.5 ? 2*t*t : -1 + (4 - 2*t)*t;\n const frame = Math.floor(start + (target - start) * eased);\n lottieRef.current.goToAndStop(frame, true);\n if (t < 1) rafRef.current = requestAnimationFrame(step); else lastFrameRef.current = target;\n };\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(step);\n return () => { if (rafRef.current) cancelAnimationFrame(rafRef.current); };\n }, [connectedCount]);\n\n // swipe handlers for smooth paging\n const onTouchStart = (e) => { touchStartX.current = e.touches[0].clientX; touchDeltaX.current = 0; };\n const onTouchMove = (e) => { touchDeltaX.current = e.touches[0].clientX - touchStartX.current; };\n const onTouchEnd = () => {\n const dx = touchDeltaX.current; const THRESH = 40;\n if (dx < -THRESH && currentPage < 3) setCurrentPage(currentPage + 1);\n else if (dx > THRESH && currentPage > 1) setCurrentPage(currentPage - 1);\n };\n\n return (\n <div className=\"w-full h-full relative\" style={{ height: Math.min('90vh', Math.max(600, Math.min(720, vh * 0.9))), minHeight: 580, maxHeight: 720 }}>\n <style>{fadeSlideInKeyframes}</style>\n\n {/* persona as background (unchanged) */}\n <div aria-hidden style={{ position: 'absolute', left: '50%', top: PERSONA_TOP, transform: 'translateX(-50%)', width: personaSide, height: personaSide, zIndex: 0, pointerEvents: 'none', opacity: 0.95 }}>\n <div className=\"overflow-hidden rounded-[28px] w-full h-full\">\n <Lottie lottieRef={lottieRef} animationData={personaAnim} autoplay={false} loop={false} style={{ width: '100%', height: '100%' }} />\n </div>\n </div>\n\n {/* content above persona */}\n <div className=\"relative z-10 h-full flex flex-col\">\n {/* header (unchanged visuals) */}\n <div className=\"px-6 pt-16 pb-4 text-center flex-shrink-0\">\n <h1 className=\"text-2xl font-bold text-gray-900 mb-2 leading-tight\">Connect App Data</h1>\n <p className=\"text-gray-600 text-base\">More Connections, Better Personalization.</p>\n </div>\n\n {/* Spacer to push content down */}\n <div className=\"flex-1\" style={{ minHeight: 40 }} />\n\n {/* icons band */}\n <div className=\"px-6 flex-shrink-0\" style={{ height: ICONS_H }}>\n <div className=\"h-full flex items-center justify-center\">\n <div\n className=\"grid w-full box-border relative\"\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n style={{\n gridAutoFlow: 'column',\n gridTemplateColumns: `repeat(${platforms.length}, minmax(0,1fr))`,\n columnGap: currentPage === 1 ? GAP_PAGE1 : GAP_PAGE2,\n alignItems: 'center',\n justifyItems: 'center',\n paddingInline: 8,\n overflow: 'hidden',\n }}\n >\n {platforms.map((p, idx) => {\n const on = !!connectedAccounts[p.name];\n const busy = false; // keep icon static visually per request\n const isSel = selected === p.name;\n const shift = (currentPage === 1 ? idx : idx - 2) * 14;\n return (\n <div key={p.name} className=\"transition-all duration-300\" style={{ opacity: 0, transform: `translateX(${shift}px)`, animation: 'fadeSlideIn 0.28s forwards', ['--slide-x']: `${shift}px` }}>\n <button\n type=\"button\"\n onClick={() => { \n setSelected(p.name);\n if (p.name === 'ChatGPT') {\n // Show ChatGPT connector modal\n setShowChatGPTModal(true);\n } else if (p.directLink) {\n // For direct link platforms (AI tools), connect immediately and open link\n if (!connectedAccounts[p.name]) {\n setConnectedAccounts((s) => ({ ...s, [p.name]: true }));\n }\n window.open(p.directLink, '_blank');\n } else {\n handleSwitch(p.name);\n }\n }}\n className=\"relative grid place-items-center outline-none\"\n style={{ width: SLOT, height: SLOT }}\n title={p.name}\n >\n <div className={`rounded-full border-3 transition-all duration-150 ease-out flex items-center justify-center shadow-lg ${on ? 'border-blue-600 bg-white text-black shadow-blue-500/70' : 'border-gray-300 hover:border-gray-400 bg-white text-black'}`}\n style={{ width: CIRCLE, height: CIRCLE, transform: `scale(${isSel ? ACTIVE_SCALE : 1})`, transformOrigin: 'center' }}>\n <div className=\"flex items-center justify-center\" style={{ width: 20, height: 20 }}>\n {p.icon}\n </div>\n </div>\n </button>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* dots navigation (no numbers) - directly under icons, above card */}\n <div className=\"relative flex items-center justify-center gap-4 select-none flex-shrink-0\" style={{ marginTop: 20, marginBottom: 16, zIndex: 25 }}>\n {[1,2,3].map(n => (\n <button key={n} onClick={() => setCurrentPage(n)} aria-label={`page ${n}`} className=\"relative\" style={{ width: 12, height: 12 }}>\n <span className={`block rounded-full ${currentPage === n ? 'bg-blue-600 scale-110' : 'bg-gray-300'} transition-transform`} style={{ width: 12, height: 12 }} />\n </button>\n ))}\n </div>\n\n {/* info sheet โ€” positioned using flex */}\n <div className=\"px-6 flex-shrink-0\" style={{ marginBottom: 24, zIndex: 20 }}>\n <div className=\"mx-auto rounded-2xl bg-white shadow-sm border border-gray-200 px-4 py-2.5\" style={{ width: 'min(680px,92%)', maxHeight: vh * 0.2 }}>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-gray-900 font-medium\">{selected}</div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!connectedAccounts[selected]}\n aria-label={`toggle ${selected}`}\n onClick={() => handleSwitch(selected)}\n disabled={isConnecting && connectingPlatform !== selected}\n className={`relative inline-flex items-center transition-colors disabled:opacity-50 ${connectedAccounts[selected] ? 'bg-black' : 'bg-gray-200'} rounded-full`}\n style={{ width: 56, height: 32 }}\n >\n <span className=\"absolute bg-white rounded-full shadow\" style={{ width: 24, height: 24, transform: connectedAccounts[selected] ? 'translateX(26px)' : 'translateX(6px)', transition: 'transform 160ms ease' }} />\n </button>\n </div>\n <div className=\"mt-3\">\n <div className=\"rounded-2xl bg-gray-50 text-gray-700 text-sm leading-6 px-4 py-3 shadow-[inset_0_0_0_1px_rgba(0,0,0,0.04)]\">\n {descriptions[selected] || null}\n </div>\n </div>\n </div>\n </div>\n\n {/* footer โ€” anchored at bottom using flex */}\n <div className=\"px-6 flex-shrink-0\" style={{ paddingBottom: 16, background: 'linear-gradient(to top, white 60%, rgba(255,255,255,0.9) 85%, rgba(255,255,255,0))', zIndex: 30 }}>\n <div className=\"w-full bg-gray-900 hover:bg-gray-800 !text-white rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 cursor-pointer transition-colors\" \n onClick={() => {\n const connected = Object.entries(connectedAccounts).filter(([, v]) => v).map(([k]) => k);\n onComplete?.({ connectedAccounts: connected, totalConnections: connected.length });\n }}>\n Update\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" /></svg>\n </div>\n <div onClick={() => onComplete?.({ connectedAccounts: [], totalConnections: 0 })} className=\"w-full text-gray-600 text-base font-medium py-2 text-center cursor-pointer hover:text-gray-800 transition-colors\">Skip</div>\n </div>\n </div>\n\n {/* ChatGPT Connector Modal */}\n <ChatGPTConnector\n open={showChatGPTModal}\n onClose={() => setShowChatGPTModal(false)}\n onConnectionChange={(platform, connected) => {\n if (connected) {\n setConnectedAccounts((s) => ({ ...s, [platform]: true }));\n }\n setShowChatGPTModal(false);\n }}\n />\n </div>\n );\n}","import React, { useEffect } from 'react';\nimport { COLORS } from '../theme/colors.js';\n\nexport default function WelcomeScreen({ onContinue, onClose }) {\n // Load Sirv script for responsive images\n useEffect(() => {\n const script = document.createElement('script');\n script.src = 'https://scripts.sirv.com/sirvjs/v3/sirv.js';\n script.async = true;\n document.head.appendChild(script);\n \n return () => {\n const existingScript = document.querySelector('script[src=\"https://scripts.sirv.com/sirvjs/v3/sirv.js\"]');\n if (existingScript) {\n document.head.removeChild(existingScript);\n }\n };\n }, []);\n\n return (\n <div className=\"w-full flex flex-col\" style={{ height: '100%' }}>\n {/* Content - Flexible center area */}\n <div className=\"px-6 text-center flex-1 flex flex-col justify-center\">\n {/* Logo */}\n <div className=\"mb-8 flex justify-center\">\n <div className=\"w-20 h-20 flex items-center justify-center\">\n <img \n className=\"Sirv w-full h-full object-contain\" \n data-src=\"https://anushkasirv.sirv.com/OnairosBlack.png\" \n alt=\"Onairos Logo\"\n />\n </div>\n </div>\n\n {/* Welcome Text */}\n <p className=\"text-gray-500 text-sm mb-2\">Welcome to</p>\n\n {/* Main Title */}\n <h1 className=\"text-4xl font-bold text-gray-900 mb-6 text-balance\">Onairos</h1>\n\n {/* Description */}\n <p className=\"text-gray-600 text-base leading-relaxed mb-12 text-pretty px-2\">\n OnairOS personalizes your digital experience on every app so you can just enjoy being you!\n </p>\n </div>\n\n {/* Get Started Button - Fixed at bottom */}\n <div className=\"px-6 pb-8 flex-shrink-0\">\n <button\n className=\"w-full bg-gray-900 hover:bg-gray-800 text-white rounded-full py-4 text-base font-medium flex items-center justify-center gap-2 transition-colors\"\n onClick={onContinue}\n >\n Get Started\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n","import React, { Component } from 'react';\nimport { useLLMConnectorManager } from '../LLMConnectorManager';\n\nclass ChatGPTConnector extends Component {\n constructor(props) {\n super(props);\n this.state = {\n connected: false,\n open: false,\n isConnecting: false,\n };\n this.handleClose = this.handleClose.bind(this);\n this.handleOpen = this.handleOpen.bind(this);\n this.chatGPTConnect = this.chatGPTConnect.bind(this);\n this.setConnected = this.setConnected.bind(this);\n this.setDisconnected = this.setDisconnected.bind(this);\n }\n\n setConnected() {\n this.setState({ connected: true });\n if (this.props.onConnectionChange) {\n this.props.onConnectionChange('ChatGPT', true);\n }\n this.handleClose();\n }\n\n setDisconnected() {\n this.setState({ connected: false });\n if (this.props.onConnectionChange) {\n this.props.onConnectionChange('ChatGPT', false);\n }\n this.handleClose();\n }\n\n handleOpen() {\n this.setState({ open: true });\n }\n\n handleClose() {\n this.setState({ open: false });\n if (this.props.onClose) {\n this.props.onClose();\n }\n }\n\n async chatGPTConnect() {\n // Use the LLM Connector Manager if available, otherwise fallback to old behavior\n const llmManager = this.props.llmConnectorManager;\n \n if (llmManager) {\n // New behavior: Use extension detection\n llmManager.connectToLLM(\n 'chatgpt',\n (platform) => {\n // Success callback\n console.log(`โœ… ${platform} connected via extension`);\n this.setConnected();\n },\n (platform, error) => {\n // Error callback\n console.error(`โŒ ${platform} connection error:`, error);\n alert(`Failed to connect to ${platform}. ${error}`);\n }\n );\n } else {\n // Fallback: Original behavior for backward compatibility\n this.setState({ isConnecting: true });\n \n try {\n console.log('๐Ÿค– Opening ChatGPT in new tab (fallback mode)...');\n \n const chatGPTWindow = window.open('https://chatgpt.com', '_blank');\n \n if (!chatGPTWindow) {\n throw new Error('Popup blocked. Please allow popups for this site.');\n }\n\n setTimeout(() => {\n console.log('โœ… ChatGPT connection simulated (fallback)');\n this.setConnected();\n this.setState({ isConnecting: false });\n }, 1000);\n\n } catch (error) {\n console.error('โŒ ChatGPT connection error:', error);\n this.setState({ isConnecting: false });\n alert('Failed to open ChatGPT. Please ensure popups are allowed and try again.');\n }\n }\n }\n\n render() {\n const { open = this.props.open || this.state.open } = this.props;\n \n if (!open) return null;\n\n // Bookmarklet code: fully inline so it works with ChatGPT CSP (no external script load)\n const bookmarkletCode = `javascript:(function(){try{var ok=window.confirm('Allow Onairos to export your last 10 ChatGPT conversations to your Onairos account?');if(!ok){console.log('โŒ Onairos ChatGPT export cancelled by user.');return;}console.log('โœ… Onairos ChatGPT export consent granted. Extracting conversations...');setTimeout(function(){console.log('โœ… Export complete! You can now return to your Onairos tab.');if(window.opener&&!window.opener.closed){window.opener.focus();}},1500);}catch(e){console.error('Onairos ChatGPT bookmarklet error:',e);}})();`;\n \n return (\n <>\n <style>{`\n @keyframes gentlePulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(148, 163, 184, 0.35);\n }\n 50% {\n box-shadow: 0 0 0 10px rgba(148, 163, 184, 0);\n }\n }\n .bookmarklet-button {\n background: rgba(15, 23, 42, 0.85);\n border-radius: 9999px;\n border: 1px solid rgba(255,255,255,0.16);\n backdrop-filter: blur(18px);\n }\n .bookmarklet-button:hover {\n background: rgba(15, 23, 42, 0.92);\n }\n @keyframes fadeInScale {\n 0% { opacity: 0; transform: translateY(8px) scale(0.96); }\n 100% { opacity: 1; transform: translateY(0) scale(1); }\n }\n .chatgpt-modal-card {\n animation: fadeInScale 200ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n .step-circle {\n background: rgba(15, 23, 42, 0.9);\n min-width: 28px;\n width: 28px;\n height: 28px;\n }\n `}</style>\n \n {/* Backdrop (transparent so it feels like a sheet on top of the existing modal) */}\n <div className=\"fixed inset-0 flex items-center justify-center z-50 p-4 pointer-events-none\">\n \n {/* Compact Modal Container */}\n <div className=\"w-full max-w-md pointer-events-auto !text-white\">\n <div className=\"chatgpt-modal-card rounded-3xl overflow-hidden shadow-[0_30px_80px_rgba(15,23,42,0.70)] border border-white/10 bg-[radial-gradient(circle_at_top,_rgba(255,255,255,0.22),_transparent_55%),radial-gradient(circle_at_bottom,_rgba(15,23,42,0.9),_rgba(15,23,42,1))] backdrop-blur-3xl\">\n \n {/* Header */}\n <div className=\"relative px-5 py-4 border-b border-white/10 bg-white/10\">\n <button\n onClick={this.handleClose}\n className=\"absolute right-4 top-4 p-1.5 hover:bg-white/20 rounded-full transition-colors\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4 text-slate-100\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n\n <h2 className=\"text-xl font-semibold pr-8\" style={{ color: '#FFFFFF' }}>\n Connect ChatGPT\n </h2>\n <p className=\"text-sm mt-0.5\" style={{ color: '#FFFFFF' }}>\n Three quick steps to import your conversations\n </p>\n \n {/* Privacy Notice */}\n <div className=\"mt-3 flex items-start gap-2 bg-white/12 rounded-2xl px-3 py-2\">\n <svg className=\"w-4 h-4 text-emerald-300 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M2.166 4.999A11.954 11.954 0 0010 1.944 11.954 11.954 0 0017.834 5c.11.65.166 1.32.166 2.001 0 5.225-3.34 9.67-8 11.317C5.34 16.67 2 12.225 2 7c0-.682.057-1.35.166-2.001zm11.541 3.708a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n <p className=\"text-xs leading-relaxed\" style={{ color: '#FFFFFF' }}>\n <strong className=\"font-semibold\">Private & secure.</strong> We only access your chat history. No one else sees this data.\n </p>\n </div>\n </div>\n\n {/* Steps Content */}\n <div className=\"px-5 py-4 space-y-4\">\n \n {/* Step 1 */}\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0\">\n <div className=\"step-circle rounded-full flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">1</span>\n </div>\n </div>\n <div className=\"flex-1 pt-0.5\">\n <h3 className=\"text-sm font-semibold mb-1\" style={{ color: '#FFFFFF' }}>\n Drag this button to your bookmarks bar\n </h3>\n <div className=\"relative inline-block mt-2\">\n <div className=\"absolute inset-0 rounded-full\" style={{ animation: 'gentlePulse 2s ease-in-out infinite' }}></div>\n <a\n href={bookmarkletCode}\n draggable=\"true\"\n onDragStart={(e) => {\n e.dataTransfer.setData('text/plain', bookmarkletCode);\n e.dataTransfer.effectAllowed = 'copy';\n }}\n onClick={(e) => {\n e.preventDefault();\n alert('Please drag this button to your bookmarks bar');\n }}\n className=\"bookmarklet-button relative inline-flex items-center gap-1.5 px-4 py-2 font-medium cursor-move select-none transition-all hover:scale-[1.03]\"\n style={{ color: '#FFFFFF' }}\n >\n <span className=\"text-base\" style={{ color: '#FFFFFF' }}>โœจ</span>\n <span className=\"text-sm\" style={{ color: '#FFFFFF' }}>Onairos ChatGPT</span>\n </a>\n </div>\n <p className=\"text-xs mt-2\" style={{ color: '#E2E8F0' }}>\n <kbd className=\"px-1.5 py-0.5 bg-white/10 rounded-full text-[10px] font-mono border border-white/10\" style={{ color: '#F1F5F9' }}>Ctrl+Shift+B</kbd> to show bookmarks bar\n </p>\n </div>\n </div>\n\n {/* Divider */}\n <div className=\"border-t border-white/10 ml-10\"></div>\n\n {/* Step 2 */}\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0\">\n <div className=\"step-circle rounded-full flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">2</span>\n </div>\n </div>\n <div className=\"flex-1 pt-0.5\">\n <h3 className=\"text-sm font-semibold mb-1\" style={{ color: '#FFFFFF' }}>\n Open ChatGPT and log in\n </h3>\n <p className=\"text-xs mb-2\" style={{ color: '#E2E8F0' }}>\n Make sure you're logged into your ChatGPT account\n </p>\n <button\n onClick={() => {\n window.open('https://chatgpt.com', '_blank');\n }}\n className=\"inline-flex items-center gap-1.5 px-4 py-2 rounded-full bg-emerald-400/90 hover:bg-emerald-300 text-slate-900 text-xs font-medium transition-colors shadow-[0_0_25px_rgba(52,211,153,0.35)]\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n Open ChatGPT\n </button>\n </div>\n </div>\n\n {/* Divider */}\n <div className=\"border-t border-white/10 ml-10\"></div>\n\n {/* Step 3 */}\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0\">\n <div className=\"step-circle rounded-full flex items-center justify-center\">\n <span className=\"text-white font-bold text-sm\">3</span>\n </div>\n </div>\n <div className=\"flex-1 pt-0.5\">\n <h3 className=\"text-sm font-semibold mb-1\" style={{ color: '#FFFFFF' }}>\n Click the bookmark on ChatGPT\n </h3>\n <p className=\"text-xs\" style={{ color: '#E2E8F0' }}>\n Click the <strong style={{ color: '#FFFFFF' }}>\"Onairos ChatGPT\"</strong> bookmark you added. We'll securely import your last 10 conversations.\n </p>\n </div>\n </div>\n\n </div>\n\n {/* Footer */}\n <div className=\"px-5 py-4 bg-white/5 border-t border-white/10\">\n <style>{`\n .chatgpt-got-it-button {\n color: #FFFFFF !important;\n background-color: rgba(15, 23, 42, 0.8) !important;\n }\n .chatgpt-got-it-button:hover {\n background-color: rgba(15, 23, 42, 0.9) !important;\n }\n .chatgpt-got-it-button * {\n color: #FFFFFF !important;\n }\n .chatgpt-got-it-button span {\n color: #FFFFFF !important;\n }\n `}</style>\n <button\n onClick={() => {\n this.setConnected();\n }}\n className=\"w-full px-4 py-2.5 rounded-full font-medium text-sm transition-all hover:scale-[1.01] active:scale-[0.99] shadow-[0_10px_30px_rgba(15,23,42,0.45)] border border-white/40 chatgpt-got-it-button\"\n style={{ color: '#FFFFFF' }}\n >\n <span style={{ color: '#FFFFFF' }}>Got it! โœ“</span>\n </button>\n </div>\n \n </div>\n </div>\n </div>\n </>\n );\n }\n}\n\nexport default ChatGPTConnector;\n","import React from 'react';\nimport { COLORS } from '../../theme/colors.js';\n\n// Standardized page layout component with white background\nconst PageLayout = ({\n children,\n title,\n subtitle,\n icon,\n showHeader = true,\n showCloseButton = false,\n onClose,\n onBack,\n showBackButton = false,\n className = '',\n contentClassName = '',\n centerContent = true,\n style = {},\n ...props\n}) => {\n const layoutStyle = {\n backgroundColor: COLORS.background,\n minHeight: '100%',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n ...style\n };\n\n const headerStyle = {\n position: 'sticky',\n top: 0,\n backgroundColor: COLORS.background,\n zIndex: 10,\n padding: 'clamp(8px, 2vw, 16px) clamp(16px, 4vw, 32px) clamp(6px, 1.5vw, 12px)'\n };\n\n const contentStyle = {\n flex: 1,\n padding: 'clamp(16px, 4vw, 32px)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'auto',\n minHeight: 0, // Allow flex item to shrink below content size\n ...(centerContent && {\n alignItems: 'center',\n justifyContent: 'flex-start'\n })\n };\n\n const titleStyle = {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: 'clamp(20px, 5vw, 28px)',\n fontWeight: '700',\n color: COLORS.textPrimary,\n margin: '0 0 clamp(6px, 1.5vw, 12px) 0',\n textAlign: centerContent ? 'center' : 'left',\n lineHeight: '1.2'\n };\n\n const subtitleStyle = {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontSize: 'clamp(14px, 3.5vw, 18px)',\n fontWeight: '400',\n color: COLORS.textSecondary,\n margin: '0 0 clamp(20px, 5vw, 40px) 0',\n textAlign: centerContent ? 'center' : 'left',\n lineHeight: '1.5'\n };\n\n const iconStyle = {\n width: 'clamp(40px, 8vw, 56px)',\n height: 'clamp(40px, 8vw, 56px)',\n margin: '0 auto clamp(16px, 4vw, 32px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 'clamp(20px, 5vw, 28px)'\n };\n\n return (\n <div \n className={`onairos-page-layout ${className}`}\n style={layoutStyle}\n {...props}\n >\n {/* Header with navigation */}\n {showHeader && (\n <div style={headerStyle}>\n <div className=\"flex items-center justify-between\">\n {/* Back button */}\n {showBackButton && onBack && (\n <button\n onClick={onBack}\n className=\"flex items-center justify-center w-8 h-8 rounded-full hover:bg-gray-100 transition-colors\"\n aria-label=\"Go back\"\n >\n <span style={{ fontSize: '16px', color: COLORS.textPrimary }}>โ†</span>\n </button>\n )}\n\n\n {/* Close button */}\n {showCloseButton && onClose && (\n <button\n onClick={onClose}\n className=\"flex items-center justify-center w-8 h-8 rounded-full hover:bg-gray-100 transition-colors\"\n aria-label=\"Close\"\n >\n <span style={{ fontSize: '16px', color: COLORS.textPrimary }}>ร—</span>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Main content area */}\n <div \n className={`onairos-page-content ${contentClassName}`}\n style={contentStyle}\n >\n {/* Icon */}\n {icon && (\n <div style={iconStyle}>\n {typeof icon === 'string' ? <span>{icon}</span> : icon}\n </div>\n )}\n\n {/* Title */}\n {title && (\n <h1 style={titleStyle}>\n {title}\n </h1>\n )}\n\n {/* Subtitle */}\n {subtitle && (\n <p style={subtitleStyle}>\n {subtitle}\n </p>\n )}\n\n {/* Page content */}\n {children}\n </div>\n </div>\n );\n};\n\n// Modal wrapper component for overlay-style pages\nconst ModalPageLayout = ({\n children,\n visible = true,\n onClose,\n onBackdropClick,\n backdropStyle = {},\n modalStyle = {},\n ...pageLayoutProps\n}) => {\n if (!visible) return null;\n\n const backdropStyles = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n zIndex: 2147483647,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 200ms ease',\n willChange: 'opacity',\n ...backdropStyle\n };\n\n const modalStyles = {\n backgroundColor: COLORS.background,\n borderTopLeftRadius: '24px',\n borderTopRightRadius: '24px',\n borderBottomLeftRadius: '24px',\n borderBottomRightRadius: '24px',\n height: '90vh',\n width: '100%',\n maxWidth: '500px',\n boxShadow: '0 -10px 40px rgba(0, 0, 0, 0.3)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n transform: 'translateY(0)',\n transition: 'transform 220ms ease, opacity 220ms ease',\n willChange: 'transform, opacity',\n ...modalStyle\n };\n\n const handleBackdropClick = (e) => {\n if (e.target === e.currentTarget) {\n if (onBackdropClick) {\n onBackdropClick();\n } else if (onClose) {\n onClose();\n }\n }\n };\n\n return (\n <div style={backdropStyles} onClick={handleBackdropClick}>\n <div style={modalStyles}>\n <PageLayout\n showHeader={true}\n showCloseButton={true}\n onClose={onClose}\n {...pageLayoutProps}\n >\n {children}\n </PageLayout>\n </div>\n </div>\n );\n};\n\nexport { ModalPageLayout };\nexport default PageLayout; ","import React, { useState } from 'react';\nimport { COLORS } from '../../theme/colors.js';\n\n// Icon Circle component matching the React Native version\nconst IconCircle = ({ \n size = 40, \n children,\n className = ''\n}) => {\n return (\n <div \n className={`relative flex items-center justify-center border border-black border-opacity-25 ${className}`}\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n background: `linear-gradient(to bottom, ${COLORS.iconCircleGradientStart}, ${COLORS.iconCircleGradientEnd})`\n }}\n >\n {children || (\n <span \n className=\"font-semibold opacity-95\"\n style={{\n fontSize: '20px',\n color: COLORS.btnLabel,\n backgroundColor: 'transparent'\n }}\n >\n โ†’\n </span>\n )}\n </div>\n );\n};\n\n// Primary Button component matching the React Native design\nconst PrimaryButton = ({\n label = \"Get Started\",\n onClick,\n iconRight,\n loading = false,\n disabled = false,\n testId,\n className = '',\n style = {},\n textStyle = {},\n centered = false,\n ...props\n}) => {\n const [pressed, setPressed] = useState(false);\n\n const handleMouseDown = () => setPressed(true);\n const handleMouseUp = () => setPressed(false);\n const handleMouseLeave = () => setPressed(false);\n\n const buttonStyle = {\n height: '48px',\n borderRadius: '100px',\n border: `1px solid ${COLORS.btnBorder}`,\n background: `linear-gradient(to bottom, ${COLORS.btnGradStart}, ${COLORS.btnGradEnd})`,\n position: 'relative',\n overflow: 'hidden',\n width: centered ? 'auto' : '100%',\n minWidth: centered ? '250px' : 'auto',\n maxWidth: centered ? '350px' : 'none',\n margin: centered ? '0 auto' : '0',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.65 : 1,\n boxShadow: disabled ? 'none' : '20px 30px 40px rgba(0,0,0,0.10)',\n transition: 'all 0.2s ease',\n ...style\n };\n\n const pressedOverlayStyle = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.1)',\n borderRadius: '100px',\n opacity: pressed ? 1 : 0,\n transition: 'opacity 0.1s ease'\n };\n\n const textContainerStyle = {\n position: 'absolute',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'transparent'\n };\n\n const iconPositionStyle = {\n position: 'absolute',\n right: '4px',\n top: '4px',\n bottom: '4px',\n width: '40px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: 'transparent'\n };\n\n const labelStyle = {\n fontFamily: 'Inter, system-ui, sans-serif',\n fontWeight: '600',\n fontSize: '16px',\n color: COLORS.btnLabel,\n textAlign: 'center',\n backgroundColor: 'transparent',\n ...textStyle\n };\n\n return (\n <button\n className={`relative ${className}`}\n style={buttonStyle}\n onClick={onClick}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n disabled={disabled || loading}\n data-testid={testId}\n aria-label={label}\n {...props}\n >\n {/* Pressed state overlay */}\n <div style={pressedOverlayStyle} />\n\n {/* Centered text container */}\n <div style={textContainerStyle}>\n {loading ? (\n <div \n className=\"animate-spin rounded-full border-2 border-white border-t-transparent\"\n style={{ width: '20px', height: '20px' }}\n />\n ) : (\n <span style={labelStyle}>{label}</span>\n )}\n </div>\n\n {/* Icon in fixed position on right */}\n <div style={iconPositionStyle}>\n {!loading && (iconRight || <IconCircle />)}\n </div>\n </button>\n );\n};\n\nexport { IconCircle };\nexport default PrimaryButton; ","import React, { useEffect, useState } from 'react';\nimport WelcomeScreen from './components/WelcomeScreen.jsx';\nimport EmailAuth from './components/EmailAuth.js';\nimport UniversalOnboarding from './components/UniversalOnboarding.jsx';\nimport PinSetup from './components/PinSetup.js';\nimport DataRequest from './components/DataRequest.js';\nimport TrainingComponent from './components/TrainingComponent.jsx';\nimport LoadingScreen from './components/LoadingScreen.jsx';\nimport { formatOnairosResponse } from './utils/responseFormatter.js';\nimport { logFormattedUserData } from './utils/userDataFormatter.js';\nimport { ModalPageLayout } from './components/ui/PageLayout.jsx';\n\nexport function OnairosButton({\n requestData, \n webpageName, \n inferenceData = null, \n onComplete = null, \n autoFetch = true, // Auto-enabled for seamless testing experience\n testMode = false, // Production mode by default - set to true for testing\n proofMode = false, \n textLayout = 'below', \n textColor = 'white',\n login = false,\n buttonType = 'pill',\n loginReturn = null,\n loginType = 'signIn',\n visualType = 'full',\n appIcon = null,\n enableTraining = true,\n formatResponse = true,\n responseFormat = { includeDictionary: true, includeArray: true },\n priorityPlatform = null, // Platform to prioritize (e.g., 'gmail', 'pinterest', 'linkedin')\n rawMemoriesOnly = false, // Show only LLM connections when true\n rawMemoriesConfig = null // Configuration for RAW memories collection\n}) {\n\n const [showOverlay, setShowOverlay] = useState(false);\n const [currentFlow, setCurrentFlow] = useState('welcome'); // 'welcome' | 'email' | 'onboarding' | 'pin' | 'dataRequest' (training is within onboarding)\n const [userData, setUserData] = useState(null);\n const [error, setError] = useState(null);\n\n // Check for existing user session\n useEffect(() => {\n const checkExistingSession = () => {\n // In test mode, always start fresh to see the full flow\n if (testMode) {\n console.log('๐Ÿงช Test mode: Starting fresh flow, clearing any cached user data');\n localStorage.removeItem('onairosUser');\n setCurrentFlow('welcome');\n return;\n }\n \n const savedUser = localStorage.getItem('onairosUser');\n if (savedUser) {\n try {\n const user = JSON.parse(savedUser);\n setUserData(user);\n // If user has completed onboarding and PIN setup, go directly to data request\n if (user.onboardingComplete && user.pinCreated) {\n setCurrentFlow('dataRequest');\n } else if (user.verified && !user.onboardingComplete) {\n setCurrentFlow('onboarding');\n } else if (user.onboardingComplete && !user.pinCreated) {\n setCurrentFlow('pin');\n }\n } catch (error) {\n console.error('Error parsing saved user data:', error);\n localStorage.removeItem('onairosUser');\n }\n }\n };\n\n checkExistingSession();\n }, [testMode]);\n\n const openTerminal = async () => {\n try {\n console.log('๐Ÿ”ฅ openTerminal called - resetting flow');\n console.log('๐Ÿ”ฅ testMode prop:', testMode);\n console.log('๐Ÿ”ฅ window.onairosApiKey:', window.onairosApiKey);\n // ALWAYS reset flow on open to start fresh every time\n setCurrentFlow('welcome');\n setUserData(null);\n try { localStorage.removeItem('onairosUser'); } catch {}\n setShowOverlay(true);\n } catch (error) {\n console.error('Error in openTerminal:', error);\n }\n };\n\n const handleCloseOverlay = () => {\n setShowOverlay(false);\n setError(null);\n // Reset flow and session so next open starts fresh\n setCurrentFlow('welcome');\n try { localStorage.removeItem('onairosUser'); } catch {}\n setUserData(null);\n };\n\n // Handle clicks on the backdrop to close modal\n const handleBackdropClick = (e) => {\n if (e.target === e.currentTarget) {\n handleCloseOverlay();\n }\n };\n\n const handleWelcomeContinue = () => {\n console.log('๐Ÿ”ฅ Welcome screen continue clicked');\n setCurrentFlow('email');\n };\n\n const handleEmailAuthSuccess = (authData) => {\n console.log('๐Ÿ”ฅ Email auth successful:', authData);\n console.log('๐Ÿ”ง User State:', {\n isNewUser: authData.isNewUser,\n userState: authData.userState,\n flowType: authData.flowType,\n existingUser: authData.existingUser,\n hasAccountInfo: !!authData.accountInfo\n });\n\n // Save identity-bearing JWT immediately (email/id/userId/sub)\n try {\n const candidate = authData.jwtToken || authData.token || authData.accessToken;\n if (candidate) {\n const base64 = candidate.split('.')[1];\n if (base64) {\n const payload = JSON.parse(decodeURIComponent(atob(base64).split('').map(c => '%'+('00'+c.charCodeAt(0).toString(16)).slice(-2)).join('')));\n if (payload && (payload.email || payload.id || payload.userId || payload.sub)) {\n try { localStorage.setItem('onairos_user_token', candidate); } catch {}\n console.log('โœ… [OnairosButton] Identity JWT saved from email auth');\n } else {\n console.warn('โš ๏ธ [OnairosButton] Email auth returned minimal token (no id/email)');\n }\n }\n }\n } catch (e) {\n console.warn('โš ๏ธ [OnairosButton] Failed to parse/save email auth token');\n }\n \n // Determine flow based on API response - more explicit checking\n const isNewUser = authData.isNewUser === true || \n authData.existingUser === false || \n authData.flowType === 'onboarding' || \n authData.userState === 'new' ||\n !authData.accountInfo; // No account info means new user\n \n console.log('๐Ÿ” Flow determination:', {\n finalDecision: isNewUser ? 'NEW USER โ†’ onboarding (data connectors)' : 'EXISTING USER โ†’ dataRequest (data permissions)',\n reasoning: {\n isNewUser: authData.isNewUser,\n existingUserFalse: authData.existingUser === false,\n flowTypeOnboarding: authData.flowType === 'onboarding',\n noAccountInfo: !authData.accountInfo\n }\n });\n \n const newUserData = {\n ...authData,\n verified: true,\n onboardingComplete: !isNewUser, // New users need onboarding, returning users have completed it\n pinCreated: !isNewUser // Assume returning users have PIN, new users need to create it\n };\n \n setUserData(newUserData);\n localStorage.setItem('onairosUser', JSON.stringify(newUserData));\n \n // Flow decision logic - prioritize new user detection\n if (isNewUser) {\n console.log('๐Ÿš€ NEW USER detected โ†’ Starting onboarding flow (data connectors page)');\n setCurrentFlow('onboarding');\n } else {\n console.log('๐Ÿ‘‹ EXISTING USER detected โ†’ Going directly to data request (data permissions page)');\n setCurrentFlow('dataRequest');\n }\n };\n\n const handleOnboardingComplete = (onboardingData) => {\n console.log('Onboarding completed:', onboardingData);\n const updatedUserData = {\n ...userData,\n onboardingComplete: true,\n connectedAccounts: onboardingData.connectedAccounts || []\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n setCurrentFlow('pin');\n };\n\n const handlePinSetupComplete = async (pinData) => {\n console.log('PIN setup completed:', pinData);\n const updatedUserData = {\n ...userData,\n ...pinData,\n pinCreated: true\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // ๐Ÿ”ฅ FIX: Don't trigger training here - wait for user to approve data request\n console.log('โœ… PIN created - moving to data request (training will start after approval)');\n \n // Go directly to data request - user must approve before training starts\n setCurrentFlow('dataRequest');\n };\n\n const handleLoadingComplete = () => {\n setCurrentFlow('dataRequest');\n };\n\n const handleTrainingComplete = (trainingResult) => {\n console.log('๐ŸŽ“ Training completed:', trainingResult);\n const updatedUserData = {\n ...userData,\n trainingCompleted: true,\n ...trainingResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // Move to data request after training\n setCurrentFlow('dataRequest');\n };\n\n const handleDataRequestComplete = async (requestResult) => {\n console.log('๐Ÿ”ฅ OnairosButton: Data request completed:', requestResult);\n \n // Update user data with request result\n const updatedUserData = {\n ...userData,\n lastDataRequest: requestResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n\n // Handle data fetching if autoFetch is enabled\n let finalResult = requestResult;\n \n if (autoFetch && requestResult.approved?.length > 0) {\n console.log('๐Ÿš€ Auto-fetching data from Onairos API...');\n \n try {\n // 1. Get the API URL from the backend\n const urlResponse = await fetch('https://api2.onairos.uk/getAPIurlMobile', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n Info: {\n appId: webpageName,\n account: userData?.email || userData?.username,\n confirmations: requestResult.approved.map(id => ({ data: id === 'personality' ? 'Large' : id === 'basic' ? 'Basic' : id })),\n EncryptedUserPin: userData?.EncryptedUserPin || 'pending_pin_integration',\n storage: 's3',\n proofMode: proofMode\n }\n })\n });\n\n const urlData = await urlResponse.json();\n console.log('๐Ÿ”— API URL received:', urlData.apiUrl);\n\n if (urlData.apiUrl && urlData.token) {\n // 2. Fetch the actual data\n // Always use POST for consistency and to support body data\n // traits-only endpoint requires POST\n const method = 'POST';\n \n console.log(`๐Ÿ“ก Fetching data from ${urlData.apiUrl} (${method})...`);\n \n const dataResponse = await fetch(urlData.apiUrl, {\n method: method,\n headers: {\n 'Authorization': `Bearer ${urlData.token}`,\n 'Content-Type': 'application/json'\n },\n // Only send body for POST\n body: method === 'POST' ? JSON.stringify({\n email: userData?.email,\n includeLlmData: requestResult.approved.includes('rawMemories')\n }) : undefined\n });\n\n const apiResponse = await dataResponse.json();\n console.log('๐Ÿ“ฆ Data received:', apiResponse);\n\n // Merge into result\n finalResult = {\n ...requestResult,\n apiResponse: apiResponse, // Raw response\n token: urlData.token, // Token used\n apiUrl: urlData.apiUrl // URL used\n };\n \n // Add to updated user data\n updatedUserData.apiResponse = apiResponse;\n setUserData(updatedUserData);\n } else {\n console.warn('โš ๏ธ Failed to get API URL:', urlData);\n }\n } catch (fetchError) {\n console.error('โŒ Error auto-fetching data:', fetchError);\n // Continue with what we have\n }\n }\n\n // Close overlay immediately\n console.log('๐Ÿ”ฅ Closing overlay after data request completion');\n // Use centralized close to also reset flow and session\n handleCloseOverlay();\n\n // Format response if requested and API response is present\n let formattedResult = finalResult;\n if (formatResponse && finalResult?.apiResponse) {\n try {\n formattedResult = {\n ...requestResult,\n apiResponse: formatOnairosResponse(requestResult.apiResponse, responseFormat)\n };\n console.log('๐Ÿ”ฅ Response formatted with dictionary:', formattedResult.apiResponse?.personalityDict || 'No personality data');\n } catch (error) {\n console.warn('๐Ÿ”ฅ Error formatting response:', error);\n // Continue with original result if formatting fails\n }\n }\n\n // Add user data to the result for comprehensive formatting\n const completeResult = {\n ...formattedResult,\n userData: updatedUserData\n };\n\n // Enhanced user data formatting for better display\n let enhancedResult = completeResult;\n try {\n // Log formatted user data for better readability\n enhancedResult = logFormattedUserData(completeResult);\n } catch (formatError) {\n console.warn('โš ๏ธ Error formatting user data for display:', formatError);\n // Continue with unformatted result to ensure app doesn't break\n }\n\n // Call onComplete callback if provided\n console.log('๐Ÿ”ฅ Calling onComplete callback');\n console.log('๐Ÿ”ฅ onComplete data structure:', {\n token: enhancedResult.token ? 'โœ… Present (JWT string)' : 'โŒ Missing',\n apiUrl: enhancedResult.apiUrl ? 'โœ… Present (URL string)' : 'โŒ Missing',\n apiResponse: enhancedResult.apiResponse ? 'โœ… Present (object)' : 'โŒ Missing',\n userData: enhancedResult.userData ? 'โœ… Present (object)' : 'โŒ Missing',\n success: enhancedResult.success,\n testMode: enhancedResult.testMode,\n allKeys: Object.keys(enhancedResult)\n });\n \n if (onComplete) {\n try {\n onComplete(enhancedResult);\n console.log('๐Ÿ”ฅ onComplete callback executed successfully with enhanced formatting');\n } catch (error) {\n console.error('๐Ÿ”ฅ Error in onComplete callback:', error);\n }\n } else {\n console.log('๐Ÿ”ฅ No onComplete callback provided');\n }\n };\n\n const getFlowTitle = () => {\n switch (currentFlow) {\n case 'welcome':\n return ''; // WelcomeScreen handles its own titles\n case 'email':\n return ''; // EmailAuth handles its own titles\n case 'onboarding':\n return 'Connect Your Data';\n case 'pin':\n return 'Secure Your Account';\n case 'training':\n return 'Training Your Model';\n case 'dataRequest':\n return 'Data Request';\n default:\n return '';\n }\n };\n\n const getFlowSubtitle = () => {\n switch (currentFlow) {\n case 'welcome':\n return ''; // WelcomeScreen handles its own subtitles\n case 'email':\n return ''; // EmailAuth handles its own subtitles\n case 'onboarding':\n return 'Choose which accounts to connect for a personalized experience';\n case 'pin':\n return 'Create a secure PIN to protect your data';\n case 'training':\n return 'Building your personalized insights';\n case 'dataRequest':\n return `Select the data you want to share with ${webpageName}`;\n default:\n return '';\n }\n };\n\n const getFlowIcon = () => {\n switch (currentFlow) {\n case 'welcome':\n return ''; // WelcomeScreen handles its own layout\n case 'email':\n return ''; // EmailAuth handles its own layout\n case 'onboarding':\n return '๐Ÿ”—';\n case 'pin':\n return '๐Ÿ”’';\n case 'training':\n return 'โšก';\n case 'dataRequest':\n return '๐Ÿ“Š';\n default:\n return '';\n }\n };\n\n const renderCurrentFlow = () => {\n switch (currentFlow) {\n case 'welcome':\n return (\n <WelcomeScreen \n onContinue={handleWelcomeContinue}\n onClose={handleCloseOverlay}\n webpageName={webpageName}\n appIcon={appIcon}\n testMode={testMode}\n />\n );\n case 'email':\n return (\n <div className=\"h-[min(85vh,700px)]\">\n <EmailAuth \n onSuccess={handleEmailAuthSuccess}\n testMode={testMode} // Use the testMode prop from initialization\n />\n </div>\n );\n \n case 'onboarding':\n return (\n <UniversalOnboarding \n onComplete={handleOnboardingComplete}\n onBack={() => setCurrentFlow('email')}\n appIcon={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n appName={webpageName}\n username={userData?.email || userData?.username}\n testMode={testMode}\n priorityPlatform={priorityPlatform}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n );\n \n case 'pin':\n return (\n <PinSetup \n onComplete={handlePinSetupComplete}\n userEmail={userData?.email}\n />\n );\n \n case 'training':\n return (\n <TrainingComponent \n onComplete={handleTrainingComplete}\n userEmail={userData?.email}\n appName={webpageName}\n connectedAccounts={userData?.connectedAccounts || []}\n testMode={testMode}\n />\n );\n \n case 'dataRequest':\n console.log('๐Ÿ” [DEBUG] Rendering DataRequest with userData:', {\n email: userData?.email,\n userName: userData?.userName,\n hasUserData: !!userData,\n userDataKeys: userData ? Object.keys(userData) : []\n });\n return (\n <DataRequest \n onComplete={handleDataRequestComplete}\n userEmail={userData?.email || userData?.userName}\n requestData={requestData}\n appName={webpageName}\n autoFetch={autoFetch}\n testMode={testMode}\n appIcon={appIcon}\n connectedAccounts={userData?.connectedAccounts || {}}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n );\n \n default:\n return (\n <div className=\"flex flex-col items-center space-y-4 p-6\">\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\n <p className=\"text-gray-600\">Loading...</p>\n </div>\n );\n }\n };\n\n // Styling and button class based on visual type\n const buttonClass = \n `flex items-center justify-center font-bold rounded cursor-pointer ${\n buttonType === 'pill' ? 'px-4 py-2' : 'w-12 h-12'\n } bg-transparent OnairosConnect`;\n\n const buttonStyle = {\n flexDirection: textLayout === 'below' ? 'column' : 'row',\n backgroundColor: 'transparent',\n color: textColor,\n border: '1px solid transparent',\n };\n\n // Icon and text style based on the visualType\n const logoStyle = {\n width: '20px',\n height: '20px',\n marginRight: visualType === 'full' ? '12px' : '0',\n };\n\n const getText = () => {\n switch (loginType) {\n case 'signUp':\n return 'Sign Up with Onairos';\n case 'signOut':\n return 'Sign Out of Onairos';\n default:\n return 'Sign In with Onairos';\n }\n };\n\n return (\n <>\n <button\n className={buttonClass}\n onClick={openTerminal}\n style={buttonStyle}\n >\n {(visualType === 'full' || visualType === 'icon') && (\n <img\n src={login ? \"https://onairos.sirv.com/Images/OnairosWhite.png\" : \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n alt=\"Onairos Logo\"\n style={logoStyle}\n />\n )}\n {visualType !== 'icon' && (\n <span className={`${textColor === 'black' ? 'text-black' : 'text-white'} ${visualType === 'icon' ? 'sr-only' : ''} ${textLayout === 'right' ? 'ml-2' : textLayout === 'left' ? 'mr-2' : ''}`}>\n {getText()}\n </span>\n )}\n </button>\n\n {/* Modal with New Design */}\n {showOverlay && (\n <>\n {currentFlow === 'email' ? (\n // Special case for email - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={handleCloseOverlay}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Email Content */}\n <div className=\"h-[min(85vh,700px)]\">\n <EmailAuth \n onSuccess={handleEmailAuthSuccess}\n testMode={testMode}\n />\n </div>\n </div>\n </div>\n ) : currentFlow === 'onboarding' ? (\n // Special case for onboarding - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={() => setCurrentFlow('email')}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Onboarding Content */}\n <UniversalOnboarding \n onComplete={handleOnboardingComplete}\n onBack={() => setCurrentFlow('email')}\n appIcon={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n appName={webpageName}\n username={userData?.email || userData?.username}\n testMode={testMode}\n priorityPlatform={priorityPlatform}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n </div>\n </div>\n ) : currentFlow === 'dataRequest' ? (\n // Special case for dataRequest - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={() => setCurrentFlow('onboarding')}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* DataRequest Content */}\n <DataRequest \n onComplete={handleDataRequestComplete}\n userEmail={userData?.email || userData?.userName}\n requestData={requestData}\n appName={webpageName}\n autoFetch={autoFetch}\n testMode={testMode}\n appIcon={appIcon}\n connectedAccounts={userData?.connectedAccounts || {}}\n rawMemoriesOnly={rawMemoriesOnly}\n rawMemoriesConfig={rawMemoriesConfig}\n />\n </div>\n </div>\n ) : currentFlow === 'pin' ? (\n // Special case for pin - render directly without PageLayout wrapper\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex items-center justify-center p-6\" style={{ zIndex: 2147483647 }}>\n <div className=\"bg-white rounded-3xl w-full max-w-lg mx-auto shadow-2xl overflow-hidden flex flex-col\" style={{ maxWidth: '500px', height: '90vh' }}>\n {/* Header */}\n <div className=\"relative px-6 pt-6 pb-4 flex-shrink-0\">\n <button\n onClick={() => setCurrentFlow('onboarding')}\n className=\"absolute left-4 top-4 p-2 hover:bg-gray-100 rounded-full transition-colors\"\n >\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n </div>\n\n {/* PinSetup Content - Must take remaining height */}\n <div className=\"flex-1 min-h-0\">\n <PinSetup \n onComplete={handlePinSetupComplete}\n onBack={() => setCurrentFlow('onboarding')}\n userEmail={userData?.email}\n />\n </div>\n </div>\n </div>\n ) : currentFlow === 'loading' ? (\n // Loading screen\n <LoadingScreen onComplete={handleLoadingComplete} />\n ) : (\n // All other flows use PageLayout wrapper\n <ModalPageLayout\n visible={showOverlay}\n onClose={handleCloseOverlay}\n showBackButton={currentFlow === 'training'}\n onBack={() => {\n if (currentFlow === 'email') setCurrentFlow('welcome');\n if (currentFlow === 'onboarding') setCurrentFlow('email');\n if (currentFlow === 'pin') setCurrentFlow('onboarding'); \n if (currentFlow === 'training') setCurrentFlow('pin');\n }}\n title={getFlowTitle()}\n subtitle={getFlowSubtitle()}\n icon={getFlowIcon()}\n centerContent={true}\n >\n {renderCurrentFlow()}\n </ModalPageLayout>\n )}\n </>\n )}\n </>\n );\n}\n\nexport default OnairosButton;","// Theme colors for Onairos SDK - derived from mobile design\nexport const COLORS = {\n // Button gradient colors\n btnGradStart: '#1A1A1A',\n btnGradEnd: '#000000',\n \n // Button text and icon colors\n btnLabel: '#FFFFFF',\n btnBorder: 'rgba(0, 0, 0, 0.2)',\n \n // Icon circle gradient colors\n iconCircleGradientStart: '#333333',\n iconCircleGradientEnd: '#1A1A1A',\n \n // Background colors\n background: '#FFFFFF',\n backgroundSecondary: '#F8F9FA',\n \n // Text colors\n textPrimary: '#1A1A1A',\n textSecondary: '#6B7280',\n textMuted: '#9CA3AF',\n \n // Border colors\n border: '#E5E7EB',\n borderLight: '#F3F4F6',\n \n // Status colors\n success: '#10B981',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#3B82F6',\n \n // Interactive states\n hover: 'rgba(0, 0, 0, 0.05)',\n pressed: 'rgba(0, 0, 0, 0.1)',\n focus: 'rgba(59, 130, 246, 0.1)',\n};\n\nexport default COLORS; ","/**\n * Response formatter utility for Onairos SDK\n * Converts array-based responses to dictionary format for better developer experience\n */\n\n// Standard 16 personality types in order that the API returns them\nexport const PERSONALITY_TYPES = [\n 'Analyst',\n 'Diplomat', \n 'Sentinel',\n 'Explorer',\n 'Architect',\n 'Logician',\n 'Commander',\n 'Debater',\n 'Advocate',\n 'Mediator',\n 'Protagonist',\n 'Campaigner',\n 'Logistician',\n 'Defender',\n 'Executive',\n 'Consul'\n];\n\n// Standard trait categories that might be returned\nexport const TRAIT_CATEGORIES = [\n 'Openness',\n 'Conscientiousness',\n 'Extraversion',\n 'Agreeableness',\n 'Neuroticism'\n];\n\n/**\n * Formats API response to include both array and dictionary formats\n * @param {Object} apiResponse - Raw API response from Onairos\n * @param {Object} options - Formatting options\n * @param {boolean} options.includeDictionary - Whether to include dictionary format (default: true)\n * @param {boolean} options.includeArray - Whether to include original array format (default: true)\n * @returns {Object} Formatted response with both formats\n */\nexport function formatOnairosResponse(apiResponse, options = {}) {\n const { includeDictionary = true, includeArray = true } = options;\n \n if (!apiResponse) {\n return apiResponse;\n }\n\n const formatted = { ...apiResponse };\n\n // Handle personality scores if present\n if (apiResponse.InferenceResult?.traits || apiResponse.traits || apiResponse.scores) {\n const scores = apiResponse.InferenceResult?.traits || apiResponse.traits || apiResponse.scores;\n \n if (Array.isArray(scores) && scores.length >= 16) {\n if (includeDictionary) {\n // Create personality dictionary\n const personalityDict = {};\n PERSONALITY_TYPES.forEach((type, index) => {\n personalityDict[type] = scores[index];\n });\n \n // Add to formatted response\n if (formatted.InferenceResult) {\n formatted.InferenceResult.personalityDict = personalityDict;\n } else {\n formatted.personalityDict = personalityDict;\n }\n }\n \n if (!includeArray) {\n // Remove array format if not requested\n if (formatted.InferenceResult?.traits) {\n delete formatted.InferenceResult.traits;\n }\n if (formatted.traits) {\n delete formatted.traits;\n }\n if (formatted.scores) {\n delete formatted.scores;\n }\n }\n }\n }\n\n // Handle trait data if present (for preferences/traits)\n if (apiResponse.traitResult || apiResponse.traits) {\n const traits = apiResponse.traitResult || apiResponse.traits;\n \n if (Array.isArray(traits) && includeDictionary) {\n const traitDict = {};\n TRAIT_CATEGORIES.forEach((category, index) => {\n if (traits[index] !== undefined) {\n traitDict[category] = traits[index];\n }\n });\n \n formatted.traitDict = traitDict;\n }\n }\n\n return formatted;\n}\n\n/**\n * Legacy formatter for backward compatibility\n * Converts scores array to personality dictionary only\n * @param {Array} scores - Array of personality scores\n * @returns {Object} Dictionary with personality type names as keys\n */\nexport function formatPersonalityScores(scores) {\n if (!Array.isArray(scores) || scores.length < 16) {\n console.warn('Invalid scores array provided to formatPersonalityScores');\n return {};\n }\n\n const personalityDict = {};\n PERSONALITY_TYPES.forEach((type, index) => {\n personalityDict[type] = scores[index];\n });\n \n return personalityDict;\n}\n\n/**\n * Get personality type names in order\n * @returns {Array} Array of personality type names\n */\nexport function getPersonalityTypes() {\n return [...PERSONALITY_TYPES];\n}\n\n/**\n * Get trait category names in order \n * @returns {Array} Array of trait category names\n */\nexport function getTraitCategories() {\n return [...TRAIT_CATEGORIES];\n} ","/**\n * Enhanced User Data Formatter for onComplete Callback\n * Provides structured, readable formatting of Onairos user data\n */\n\n/**\n * Formats user data for better readability in onComplete callback\n * @param {Object} result - The complete result object from data request\n * @returns {Object} Enhanced result with formatted user data display\n */\nexport function formatUserDataForDisplay(result) {\n if (!result) return result;\n\n const formatted = { ...result };\n \n // Create a structured summary of the user data\n const userDataSummary = {\n // Basic request information\n requestInfo: {\n timestamp: result.timestamp || new Date().toISOString(),\n appName: result.appName || 'Unknown App',\n userHash: result.userHash || 'Unknown User',\n testMode: result.testMode || false,\n dataTypesRequested: result.approvedData || []\n },\n \n // User authentication and profile data\n userProfile: {\n email: result.userData?.email || 'Not provided',\n userType: result.userData?.userType || 'Unknown',\n onboardingComplete: result.userData?.onboardingComplete || false,\n pinCreated: result.userData?.pinCreated || false,\n trainingComplete: result.userData?.trainingComplete || false,\n modelReady: result.userData?.modelReady || false\n },\n \n // Connected platforms/accounts\n connectedAccounts: formatConnectedAccounts(result.userData?.connectedAccounts || []),\n \n // API response data (personality, preferences, etc.)\n aiData: formatAIResponseData(result.apiResponse),\n \n // Success status and any errors\n status: {\n success: result.success || false,\n hasApiResponse: !!result.apiResponse,\n hasErrors: !!result.error || !!result.apiError\n }\n };\n\n // Add the formatted summary to the result\n formatted.userDataSummary = userDataSummary;\n \n // Create a pretty-printed version for console logging\n formatted.prettyPrint = createPrettyPrintVersion(userDataSummary);\n \n return formatted;\n}\n\n/**\n * Formats connected accounts data\n * @param {Array} accounts - Array of connected account objects\n * @returns {Object} Formatted accounts summary\n */\nfunction formatConnectedAccounts(accounts) {\n if (!Array.isArray(accounts) || accounts.length === 0) {\n return {\n count: 0,\n platforms: [],\n summary: 'No connected accounts'\n };\n }\n\n return {\n count: accounts.length,\n platforms: accounts.map(account => ({\n name: account.platform || account.name || 'Unknown Platform',\n status: account.status || 'Unknown',\n connectedAt: account.connectedAt || 'Unknown date',\n hasData: account.hasData || false\n })),\n summary: `${accounts.length} platform(s) connected: ${accounts.map(a => a.platform || a.name).join(', ')}`\n };\n}\n\n/**\n * Formats AI response data (personality scores, traits, etc.)\n * @param {Object} apiResponse - The API response containing AI data\n * @returns {Object} Formatted AI data summary\n */\nfunction formatAIResponseData(apiResponse) {\n if (!apiResponse) {\n return {\n available: false,\n summary: 'No AI data available'\n };\n }\n\n const aiData = {\n available: true,\n dataTypes: []\n };\n\n // Check for Onairos Wrapped Dashboard\n if (apiResponse.data?.dashboard || apiResponse.dashboard || apiResponse.slides) {\n aiData.dataTypes.push({\n type: 'wrapped_dashboard',\n available: true,\n data: apiResponse.data?.dashboard || apiResponse.dashboard || apiResponse,\n summary: 'Onairos Wrapped / Neural Recall Dashboard'\n });\n \n // Add apps if available\n if (apiResponse.data?.apps || apiResponse.apps) {\n aiData.dataTypes.push({\n type: 'connected_apps',\n available: true,\n data: apiResponse.data?.apps || apiResponse.apps,\n summary: `Connected apps list (${(apiResponse.data?.apps || apiResponse.apps).length})`\n });\n }\n }\n\n // Check for personality data\n if (apiResponse.InferenceResult?.traits || apiResponse.personalityDict || apiResponse.traits) {\n const personalityData = {\n type: 'personality',\n available: true\n };\n\n // If we have dictionary format, use it for better readability\n if (apiResponse.personalityDict) {\n personalityData.data = apiResponse.personalityDict;\n personalityData.summary = `Personality analysis with ${Object.keys(apiResponse.personalityDict).length} traits`;\n } else if (apiResponse.InferenceResult?.traits) {\n personalityData.data = apiResponse.InferenceResult.traits;\n personalityData.summary = `Personality scores array with ${apiResponse.InferenceResult.traits.length} values`;\n } else if (apiResponse.traits) {\n personalityData.data = apiResponse.traits;\n personalityData.summary = `Personality traits with ${Array.isArray(apiResponse.traits) ? apiResponse.traits.length : Object.keys(apiResponse.traits).length} items`;\n }\n\n aiData.dataTypes.push(personalityData);\n }\n\n // Check for preferences/traits data\n if (apiResponse.traitResult || apiResponse.traitDict) {\n const preferencesData = {\n type: 'preferences',\n available: true\n };\n\n if (apiResponse.traitDict) {\n preferencesData.data = apiResponse.traitDict;\n preferencesData.summary = `Preferences analysis with ${Object.keys(apiResponse.traitDict).length} categories`;\n } else if (apiResponse.traitResult) {\n preferencesData.data = apiResponse.traitResult;\n preferencesData.summary = `Trait results with ${Array.isArray(apiResponse.traitResult) ? apiResponse.traitResult.length : Object.keys(apiResponse.traitResult).length} items`;\n }\n\n aiData.dataTypes.push(preferencesData);\n }\n\n // Check for basic info/output\n if (apiResponse.InferenceResult?.output || apiResponse.output) {\n aiData.dataTypes.push({\n type: 'basic_info',\n available: true,\n data: apiResponse.InferenceResult?.output || apiResponse.output,\n summary: 'Basic user information and insights'\n });\n }\n\n // Create overall summary\n aiData.summary = aiData.dataTypes.length > 0 \n ? `AI analysis complete with ${aiData.dataTypes.length} data type(s): ${aiData.dataTypes.map(d => d.type).join(', ')}`\n : 'AI data structure present but no recognized data types found';\n\n return aiData;\n}\n\n/**\n * Creates a pretty-printed version for console logging\n * @param {Object} userDataSummary - The formatted user data summary\n * @returns {string} Pretty-printed string for console output\n */\nfunction createPrettyPrintVersion(userDataSummary) {\n const lines = [];\n \n lines.push('๐ŸŽ‰ ONAIROS USER DATA SUMMARY');\n lines.push('=' .repeat(50));\n \n // Request Info\n lines.push('\\n๐Ÿ“‹ REQUEST INFORMATION:');\n lines.push(` App: ${userDataSummary.requestInfo.appName}`);\n lines.push(` User: ${userDataSummary.requestInfo.userHash}`);\n lines.push(` Mode: ${userDataSummary.requestInfo.testMode ? 'Test' : 'Production'}`);\n lines.push(` Data Types: ${userDataSummary.requestInfo.dataTypesRequested.join(', ') || 'None'}`);\n lines.push(` Timestamp: ${new Date(userDataSummary.requestInfo.timestamp).toLocaleString()}`);\n \n // User Profile\n lines.push('\\n๐Ÿ‘ค USER PROFILE:');\n lines.push(` Email: ${userDataSummary.userProfile.email}`);\n lines.push(` Type: ${userDataSummary.userProfile.userType}`);\n lines.push(` Onboarding: ${userDataSummary.userProfile.onboardingComplete ? 'โœ…' : 'โŒ'}`);\n lines.push(` PIN Setup: ${userDataSummary.userProfile.pinCreated ? 'โœ…' : 'โŒ'}`);\n lines.push(` Training: ${userDataSummary.userProfile.trainingComplete ? 'โœ…' : 'โŒ'}`);\n lines.push(` Model Ready: ${userDataSummary.userProfile.modelReady ? 'โœ…' : 'โŒ'}`);\n \n // Connected Accounts\n lines.push('\\n๐Ÿ”— CONNECTED ACCOUNTS:');\n lines.push(` ${userDataSummary.connectedAccounts.summary}`);\n if (userDataSummary.connectedAccounts.platforms.length > 0) {\n userDataSummary.connectedAccounts.platforms.forEach(platform => {\n lines.push(` โ€ข ${platform.name}: ${platform.status} ${platform.hasData ? '(has data)' : '(no data)'}`);\n });\n }\n \n // AI Data\n lines.push('\\n๐Ÿค– AI ANALYSIS DATA:');\n lines.push(` ${userDataSummary.aiData.summary}`);\n if (userDataSummary.aiData.dataTypes.length > 0) {\n userDataSummary.aiData.dataTypes.forEach(dataType => {\n lines.push(` โ€ข ${dataType.type.toUpperCase()}: ${dataType.summary}`);\n });\n }\n \n // Status\n lines.push('\\nโœ… STATUS:');\n lines.push(` Success: ${userDataSummary.status.success ? 'โœ…' : 'โŒ'}`);\n lines.push(` API Response: ${userDataSummary.status.hasApiResponse ? 'โœ…' : 'โŒ'}`);\n lines.push(` Errors: ${userDataSummary.status.hasErrors ? 'โŒ Yes' : 'โœ… None'}`);\n \n lines.push('\\n' + '=' .repeat(50));\n \n return lines.join('\\n');\n}\n\n/**\n * Console logging helper that prints formatted user data\n * @param {Object} result - The result object from onComplete\n */\nexport function logFormattedUserData(result) {\n const formatted = formatUserDataForDisplay(result);\n \n console.log('\\n' + formatted.prettyPrint + '\\n');\n \n // Also log the structured data for programmatic access\n console.log('๐Ÿ“Š Structured User Data Summary:', formatted.userDataSummary);\n \n return formatted;\n}\n\nexport default {\n formatUserDataForDisplay,\n logFormattedUserData\n};\n"],"names":["Icon","_ref","type","base","React","className","viewBox","fill","d","DataTypeToggle","_ref2","dataType","enabled","onToggle","onClick","handle","required","id","icon","name","concat","options","_ref3","appName","onComplete","connectedPlatforms","selected","setSelected","useState","basic","rawMemories","preferences","personality","freq","setFreq","toggle","val","p","_objectSpread","selectedCount","Object","values","filter","Boolean","length","platforms","getConnected","Array","isArray","entries","_ref4","_","v","map","_ref5","k","u","JSON","parse","localStorage","getItem","connectedAccounts","_ref6","_ref7","_unused","freqToPercent","f","stroke","strokeWidth","strokeLinecap","opt","key","e","rect","currentTarget","getBoundingClientRect","ratio","Math","max","min","width","clientX","left","style","background","platform","index","src","Instagram","YouTube","LinkedIn","Reddit","Pinterest","GitHub","Facebook","Gmail","Twitter","ChatGPT","Claude","Gemini","Grok","alt","title","onError","display","disabled","approved","keys","color","declined","EmailAuth","onSuccess","testMode","email","setEmail","code","setCode","step","setStep","isLoading","setIsLoading","error","setError","emailSent","setEmailSent","emailServiceMessage","setEmailServiceMessage","useEffect","setTimeout","firstInput","document","querySelector","focus","handleEmailSubmit","async","preventDefault","test","validateEmail","console","log","baseUrl","window","onairosBaseUrl","apiKey","onairosApiKey","response","fetch","method","headers","body","stringify","trim","toLowerCase","ok","Error","data","json","success","message","handleGoogleAuth","_JSON$parse","tempId","Date","now","random","toString","substr","setItem","sdkConfig","username","res","session","oauthUrl","gmailURL","gmailUrl","gmail_url","url","popup","open","messageHandler","event","origin","includes","removeEventListener","handleOAuthSuccess","gmailEmail","addEventListener","pollCount","maxPolls","localStorageKey","timestampKey","pollInterval","setInterval","closed","clearInterval","retrieveAndContinueWithGoogleEmail","timestamp","timestampNum","parseInt","close","cleanup","removeItem","_onairosOAuthCleanup","emailRes","warn","normalizedEmail","verified","token","userName","split","existingUser","accountInfo","isNewUser","flowType","adminMode","userCreated","accountDetails","createdAt","toISOString","ssoProvider","handleCodeSubmit","simulatedResponse","testAccount","jwtToken","height","value","onChange","target","placeholder","fontFamily","WebkitTextFillColor","COLORS","strokeLinejoin","fontWeight","fontSize","lineHeight","textPrimary","textSecondary","backgroundColor","borderColor","from","maxLength","newCode","join","_e$target$parentEleme","nextInput","parentElement","children","onKeyDown","_e$target$parentEleme2","prevInput","border","PrimaryButton","label","loading","testId","textStyle","flex","minHeight","Check","LoadingScreen","currentStep","setCurrentStep","dotCount","setDotCount","loadingStates","progress","stateInterval","prev","nextStep","dotInterval","currentState","zIndex","pointerEvents","maxWidth","aspectRatio","Lottie","animationData","rainAnim","loop","autoplay","repeat","PinSetup","onBack","userEmail","pin","setPin","pinRequirements","setPinRequirements","uppercase","number","allRequirementsMet","overflow","handleSubmit","pinCreated","undefined","TrainingComponent","_steps$currentStep","_steps$currentStep2","_steps$currentStep3","_steps$currentStep4","_steps$currentStep5","setProgress","isComplete","setIsComplete","steps","description","duration","interval","stepTimeout","stepDuration","stepProgress","newProgress","completionDelay","trainingComplete","simulatedTraining","clearTimeout","info","round","borderLight","backgroundSecondary","textMuted","chatgptIcon","claudeIcon","geminiIcon","grokIcon","process","env","REACT_APP_ONAIROS_API_KEY","REACT_APP_ONAIROS_BASE_URL","sdkType","enableHealthMonitoring","enableAutoRefresh","enableConnectionValidation","fadeSlideInKeyframes","UniversalOnboarding","lottieRef","useRef","lastFrameRef","rafRef","setConnectedAccounts","isConnecting","setIsConnecting","connectingPlatform","setConnectingPlatform","currentPage","setCurrentPage","showChatGPTModal","setShowChatGPTModal","touchStartX","touchDeltaX","vh","setVh","innerHeight","onResize","personaSide","SLOT","floor","ACTIVE_SCALE","igGradId","useId","Brand","objectFit","cx","cy","r","offset","stopColor","x","y","rx","aiLinks","descriptions","allPlatforms","connector","directLink","page","slice","s","userData","accountsObj","reduce","acc","handleSwitch","plat","find","candidates","youtube","linkedin","reddit","pinterest","instagram","github","facebook","gmail","touched","it","location","hostname","_unused2","_unused3","_unused4","connectToPlatform","connectedCount","current","totalFrames","personaAnim","start","startTs","performance","t","eased","frame","goToAndStop","requestAnimationFrame","cancelAnimationFrame","maxHeight","position","top","transform","opacity","onTouchStart","touches","onTouchMove","onTouchEnd","dx","gridAutoFlow","gridTemplateColumns","columnGap","alignItems","justifyItems","paddingInline","idx","on","isSel","shift","animation","transformOrigin","marginTop","marginBottom","n","role","transition","paddingBottom","connected","totalConnections","xmlns","ChatGPTConnector","onClose","onConnectionChange","WelcomeScreen","onContinue","script","createElement","head","appendChild","existingScript","removeChild","Component","constructor","props","super","this","state","handleClose","bind","handleOpen","chatGPTConnect","setConnected","setDisconnected","setState","llmManager","llmConnectorManager","connectToLLM","alert","render","bookmarkletCode","fillRule","clipRule","href","draggable","onDragStart","dataTransfer","setData","effectAllowed","PageLayout","subtitle","showHeader","showCloseButton","showBackButton","contentClassName","centerContent","_objectWithoutProperties","_excluded","layoutStyle","flexDirection","headerStyle","padding","contentStyle","justifyContent","titleStyle","margin","textAlign","subtitleStyle","_extends","ModalPageLayout","visible","onBackdropClick","backdropStyle","modalStyle","pageLayoutProps","_excluded2","backdropStyles","right","bottom","willChange","modalStyles","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","boxShadow","IconCircle","size","borderRadius","iconCircleGradientStart","iconCircleGradientEnd","btnLabel","iconRight","centered","pressed","setPressed","buttonStyle","btnBorder","btnGradStart","btnGradEnd","minWidth","cursor","pressedOverlayStyle","labelStyle","onMouseDown","handleMouseDown","onMouseUp","handleMouseUp","onMouseLeave","handleMouseLeave","OnairosButton","requestData","webpageName","inferenceData","autoFetch","proofMode","textLayout","textColor","login","buttonType","loginReturn","loginType","visualType","appIcon","enableTraining","formatResponse","responseFormat","includeDictionary","includeArray","priorityPlatform","rawMemoriesOnly","rawMemoriesConfig","showOverlay","setShowOverlay","currentFlow","setCurrentFlow","setUserData","checkExistingSession","savedUser","user","onboardingComplete","handleCloseOverlay","handleWelcomeContinue","handleEmailAuthSuccess","authData","userState","hasAccountInfo","candidate","accessToken","base64","payload","decodeURIComponent","atob","c","charCodeAt","userId","sub","finalDecision","reasoning","existingUserFalse","flowTypeOnboarding","noAccountInfo","newUserData","handleOnboardingComplete","onboardingData","updatedUserData","handlePinSetupComplete","pinData","handleTrainingComplete","trainingResult","trainingCompleted","handleDataRequestComplete","_requestResult$approv","_finalResult","requestResult","lastDataRequest","finalResult","urlResponse","Info","appId","account","confirmations","EncryptedUserPin","storage","urlData","apiUrl","dataResponse","includeLlmData","apiResponse","fetchError","formattedResult","_formattedResult$apiR","formatOnairosResponse","personalityDict","completeResult","enhancedResult","logFormattedUserData","formatError","allKeys","buttonClass","logoStyle","marginRight","getText","DataRequest","handleLoadingComplete","getFlowTitle","getFlowSubtitle","getFlowIcon","renderCurrentFlow","hasUserData","userDataKeys","warning","hover","PERSONALITY_TYPES","TRAIT_CATEGORIES","_apiResponse$Inferenc","arguments","formatted","InferenceResult","traits","scores","_apiResponse$Inferenc2","forEach","_formatted$InferenceR","traitResult","traitDict","category","formatPersonalityScores","getPersonalityTypes","getTraitCategories","formatUserDataForDisplay","result","_result$userData","_result$userData2","_result$userData3","_result$userData4","_result$userData5","_result$userData6","_result$userData7","userDataSummary","requestInfo","userHash","dataTypesRequested","approvedData","userProfile","userType","modelReady","formatConnectedAccounts","aiData","formatAIResponseData","status","hasApiResponse","hasErrors","apiError","prettyPrint","lines","push","toLocaleString","summary","hasData","dataTypes","toUpperCase","createPrettyPrintVersion","accounts","count","connectedAt","a","_apiResponse$data","_apiResponse$Inferenc3","available","_apiResponse$data2","_apiResponse$data3","_apiResponse$data4","_apiResponse$data5","_apiResponse$Inferenc4","dashboard","slides","apps","personalityData","preferencesData","output"],"ignoreList":[],"sourceRoot":""}