Spaces:
Sleeping
Sleeping
Upload 26 files
Browse files- views/Advisor.tsx +81 -31
- views/Landing.tsx +320 -130
- views/Simulation.tsx +3 -2
- views/routes.ts +25 -30
views/Advisor.tsx
CHANGED
|
@@ -17,53 +17,78 @@ const Advisor: React.FC = () => {
|
|
| 17 |
const [messages, setMessages] = useState<Message[]>([]);
|
| 18 |
const [input, setInput] = useState('');
|
| 19 |
const [loading, setLoading] = useState(false);
|
| 20 |
-
const [voiceEnabled, setVoiceEnabled] = useState(
|
| 21 |
const scrollRef = useRef<HTMLDivElement>(null);
|
| 22 |
|
| 23 |
useEffect(() => {
|
| 24 |
const initMemory = async () => {
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
}
|
| 31 |
};
|
| 32 |
initMemory();
|
| 33 |
}, []);
|
| 34 |
|
| 35 |
useEffect(() => {
|
| 36 |
-
if (scrollRef.current)
|
|
|
|
|
|
|
| 37 |
}, [messages]);
|
| 38 |
|
| 39 |
const handleSend = async (forcedInput?: string) => {
|
| 40 |
const query = (forcedInput || input).trim();
|
| 41 |
if (!query || loading) return;
|
| 42 |
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
setInput('');
|
| 45 |
setLoading(true);
|
| 46 |
|
| 47 |
const assistantMsgId = (Date.now() + 1).toString();
|
| 48 |
-
setMessages(prev => [...prev, {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
|
| 50 |
try {
|
| 51 |
-
const context = { system: "LUMINA_ADVISORY_NODE" };
|
| 52 |
-
const
|
| 53 |
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
|
| 60 |
-
setMessages(prev => prev.map(m => m.id === assistantMsgId ? { ...m, isStreaming: false } : m));
|
| 61 |
await apiClient.chat.saveMessage('user', query);
|
| 62 |
-
await apiClient.chat.saveMessage('assistant',
|
| 63 |
|
| 64 |
-
if (voiceEnabled) speakText(
|
| 65 |
} catch (error) {
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
} finally {
|
| 68 |
setLoading(false);
|
| 69 |
}
|
|
@@ -79,13 +104,18 @@ const Advisor: React.FC = () => {
|
|
| 79 |
</div>
|
| 80 |
<div>
|
| 81 |
<h3 className="text-white font-black italic tracking-tighter uppercase text-xl">Nexus_Core</h3>
|
| 82 |
-
<p className="text-[10px] text-zinc-500 font-black uppercase tracking-widest">Protocol:
|
| 83 |
</div>
|
| 84 |
</div>
|
| 85 |
<div className="space-y-4 flex-1 overflow-y-auto pr-3 custom-scrollbar relative z-10">
|
| 86 |
<p className="text-[10px] font-black text-zinc-600 uppercase tracking-widest px-2 mb-4">Command Presets</p>
|
| 87 |
-
{["Analyze
|
| 88 |
-
<button
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
<span className="text-[10px] font-black uppercase tracking-widest text-zinc-500 group-hover:text-blue-400 leading-relaxed">{text}</span>
|
| 90 |
<ChevronRight size={16} className="text-zinc-800 group-hover:text-blue-500 transition-colors" />
|
| 91 |
</button>
|
|
@@ -97,10 +127,13 @@ const Advisor: React.FC = () => {
|
|
| 97 |
<div className="flex-1 flex flex-col bg-zinc-950 border border-zinc-900 rounded-[3rem] overflow-hidden shadow-2xl relative">
|
| 98 |
<div className="h-20 border-b border-zinc-900 px-10 flex items-center justify-between bg-black/40 backdrop-blur-xl z-20">
|
| 99 |
<div className="flex items-center space-x-6">
|
| 100 |
-
<div className={`w-3 h-3 rounded-full shadow-[0_0_15px_#10b981] ${loading ? 'bg-amber-500' : 'bg-emerald-500'}`}></div>
|
| 101 |
<span className="font-black text-white text-sm uppercase tracking-[0.4em] italic">Quantum_Advisory_Node</span>
|
| 102 |
</div>
|
| 103 |
-
<button
|
|
|
|
|
|
|
|
|
|
| 104 |
{voiceEnabled ? <Volume2 size={20} /> : <VolumeX size={20} />}
|
| 105 |
</button>
|
| 106 |
</div>
|
|
@@ -114,7 +147,12 @@ const Advisor: React.FC = () => {
|
|
| 114 |
</div>
|
| 115 |
<div className={`p-8 rounded-[2.5rem] ${m.role === 'user' ? 'bg-zinc-900 text-zinc-100 rounded-tr-none border border-zinc-800' : 'bg-black border border-zinc-800 text-zinc-300 rounded-tl-none shadow-2xl'}`}>
|
| 116 |
<div className="text-base font-medium leading-relaxed tracking-tight whitespace-pre-wrap">
|
| 117 |
-
{m.content || (m.isStreaming ?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
</div>
|
| 119 |
</div>
|
| 120 |
</div>
|
|
@@ -123,12 +161,24 @@ const Advisor: React.FC = () => {
|
|
| 123 |
</div>
|
| 124 |
|
| 125 |
<div className="p-10 bg-black/20 border-t border-zinc-900 backdrop-blur-2xl z-20">
|
| 126 |
-
<
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
</button>
|
| 131 |
-
</
|
| 132 |
</div>
|
| 133 |
</div>
|
| 134 |
</div>
|
|
|
|
| 17 |
const [messages, setMessages] = useState<Message[]>([]);
|
| 18 |
const [input, setInput] = useState('');
|
| 19 |
const [loading, setLoading] = useState(false);
|
| 20 |
+
const [voiceEnabled, setVoiceEnabled] = useState(true);
|
| 21 |
const scrollRef = useRef<HTMLDivElement>(null);
|
| 22 |
|
| 23 |
useEffect(() => {
|
| 24 |
const initMemory = async () => {
|
| 25 |
+
try {
|
| 26 |
+
const history = await apiClient.chat.getHistory();
|
| 27 |
+
if (history && history.length > 0) {
|
| 28 |
+
setMessages(history.map((h: any) => ({ ...h, id: h.id.toString() })));
|
| 29 |
+
} else {
|
| 30 |
+
setMessages([{ id: '1', role: 'assistant', content: "Neural Core online. Standing by for institutional instructions.", timestamp: new Date().toISOString() }]);
|
| 31 |
+
}
|
| 32 |
+
} catch (err) {
|
| 33 |
+
setMessages([{ id: '1', role: 'assistant', content: "Neural Core online. Safe mode registry active.", timestamp: new Date().toISOString() }]);
|
| 34 |
}
|
| 35 |
};
|
| 36 |
initMemory();
|
| 37 |
}, []);
|
| 38 |
|
| 39 |
useEffect(() => {
|
| 40 |
+
if (scrollRef.current) {
|
| 41 |
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
| 42 |
+
}
|
| 43 |
}, [messages]);
|
| 44 |
|
| 45 |
const handleSend = async (forcedInput?: string) => {
|
| 46 |
const query = (forcedInput || input).trim();
|
| 47 |
if (!query || loading) return;
|
| 48 |
|
| 49 |
+
const userMsgId = Date.now().toString();
|
| 50 |
+
setMessages(prev => [...prev, {
|
| 51 |
+
id: userMsgId,
|
| 52 |
+
role: 'user',
|
| 53 |
+
content: query,
|
| 54 |
+
timestamp: new Date().toISOString()
|
| 55 |
+
}]);
|
| 56 |
+
|
| 57 |
setInput('');
|
| 58 |
setLoading(true);
|
| 59 |
|
| 60 |
const assistantMsgId = (Date.now() + 1).toString();
|
| 61 |
+
setMessages(prev => [...prev, {
|
| 62 |
+
id: assistantMsgId,
|
| 63 |
+
role: 'assistant',
|
| 64 |
+
content: '',
|
| 65 |
+
timestamp: new Date().toISOString(),
|
| 66 |
+
isStreaming: true
|
| 67 |
+
}]);
|
| 68 |
|
| 69 |
try {
|
| 70 |
+
const context = { system: "LUMINA_ADVISORY_NODE", mode: "Institutional_Treasury" };
|
| 71 |
+
const response = await getFinancialAdviceStream(query, context);
|
| 72 |
|
| 73 |
+
const finalContent = response?.[0]?.text || "Signal interrupted. No data received from Gemini Node.";
|
| 74 |
+
|
| 75 |
+
setMessages(prev => prev.map(m =>
|
| 76 |
+
m.id === assistantMsgId ? { ...m, content: finalContent, isStreaming: false } : m
|
| 77 |
+
));
|
| 78 |
|
|
|
|
| 79 |
await apiClient.chat.saveMessage('user', query);
|
| 80 |
+
await apiClient.chat.saveMessage('assistant', finalContent);
|
| 81 |
|
| 82 |
+
if (voiceEnabled) speakText(finalContent);
|
| 83 |
} catch (error) {
|
| 84 |
+
console.error("Advisor Link Failure:", error);
|
| 85 |
+
setMessages(prev => prev.map(m =>
|
| 86 |
+
m.id === assistantMsgId ? {
|
| 87 |
+
...m,
|
| 88 |
+
content: "Neural link lost. Ensure process.env.API_KEY is properly configured and model quota is available.",
|
| 89 |
+
isStreaming: false
|
| 90 |
+
} : m
|
| 91 |
+
));
|
| 92 |
} finally {
|
| 93 |
setLoading(false);
|
| 94 |
}
|
|
|
|
| 104 |
</div>
|
| 105 |
<div>
|
| 106 |
<h3 className="text-white font-black italic tracking-tighter uppercase text-xl">Nexus_Core</h3>
|
| 107 |
+
<p className="text-[10px] text-zinc-500 font-black uppercase tracking-widest">Protocol: Advisory</p>
|
| 108 |
</div>
|
| 109 |
</div>
|
| 110 |
<div className="space-y-4 flex-1 overflow-y-auto pr-3 custom-scrollbar relative z-10">
|
| 111 |
<p className="text-[10px] font-black text-zinc-600 uppercase tracking-widest px-2 mb-4">Command Presets</p>
|
| 112 |
+
{["Analyze Liquidity Drift", "Stress-test Commercial Portfolio", "Model Inflation Spike impact"].map((text, i) => (
|
| 113 |
+
<button
|
| 114 |
+
key={i}
|
| 115 |
+
onClick={() => handleSend(text)}
|
| 116 |
+
disabled={loading}
|
| 117 |
+
className="w-full text-left p-6 rounded-2xl bg-black border border-zinc-900 hover:border-blue-500/50 hover:bg-blue-500/5 transition-all group flex items-start justify-between disabled:opacity-30"
|
| 118 |
+
>
|
| 119 |
<span className="text-[10px] font-black uppercase tracking-widest text-zinc-500 group-hover:text-blue-400 leading-relaxed">{text}</span>
|
| 120 |
<ChevronRight size={16} className="text-zinc-800 group-hover:text-blue-500 transition-colors" />
|
| 121 |
</button>
|
|
|
|
| 127 |
<div className="flex-1 flex flex-col bg-zinc-950 border border-zinc-900 rounded-[3rem] overflow-hidden shadow-2xl relative">
|
| 128 |
<div className="h-20 border-b border-zinc-900 px-10 flex items-center justify-between bg-black/40 backdrop-blur-xl z-20">
|
| 129 |
<div className="flex items-center space-x-6">
|
| 130 |
+
<div className={`w-3 h-3 rounded-full shadow-[0_0_15px_#10b981] ${loading ? 'bg-amber-500 animate-pulse' : 'bg-emerald-500'}`}></div>
|
| 131 |
<span className="font-black text-white text-sm uppercase tracking-[0.4em] italic">Quantum_Advisory_Node</span>
|
| 132 |
</div>
|
| 133 |
+
<button
|
| 134 |
+
onClick={() => setVoiceEnabled(!voiceEnabled)}
|
| 135 |
+
className={`p-4 rounded-2xl border transition-all ${voiceEnabled ? 'bg-blue-600/10 border-blue-500/20 text-blue-500' : 'bg-zinc-900 border-zinc-800 text-zinc-600'}`}
|
| 136 |
+
>
|
| 137 |
{voiceEnabled ? <Volume2 size={20} /> : <VolumeX size={20} />}
|
| 138 |
</button>
|
| 139 |
</div>
|
|
|
|
| 147 |
</div>
|
| 148 |
<div className={`p-8 rounded-[2.5rem] ${m.role === 'user' ? 'bg-zinc-900 text-zinc-100 rounded-tr-none border border-zinc-800' : 'bg-black border border-zinc-800 text-zinc-300 rounded-tl-none shadow-2xl'}`}>
|
| 149 |
<div className="text-base font-medium leading-relaxed tracking-tight whitespace-pre-wrap">
|
| 150 |
+
{m.content || (m.isStreaming ? (
|
| 151 |
+
<div className="flex items-center gap-3">
|
| 152 |
+
<Loader2 className="animate-spin text-blue-500" size={18} />
|
| 153 |
+
<span className="text-[10px] font-black uppercase tracking-[0.3em] animate-pulse">Computing Alpha...</span>
|
| 154 |
+
</div>
|
| 155 |
+
) : "Handshaking...")}
|
| 156 |
</div>
|
| 157 |
</div>
|
| 158 |
</div>
|
|
|
|
| 161 |
</div>
|
| 162 |
|
| 163 |
<div className="p-10 bg-black/20 border-t border-zinc-900 backdrop-blur-2xl z-20">
|
| 164 |
+
<form
|
| 165 |
+
onSubmit={(e) => { e.preventDefault(); handleSend(); }}
|
| 166 |
+
className="relative group max-w-5xl mx-auto flex gap-4"
|
| 167 |
+
>
|
| 168 |
+
<input
|
| 169 |
+
value={input}
|
| 170 |
+
onChange={(e) => setInput(e.target.value)}
|
| 171 |
+
placeholder="Input treasury instructions for the Quantum Core..."
|
| 172 |
+
className="flex-1 bg-black border border-zinc-800 focus:border-blue-500 rounded-[2rem] py-7 px-10 text-white text-base outline-none transition-all placeholder:text-zinc-800 font-bold"
|
| 173 |
+
/>
|
| 174 |
+
<button
|
| 175 |
+
type="submit"
|
| 176 |
+
disabled={loading || !input.trim()}
|
| 177 |
+
className="px-8 bg-blue-600 hover:bg-blue-500 text-white rounded-[1.5rem] font-black uppercase flex items-center gap-3 disabled:opacity-50 shadow-xl transition-all"
|
| 178 |
+
>
|
| 179 |
+
{loading ? <Loader2 className="animate-spin" size={20} /> : <Send size={20} />}
|
| 180 |
</button>
|
| 181 |
+
</form>
|
| 182 |
</div>
|
| 183 |
</div>
|
| 184 |
</div>
|
views/Landing.tsx
CHANGED
|
@@ -1,32 +1,37 @@
|
|
| 1 |
-
|
| 2 |
-
import React, { useState } from 'react';
|
| 3 |
import { useNavigate } from 'react-router-dom';
|
| 4 |
import {
|
| 5 |
Cpu, Sparkles, ArrowRight, Loader2, X, Terminal, Mic, Zap, MessageSquare, ChevronDown,
|
| 6 |
-
ShieldCheck, Globe, Activity
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
} from 'lucide-react';
|
| 8 |
-
import { speakText, processVoiceCommand } from '../services/geminiService';
|
| 9 |
import { apiClient } from '../services/api';
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
import LiquidityMesh from './landing/LiquidityMesh';
|
| 20 |
-
import EncryptionProtocol from './landing/EncryptionProtocol';
|
| 21 |
-
import OracleAuthority from './landing/OracleAuthority';
|
| 22 |
|
| 23 |
const Landing: React.FC = () => {
|
| 24 |
const navigate = useNavigate();
|
| 25 |
-
const [isVoiceOpen, setIsVoiceOpen] = useState(false);
|
| 26 |
-
const [voiceInput, setVoiceInput] = useState('');
|
| 27 |
-
const [isProcessing, setIsProcessing] = useState(false);
|
| 28 |
const [isDemoLoading, setIsDemoLoading] = useState(false);
|
| 29 |
-
const [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
|
| 31 |
const handleDemoAccess = async () => {
|
| 32 |
if (isDemoLoading) return;
|
|
@@ -35,147 +40,332 @@ const Landing: React.FC = () => {
|
|
| 35 |
const { success } = await apiClient.auth.login('alex', 'password123');
|
| 36 |
if (success) {
|
| 37 |
window.dispatchEvent(new Event('auth-update'));
|
| 38 |
-
navigate('/');
|
| 39 |
}
|
| 40 |
} catch (err) {
|
| 41 |
-
console.error("
|
| 42 |
} finally {
|
| 43 |
setIsDemoLoading(false);
|
| 44 |
}
|
| 45 |
};
|
| 46 |
|
| 47 |
-
const
|
| 48 |
-
|
| 49 |
-
setIsProcessing(true);
|
| 50 |
-
setVoiceStatus('Synchronizing Subspace Signals...');
|
| 51 |
-
|
| 52 |
-
const result = await processVoiceCommand(voiceInput);
|
| 53 |
-
|
| 54 |
-
if (result.action === 'SEND_MONEY') {
|
| 55 |
-
const localPayments = JSON.parse(localStorage.getItem('lumina_payments') || '[]');
|
| 56 |
-
const newPayment = {
|
| 57 |
-
transactionId: `TX-${Math.floor(1000 + Math.random() * 9000)}`,
|
| 58 |
-
baseCurrencyTransactionAmount: -result.amount,
|
| 59 |
-
transactionDescription: `VOICE_AUTHORIZED: ${result.recipient.toUpperCase()}`,
|
| 60 |
-
transactionType: 'Outgoing',
|
| 61 |
-
transactionStatus: 'Completed',
|
| 62 |
-
transactionDateTime: new Date().toISOString(),
|
| 63 |
-
transactionReferenceNumber: `REF-${Math.floor(1000 + Math.random() * 9000)}`,
|
| 64 |
-
category: result.category,
|
| 65 |
-
recipient: result.recipient,
|
| 66 |
-
amount: result.amount
|
| 67 |
-
};
|
| 68 |
-
localStorage.setItem('lumina_payments', JSON.stringify([newPayment, ...localPayments]));
|
| 69 |
-
setVoiceStatus(result.narration);
|
| 70 |
-
await speakText(result.narration);
|
| 71 |
-
setTimeout(() => {
|
| 72 |
-
setIsVoiceOpen(false);
|
| 73 |
-
setVoiceInput('');
|
| 74 |
-
setVoiceStatus('Standby for Neural Input...');
|
| 75 |
-
navigate('/payments');
|
| 76 |
-
}, 3000);
|
| 77 |
-
} else {
|
| 78 |
-
setVoiceStatus(result.narration);
|
| 79 |
-
await speakText(result.narration);
|
| 80 |
-
}
|
| 81 |
-
setIsProcessing(false);
|
| 82 |
-
};
|
| 83 |
|
| 84 |
return (
|
| 85 |
-
<div className="min-h-screen bg-[#020202] text-white font-sans overflow-x-hidden relative selection:bg-blue-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
<div className="absolute inset-0 bg-[
|
|
|
|
| 89 |
</div>
|
| 90 |
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
</div>
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
</div>
|
| 100 |
</div>
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
|
|
|
|
|
|
| 105 |
</button>
|
| 106 |
-
<button onClick={() => navigate('/login')} className="px-8 py-3 bg-white text-black rounded-full font-black text-[9px] uppercase tracking-widest hover:bg-zinc-200 transition-all shadow-xl">Terminal</button>
|
| 107 |
</div>
|
| 108 |
</nav>
|
| 109 |
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
</div>
|
| 115 |
-
|
| 116 |
-
<
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
<
|
| 121 |
-
</
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
</div>
|
| 127 |
-
<div className="mt-
|
| 128 |
</section>
|
| 129 |
|
| 130 |
-
|
| 131 |
-
<
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
</div>
|
| 146 |
-
<p className="text-[9px] font-black uppercase tracking-[1em] text-zinc-800">Lumina Quantum Systems • Citibank Demo Business Inc • 527 Org Protocol • 2025</p>
|
| 147 |
</div>
|
| 148 |
-
</
|
| 149 |
|
| 150 |
-
{
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
</div>
|
| 173 |
</div>
|
| 174 |
</div>
|
| 175 |
</div>
|
| 176 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 177 |
</div>
|
| 178 |
);
|
| 179 |
};
|
| 180 |
|
| 181 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import React, { useState, useEffect, useMemo } from 'react';
|
|
|
|
| 2 |
import { useNavigate } from 'react-router-dom';
|
| 3 |
import {
|
| 4 |
Cpu, Sparkles, ArrowRight, Loader2, X, Terminal, Mic, Zap, MessageSquare, ChevronDown,
|
| 5 |
+
ShieldCheck, Globe, Activity, Layers, Database, Lock, Eye, Building2, BarChart3, Radio, RefreshCw,
|
| 6 |
+
BrainCircuit, Network, Server, Fingerprint, Key, Wallet, Briefcase, FileText, Smartphone,
|
| 7 |
+
Shield, Infinity, Waves, Thermometer, FlaskConical, Gavel, Scale, Hammer, UserPlus, Heart,
|
| 8 |
+
// Added missing imports Code and ChevronRight
|
| 9 |
+
ShieldAlert, Repeat, ChevronLeft, GitPullRequest, Box, Code, ChevronRight
|
| 10 |
} from 'lucide-react';
|
|
|
|
| 11 |
import { apiClient } from '../services/api';
|
| 12 |
|
| 13 |
+
const FEATURE_CARDS = [
|
| 14 |
+
{ id: 1, title: "Neural Parity", desc: "Real-time ledger consensus across 1,200 nodes with zero-drift synchronization.", icon: Fingerprint, color: "blue", img: "https://images.unsplash.com/photo-1639762681485-074b7f938ba0?q=80&w=2832&auto=format&fit=crop" },
|
| 15 |
+
{ id: 2, title: "Quantum Oracle", desc: "Predictive treasury drift detection using qubit-stabilized neural forecasting models.", icon: Cpu, color: "purple", img: "https://images.unsplash.com/photo-1451187580459-43490279c0fa?q=80&w=2872&auto=format&fit=crop" },
|
| 16 |
+
{ id: 3, title: "Liquidity Mesh", desc: "High-velocity disbursement fabrics optimized for sub-millisecond M2M settlement.", icon: Waves, color: "emerald", img: "https://images.unsplash.com/photo-1614850523296-d8c1af93d400?q=80&w=2570&auto=format&fit=crop" },
|
| 17 |
+
{ id: 4, title: "Sovereign ID", desc: "Encapsulated identity vault utilizing RSA-OAEP-4096 and rotating high-entropy seeds.", icon: Lock, color: "rose", img: "https://images.unsplash.com/photo-1558494949-ef010cbdcc51?q=80&w=2546&auto=format&fit=crop" },
|
| 18 |
+
{ id: 5, title: "Forge Foundry", desc: "Synthesis of high-fidelity digital relics from transaction heat-maps and block-states.", icon: Hammer, color: "amber", img: "https://images.unsplash.com/photo-1639322537228-f710d846310a?q=80&w=2560&auto=format&fit=crop" },
|
| 19 |
+
{ id: 2, title: "Edge Routing", desc: "Global distribution node Map with proximity-optimized gateway handshakes.", icon: Globe, color: "cyan", img: "https://images.unsplash.com/photo-1484417894907-623942c8ee29?q=80&w=2832&auto=format&fit=crop" }
|
| 20 |
+
];
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
const Landing: React.FC = () => {
|
| 23 |
const navigate = useNavigate();
|
|
|
|
|
|
|
|
|
|
| 24 |
const [isDemoLoading, setIsDemoLoading] = useState(false);
|
| 25 |
+
const [scrollY, setScrollY] = useState(0);
|
| 26 |
+
|
| 27 |
+
// Feature Shuffle State
|
| 28 |
+
const [activeFeatureIndex, setActiveFeatureIndex] = useState(0);
|
| 29 |
+
|
| 30 |
+
useEffect(() => {
|
| 31 |
+
const handleScroll = () => setScrollY(window.scrollY);
|
| 32 |
+
window.addEventListener('scroll', handleScroll);
|
| 33 |
+
return () => window.removeEventListener('scroll', handleScroll);
|
| 34 |
+
}, []);
|
| 35 |
|
| 36 |
const handleDemoAccess = async () => {
|
| 37 |
if (isDemoLoading) return;
|
|
|
|
| 40 |
const { success } = await apiClient.auth.login('alex', 'password123');
|
| 41 |
if (success) {
|
| 42 |
window.dispatchEvent(new Event('auth-update'));
|
| 43 |
+
navigate('/overview');
|
| 44 |
}
|
| 45 |
} catch (err) {
|
| 46 |
+
console.error("Handshake failed.");
|
| 47 |
} finally {
|
| 48 |
setIsDemoLoading(false);
|
| 49 |
}
|
| 50 |
};
|
| 51 |
|
| 52 |
+
const nextFeature = () => setActiveFeatureIndex(p => (p + 1) % FEATURE_CARDS.length);
|
| 53 |
+
const prevFeature = () => setActiveFeatureIndex(p => (p - 1 + FEATURE_CARDS.length) % FEATURE_CARDS.length);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
return (
|
| 56 |
+
<div className="min-h-screen bg-[#020202] text-white font-sans overflow-x-hidden relative selection:bg-blue-600/30 selection:text-white">
|
| 57 |
+
{/* Dynamic Backgrounds */}
|
| 58 |
+
<div className="fixed inset-0 z-0 pointer-events-none">
|
| 59 |
+
<div className="absolute inset-0 bg-[radial-gradient(circle_at_50%_0%,_#1e1b4b_0%,_transparent_60%)] opacity-40"></div>
|
| 60 |
+
<div className="absolute inset-0 bg-[linear-gradient(to_right,#80808008_1px,transparent_1px),linear-gradient(to_bottom,#80808008_1px,transparent_1px)] bg-[size:60px_60px]"></div>
|
| 61 |
</div>
|
| 62 |
|
| 63 |
+
{/* FORTUNE 1200 MEGA HEADER */}
|
| 64 |
+
<nav className={`fixed top-0 left-0 w-full z-[100] px-10 py-8 flex justify-between items-center transition-all duration-700 ${scrollY > 50 ? 'backdrop-blur-3xl bg-black/80 border-b border-white/5 py-6' : 'bg-transparent'}`}>
|
| 65 |
+
<div className="flex items-center gap-12">
|
| 66 |
+
<div className="flex items-center gap-6 group cursor-pointer" onClick={() => window.scrollTo({top: 0, behavior: 'smooth'})}>
|
| 67 |
+
<div className="w-14 h-14 bg-white rounded-[1.8rem] flex items-center justify-center group-hover:rotate-12 transition-transform duration-700 shadow-2xl border-2 border-zinc-900">
|
| 68 |
+
<Cpu size={32} className="text-black" />
|
| 69 |
+
</div>
|
| 70 |
+
<div>
|
| 71 |
+
<h1 className="text-2xl font-black italic tracking-tighter text-white uppercase leading-none">AIBanking<span className="text-blue-500 not-italic">.dev</span></h1>
|
| 72 |
+
<p className="text-[10px] uppercase tracking-[0.8em] font-black text-zinc-600 mt-1.5">Consensus Registry</p>
|
| 73 |
+
</div>
|
| 74 |
</div>
|
| 75 |
+
|
| 76 |
+
<div className="hidden xl:flex items-center gap-10">
|
| 77 |
+
<div className="group relative py-4">
|
| 78 |
+
<button className="text-[11px] font-black uppercase tracking-[0.4em] text-zinc-400 group-hover:text-white transition-colors flex items-center gap-2">Protocol Tiers <ChevronDown size={10} /></button>
|
| 79 |
+
<div className="absolute top-full left-0 w-[700px] bg-zinc-950 border border-zinc-900 rounded-[3.5rem] p-12 opacity-0 pointer-events-none group-hover:opacity-100 group-hover:translate-y-2 transition-all shadow-[0_40px_80px_rgba(0,0,0,0.8)] grid grid-cols-2 gap-10">
|
| 80 |
+
<MegaLink icon={Zap} title="Enterprise Core" desc="Authenticated via paid Google API nodes. 100% SLA." />
|
| 81 |
+
<MegaLink icon={Globe} title="Regular Mesh" desc="Public access tier for regional node exploration." />
|
| 82 |
+
<MegaLink icon={Code} title="SDK Import" desc="NPM-ready modules for M2M treasury automation." />
|
| 83 |
+
<MegaLink icon={ShieldCheck} title="Compliance Hub" desc="FDX v6.5 verified long-term archival registry." />
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
<div className="group relative py-4">
|
| 87 |
+
<button className="text-[11px] font-black uppercase tracking-[0.4em] text-zinc-400 group-hover:text-white transition-colors flex items-center gap-2">Resources <ChevronDown size={10} /></button>
|
| 88 |
+
<div className="absolute top-full left-0 w-[500px] bg-zinc-950 border border-zinc-900 rounded-[3rem] p-10 opacity-0 pointer-events-none group-hover:opacity-100 group-hover:translate-y-2 transition-all shadow-2xl space-y-6">
|
| 89 |
+
<MegaLink icon={FileText} title="Whitepaper Genesis" desc="The mathematical proof of neural banking." />
|
| 90 |
+
<MegaLink icon={Fingerprint} title="Security Manifesto" desc="Zero-persistence shredding protocol v1.2." />
|
| 91 |
+
</div>
|
| 92 |
+
</div>
|
| 93 |
+
<a href="#developers" className="text-[11px] font-black uppercase tracking-[0.4em] text-zinc-400 hover:text-white transition-colors">Developer Core</a>
|
| 94 |
</div>
|
| 95 |
</div>
|
| 96 |
+
|
| 97 |
+
<div className="flex items-center gap-10">
|
| 98 |
+
<button onClick={() => navigate('/documentation')} className="hidden md:block text-[11px] font-black uppercase tracking-[0.4em] text-zinc-500 hover:text-white transition-colors">Manual Registry</button>
|
| 99 |
+
<button onClick={handleDemoAccess} className="px-12 py-5 bg-blue-600 text-white rounded-full font-black text-[11px] uppercase tracking-[0.5em] hover:bg-blue-500 transition-all flex items-center gap-4 shadow-[0_0_40px_rgba(37,99,235,0.4)] group">
|
| 100 |
+
{isDemoLoading ? <Loader2 size={16} className="animate-spin" /> : <Sparkles size={16} className="group-hover:scale-125 transition-transform" />}
|
| 101 |
+
Initialize Handshake
|
| 102 |
</button>
|
|
|
|
| 103 |
</div>
|
| 104 |
</nav>
|
| 105 |
|
| 106 |
+
{/* HERO HERO SECTION */}
|
| 107 |
+
<section className="relative z-10 min-h-screen flex flex-col justify-center items-center px-10 pt-40 pb-20 text-center overflow-hidden">
|
| 108 |
+
<div className="absolute inset-0 z-0 opacity-30">
|
| 109 |
+
<img src="https://images.unsplash.com/photo-1639322537228-f710d846310a?q=80&w=2832&auto=format&fit=crop" className="w-full h-full object-cover blur-[140px] scale-110" alt="Liquid Space" />
|
| 110 |
</div>
|
| 111 |
+
|
| 112 |
+
<div className="relative z-10 space-y-16">
|
| 113 |
+
<div className="inline-flex items-center gap-4 px-10 py-4 bg-blue-600/10 border border-blue-600/20 rounded-full animate-in zoom-in-95 duration-1000 relative overflow-hidden group">
|
| 114 |
+
<div className="absolute inset-0 bg-gradient-to-r from-transparent via-white/5 to-transparent animate-[shimmer_2s_infinite]"></div>
|
| 115 |
+
<Activity size={18} className="text-blue-500" />
|
| 116 |
+
<span className="text-[12px] font-black uppercase tracking-[0.8em] text-blue-500">Subspace_Handshake_Stabilized</span>
|
| 117 |
+
</div>
|
| 118 |
+
|
| 119 |
+
<h1 className="text-[10rem] lg:text-[16rem] font-black italic tracking-tighter uppercase leading-[0.7] mb-12 drop-shadow-2xl">
|
| 120 |
+
Global <br /><span className="text-blue-600 not-italic decoration-blue-900/40 underline-offset-[40px] underline decoration-[30px]">Standard</span>
|
| 121 |
+
</h1>
|
| 122 |
+
|
| 123 |
+
<p className="text-zinc-500 text-3xl lg:text-4xl font-bold italic max-w-6xl mx-auto mb-16 leading-relaxed">
|
| 124 |
+
"The definitive interface for <span className="text-white">high-velocity institutional assets</span>. Route neural signals through the mesh with absolute parity."
|
| 125 |
+
</p>
|
| 126 |
+
|
| 127 |
+
<div className="flex flex-wrap justify-center gap-12 pt-10">
|
| 128 |
+
<button
|
| 129 |
+
onClick={handleDemoAccess}
|
| 130 |
+
className="px-20 py-10 bg-white text-black rounded-[3rem] font-black text-sm uppercase tracking-[0.8em] flex items-center gap-10 hover:bg-blue-600 hover:text-white transition-all shadow-[0_50px_100px_rgba(255,255,255,0.1)] group active:scale-95"
|
| 131 |
+
>
|
| 132 |
+
{isDemoLoading ? <Loader2 size={32} className="animate-spin" /> : <span>Start Session</span>}
|
| 133 |
+
<ArrowRight size={32} className="group-hover:translate-x-6 transition-transform duration-700" />
|
| 134 |
+
</button>
|
| 135 |
+
<button className="px-20 py-10 bg-zinc-950 border-2 border-zinc-900 text-white rounded-[3rem] font-black text-sm uppercase tracking-[0.8em] flex items-center gap-10 hover:border-blue-600 transition-all shadow-2xl group active:scale-95">
|
| 136 |
+
<Database size={32} className="text-blue-500" />
|
| 137 |
+
Whitepaper Genesis
|
| 138 |
+
</button>
|
| 139 |
+
</div>
|
| 140 |
</div>
|
| 141 |
+
<div className="mt-40 animate-bounce opacity-20"><ChevronDown size={64} /></div>
|
| 142 |
</section>
|
| 143 |
|
| 144 |
+
{/* ENDLESS TINDER SHUFFLE SECTION */}
|
| 145 |
+
<section className="relative z-10 py-60 px-10 bg-zinc-950/20">
|
| 146 |
+
<div className="max-w-[1400px] mx-auto grid grid-cols-1 lg:grid-cols-2 gap-32 items-center">
|
| 147 |
+
<div className="space-y-16">
|
| 148 |
+
<div className="space-y-6">
|
| 149 |
+
<h3 className="text-blue-500 font-black text-xs uppercase tracking-[0.8em]">Deep Feature Stack</h3>
|
| 150 |
+
<h2 className="text-8xl lg:text-[10rem] font-black italic text-white tracking-tighter uppercase leading-[0.85]">Endless <br /> <span className="text-blue-600 not-italic">Optimization</span></h2>
|
| 151 |
+
</div>
|
| 152 |
+
<p className="text-zinc-500 text-2xl font-bold leading-relaxed italic max-w-2xl">
|
| 153 |
+
"Our architectural layers are infinite. Swipe through the core protocols that define the future of sovereign digital wealth management."
|
| 154 |
+
</p>
|
| 155 |
+
<div className="flex gap-8">
|
| 156 |
+
<button onClick={prevFeature} className="p-8 bg-zinc-900 border border-zinc-800 rounded-3xl hover:bg-zinc-800 text-zinc-500 hover:text-white transition-all"><ChevronLeft size={32} /></button>
|
| 157 |
+
<button onClick={nextFeature} className="p-8 bg-zinc-900 border border-zinc-800 rounded-3xl hover:bg-zinc-800 text-zinc-500 hover:text-white transition-all"><ChevronRight size={32} /></button>
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
|
| 161 |
+
<div className="relative h-[800px] flex items-center justify-center">
|
| 162 |
+
{FEATURE_CARDS.map((card, i) => {
|
| 163 |
+
const isActive = activeFeatureIndex === i;
|
| 164 |
+
const isPrev = (activeFeatureIndex - 1 + FEATURE_CARDS.length) % FEATURE_CARDS.length === i;
|
| 165 |
+
const isNext = (activeFeatureIndex + 1) % FEATURE_CARDS.length === i;
|
| 166 |
+
|
| 167 |
+
let offset = 0;
|
| 168 |
+
let opacity = 0;
|
| 169 |
+
let scale = 0.8;
|
| 170 |
+
let rotate = 0;
|
| 171 |
+
let zIndex = 0;
|
| 172 |
+
|
| 173 |
+
if (isActive) { offset = 0; opacity = 1; scale = 1; rotate = 0; zIndex = 50; }
|
| 174 |
+
else if (isNext) { offset = 60; opacity = 0.4; scale = 0.9; rotate = 5; zIndex = 40; }
|
| 175 |
+
else if (isPrev) { offset = -60; opacity = 0; scale = 0.9; rotate = -5; zIndex = 30; }
|
| 176 |
+
else { opacity = 0; offset = 100; scale = 0.7; zIndex = 0; }
|
| 177 |
+
|
| 178 |
+
return (
|
| 179 |
+
<div
|
| 180 |
+
key={card.id}
|
| 181 |
+
className="absolute inset-0 transition-all duration-1000 ease-[cubic-bezier(0.23,1,0.32,1)]"
|
| 182 |
+
style={{
|
| 183 |
+
transform: `translateX(${offset}px) scale(${scale}) rotate(${rotate}deg)`,
|
| 184 |
+
opacity,
|
| 185 |
+
zIndex
|
| 186 |
+
}}
|
| 187 |
+
>
|
| 188 |
+
<div className="w-full h-full bg-zinc-950 border border-zinc-900 rounded-[5rem] overflow-hidden shadow-[0_100px_200px_rgba(0,0,0,0.8)] relative group">
|
| 189 |
+
<img src={card.img} className="absolute inset-0 w-full h-full object-cover opacity-40 group-hover:opacity-60 group-hover:scale-110 transition-all duration-[3s]" alt={card.title} />
|
| 190 |
+
<div className="absolute inset-0 bg-gradient-to-t from-black via-black/20 to-transparent"></div>
|
| 191 |
+
<div className="absolute bottom-16 left-16 right-16 space-y-8">
|
| 192 |
+
<div className={`w-20 h-20 bg-${card.color}-600/20 text-${card.color}-500 rounded-[2rem] flex items-center justify-center border border-${card.color}-500/30 shadow-2xl backdrop-blur-xl`}>
|
| 193 |
+
<card.icon size={40} />
|
| 194 |
+
</div>
|
| 195 |
+
<div className="space-y-4">
|
| 196 |
+
<h4 className="text-6xl font-black italic uppercase tracking-tighter text-white leading-none">{card.title}</h4>
|
| 197 |
+
<p className="text-zinc-400 text-xl font-bold leading-relaxed italic pr-10">"{card.desc}"</p>
|
| 198 |
+
</div>
|
| 199 |
+
<button className="flex items-center gap-4 text-[11px] font-black uppercase tracking-[0.5em] text-blue-500 hover:text-white transition-colors group/link">
|
| 200 |
+
Deploy Protocol <ArrowRight size={16} className="group-hover/link:translate-x-3 transition-transform" />
|
| 201 |
+
</button>
|
| 202 |
+
</div>
|
| 203 |
+
</div>
|
| 204 |
+
</div>
|
| 205 |
+
);
|
| 206 |
+
})}
|
| 207 |
</div>
|
|
|
|
| 208 |
</div>
|
| 209 |
+
</section>
|
| 210 |
|
| 211 |
+
{/* DEVELOPER CORE SECTION (REGULAR API) */}
|
| 212 |
+
<section id="developers" className="relative z-10 py-60 px-10 border-y border-white/5 bg-black">
|
| 213 |
+
<div className="max-w-7xl mx-auto grid grid-cols-1 lg:grid-cols-2 gap-40 items-center">
|
| 214 |
+
<div className="space-y-16">
|
| 215 |
+
<div className="space-y-6">
|
| 216 |
+
<h3 className="text-emerald-500 font-black text-xs uppercase tracking-[0.8em]">Open Source Registry</h3>
|
| 217 |
+
<h2 className="text-8xl lg:text-[10rem] font-black italic text-white tracking-tighter uppercase leading-[0.85]">The Free <br /> <span className="text-emerald-500 not-italic">Import</span></h2>
|
| 218 |
+
</div>
|
| 219 |
+
<p className="text-zinc-500 text-2xl font-bold leading-relaxed italic">
|
| 220 |
+
"Our Regular Tier API is accessible to any verified node globally. Initialize your treasury mesh with a single command line. Zero friction, total parity."
|
| 221 |
+
</p>
|
| 222 |
+
<div className="grid grid-cols-2 gap-10">
|
| 223 |
+
<div className="space-y-3">
|
| 224 |
+
<p className="text-[10px] font-black text-emerald-500 uppercase tracking-widest">Rate Limit</p>
|
| 225 |
+
<p className="text-xl font-black italic uppercase text-white">100 Req / Sec</p>
|
| 226 |
+
</div>
|
| 227 |
+
<div className="space-y-3">
|
| 228 |
+
<p className="text-[10px] font-black text-emerald-500 uppercase tracking-widest">Latency Hub</p>
|
| 229 |
+
<p className="text-xl font-black italic uppercase text-white">Global Nodes</p>
|
| 230 |
+
</div>
|
| 231 |
+
</div>
|
| 232 |
+
</div>
|
| 233 |
+
|
| 234 |
+
<div className="bg-zinc-950 border border-zinc-900 rounded-[4rem] p-12 shadow-2xl relative overflow-hidden group">
|
| 235 |
+
<div className="absolute top-0 right-0 p-10 opacity-5">
|
| 236 |
+
<Code size={120} className="text-emerald-500" />
|
| 237 |
+
</div>
|
| 238 |
+
<div className="flex items-center gap-6 mb-12">
|
| 239 |
+
<div className="w-4 h-4 bg-emerald-500 rounded-full animate-pulse shadow-[0_0_12px_#10b981]"></div>
|
| 240 |
+
<span className="text-[11px] font-black uppercase text-zinc-500 tracking-[0.5em]">Terminal Instance Active</span>
|
| 241 |
+
</div>
|
| 242 |
+
<div className="bg-black/80 rounded-[2.5rem] border border-zinc-900 p-10 font-mono text-sm space-y-6">
|
| 243 |
+
<p className="text-zinc-600 italic">// Initialize Lumina Regular Mesh</p>
|
| 244 |
+
<p className="text-emerald-500">npm install @aibanking/core</p>
|
| 245 |
+
<div className="text-zinc-400 space-y-2">
|
| 246 |
+
<p><span className="text-blue-500">import</span> { <span className="text-amber-500">LuminaNode</span> } <span className="text-blue-500">from</span> <span className="text-emerald-400">'@aibanking/core'</span>;</p>
|
| 247 |
+
<p><span className="text-zinc-500 italic">// Establish regular node handshake</span></p>
|
| 248 |
+
<p><span className="text-blue-500">const</span> node = <span className="text-blue-500">await</span> <span className="text-amber-500">LuminaNode</span>.<span className="text-white">initialize</span>({</p>
|
| 249 |
+
<p className="pl-6">tier: <span className="text-emerald-400">'regular'</span>,</p>
|
| 250 |
+
<p className="pl-6">region: <span className="text-emerald-400">'US-EAST'</span></p>
|
| 251 |
+
<p>});</p>
|
| 252 |
+
</div>
|
| 253 |
+
<button className="flex items-center gap-3 text-zinc-500 hover:text-white transition-colors group/copy">
|
| 254 |
+
<Smartphone size={16} />
|
| 255 |
+
<span className="text-[10px] font-black uppercase tracking-widest">Copy Connection String</span>
|
| 256 |
+
</button>
|
| 257 |
+
</div>
|
| 258 |
+
</div>
|
| 259 |
+
</div>
|
| 260 |
+
</section>
|
| 261 |
+
|
| 262 |
+
{/* MASSIVE CONTENT SLAM SECTIONS */}
|
| 263 |
+
<section className="relative z-10 py-60 px-10 border-t border-white/5">
|
| 264 |
+
<div className="max-w-7xl mx-auto space-y-40">
|
| 265 |
+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-40 items-center">
|
| 266 |
+
<div className="relative aspect-square rounded-[6rem] overflow-hidden shadow-2xl border border-zinc-900 group">
|
| 267 |
+
<img src="https://images.unsplash.com/photo-1639762681485-074b7f938ba0?q=80&w=2832&auto=format&fit=crop" className="w-full h-full object-cover opacity-50 group-hover:opacity-100 group-hover:scale-110 transition-all duration-[3s]" alt="Neural Fabric" />
|
| 268 |
+
</div>
|
| 269 |
+
<div className="space-y-10">
|
| 270 |
+
<h2 className="text-8xl font-black italic text-white uppercase tracking-tighter leading-[0.9]">The Neural <br /> <span className="text-blue-500">Subspace</span></h2>
|
| 271 |
+
<p className="text-zinc-500 text-2xl font-bold italic leading-relaxed">
|
| 272 |
+
"Interconnecting 80+ financial protocols through a singular, high-entropy neural gateway. We don't just route; we synthesize consensus."
|
| 273 |
+
</p>
|
| 274 |
+
<div className="grid grid-cols-2 gap-8">
|
| 275 |
+
<HeritageCard icon={GitPullRequest} title="Requests" val="1.4M / sec" />
|
| 276 |
+
<HeritageCard icon={Box} title="Parity Blocks" val="Synced" />
|
| 277 |
</div>
|
| 278 |
</div>
|
| 279 |
</div>
|
| 280 |
</div>
|
| 281 |
+
</section>
|
| 282 |
+
|
| 283 |
+
{/* JAM-PACKED FAT FOOTER */}
|
| 284 |
+
<footer className="relative z-10 bg-black pt-80 pb-40 px-10 border-t border-zinc-900">
|
| 285 |
+
<div className="max-w-[1600px] mx-auto">
|
| 286 |
+
<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-20 mb-60">
|
| 287 |
+
<div className="col-span-2 space-y-12">
|
| 288 |
+
<div className="flex items-center gap-6">
|
| 289 |
+
<div className="w-16 h-16 bg-white rounded-3xl flex items-center justify-center border-4 border-zinc-900 shadow-2xl">
|
| 290 |
+
<Cpu size={40} className="text-black" />
|
| 291 |
+
</div>
|
| 292 |
+
<h2 className="text-4xl font-black italic tracking-tighter uppercase leading-none">AIBanking<span className="text-blue-500 not-italic">.dev</span></h2>
|
| 293 |
+
</div>
|
| 294 |
+
<p className="text-zinc-500 text-xl font-bold italic leading-relaxed max-w-md">
|
| 295 |
+
"The undisputed leader in neural treasury automation and institutional mesh fabrics. Building the future of sovereign digital assets."
|
| 296 |
+
</p>
|
| 297 |
+
<div className="flex gap-8">
|
| 298 |
+
<SocialIcon icon={Globe} /><SocialIcon icon={Shield} /><SocialIcon icon={Zap} /><SocialIcon icon={MessageSquare} />
|
| 299 |
+
</div>
|
| 300 |
+
</div>
|
| 301 |
+
|
| 302 |
+
<FooterColumn title="Protocols" links={['FDX v6.5 Registry', 'RSA-OAEP-4096', 'Subspace Handshake', 'M2M Consensus', 'SHA-256 Shredding', 'Neural Entanglement', 'Zero-Knowledge Vaults', 'Layer 2 Settlement', 'Cross-Node Parity', 'Entropy Rotation']} />
|
| 303 |
+
<FooterColumn title="Intelligence" links={['Lumina Oracle', 'Predictive Alpha', 'Drift Detection', 'Machine Sentiment', 'HFT Neural Pathing', 'Simulation Core', 'Risk Analysis v4', 'Treasury Logic', 'Sentiment Polling', 'Market Biasing']} />
|
| 304 |
+
<FooterColumn title="Network" links={['Global Node Map', 'US-EAST Cluster', 'EU-WEST Parity', 'APAC Dispersal', 'Latency Hubs', 'Bare Metal Clusters', 'Sub-millisecond Routing', 'Edge Distribution', 'Sub-Space Tunneling', 'Node Health Polling']} />
|
| 305 |
+
<FooterColumn title="Institutional" links={['Vault Registry', 'Disbursements', 'Collections', 'Registry Settlement', 'Partner CRM', 'KYC Handshake', 'Compliance Node', 'Audit Trail Genesis', 'Asset Custody', 'Corporate Ledger']} />
|
| 306 |
+
</div>
|
| 307 |
+
|
| 308 |
+
<div className="pt-20 border-t border-zinc-900 flex flex-col md:flex-row justify-between items-center gap-12">
|
| 309 |
+
<div className="flex flex-wrap justify-center md:justify-start gap-12">
|
| 310 |
+
<FooterPolicyLink to="/manifesto" label="Honest Manifesto" />
|
| 311 |
+
<FooterPolicyLink to="/documentation" label="System Manual" />
|
| 312 |
+
<FooterPolicyLink to="/documentation" label="API Registry" />
|
| 313 |
+
<FooterPolicyLink to="/airdrop" label="Genesis Airdrop" />
|
| 314 |
+
<FooterPolicyLink to="/documentation" label="Cookie Protocol" />
|
| 315 |
+
<FooterPolicyLink to="/documentation" label="SLA Standard" />
|
| 316 |
+
</div>
|
| 317 |
+
<p className="text-[11px] font-black uppercase tracking-[1em] text-zinc-800">Verified 2025 • Citibank Demo Business Inc • aibanking.dev Protocol</p>
|
| 318 |
+
</div>
|
| 319 |
+
</div>
|
| 320 |
+
</footer>
|
| 321 |
</div>
|
| 322 |
);
|
| 323 |
};
|
| 324 |
|
| 325 |
+
const MegaLink = ({ icon: Icon, title, desc }: any) => (
|
| 326 |
+
<div className="group/mega flex gap-8 cursor-pointer hover:translate-x-2 transition-transform">
|
| 327 |
+
<div className="p-5 bg-zinc-900 rounded-[2rem] text-zinc-600 group-hover/mega:text-blue-500 transition-colors border border-zinc-800 shadow-xl group-hover/mega:border-blue-500/20">
|
| 328 |
+
<Icon size={32} />
|
| 329 |
+
</div>
|
| 330 |
+
<div>
|
| 331 |
+
<h4 className="text-base font-black text-white uppercase italic tracking-widest mb-1">{title}</h4>
|
| 332 |
+
<p className="text-xs text-zinc-500 font-bold leading-relaxed">{desc}</p>
|
| 333 |
+
</div>
|
| 334 |
+
</div>
|
| 335 |
+
);
|
| 336 |
+
|
| 337 |
+
const HeritageCard = ({ icon: Icon, title, val }: any) => (
|
| 338 |
+
<div className="p-10 bg-zinc-900/30 border border-zinc-800 rounded-[3rem] hover:border-blue-500/20 transition-all shadow-xl group">
|
| 339 |
+
<Icon size={36} className="text-blue-500 mb-8 group-hover:scale-110 transition-transform" />
|
| 340 |
+
<p className="text-[11px] font-black text-zinc-600 uppercase tracking-widest mb-2">{title}</p>
|
| 341 |
+
<p className="text-3xl font-black italic uppercase tracking-tighter text-white leading-none">{val}</p>
|
| 342 |
+
</div>
|
| 343 |
+
);
|
| 344 |
+
|
| 345 |
+
const FooterColumn = ({ title, links }: any) => (
|
| 346 |
+
<div className="space-y-12">
|
| 347 |
+
<h4 className="text-[12px] font-black uppercase tracking-[0.6em] text-white italic">{title}</h4>
|
| 348 |
+
<ul className="space-y-6">
|
| 349 |
+
{links.map((link: string, i: number) => (
|
| 350 |
+
<li key={i}>
|
| 351 |
+
<a href="#" className="text-[10px] font-bold text-zinc-600 hover:text-blue-400 transition-colors uppercase tracking-widest">{link}</a>
|
| 352 |
+
</li>
|
| 353 |
+
))}
|
| 354 |
+
</ul>
|
| 355 |
+
</div>
|
| 356 |
+
);
|
| 357 |
+
|
| 358 |
+
const SocialIcon = ({ icon: Icon }: any) => (
|
| 359 |
+
<div className="p-6 bg-zinc-900 border border-zinc-800 rounded-3xl text-zinc-500 hover:text-white hover:border-blue-500 transition-all cursor-pointer shadow-xl">
|
| 360 |
+
<Icon size={32} />
|
| 361 |
+
</div>
|
| 362 |
+
);
|
| 363 |
+
|
| 364 |
+
const FooterPolicyLink = ({ to, label }: any) => {
|
| 365 |
+
const navigate = useNavigate();
|
| 366 |
+
return (
|
| 367 |
+
<button onClick={() => navigate(to)} className="text-[10px] font-black uppercase tracking-[0.4em] text-zinc-600 hover:text-white transition-colors">{label}</button>
|
| 368 |
+
);
|
| 369 |
+
};
|
| 370 |
+
|
| 371 |
+
export default Landing;
|
views/Simulation.tsx
CHANGED
|
@@ -1,8 +1,9 @@
|
|
| 1 |
|
| 2 |
import React, { useState } from 'react';
|
| 3 |
import { Play, Sparkles, AlertCircle, CheckCircle2, ChevronRight, Loader2 } from 'lucide-react';
|
| 4 |
-
|
| 5 |
-
import {
|
|
|
|
| 6 |
|
| 7 |
const ScenarioButton = ({ label, description, onClick }: any) => (
|
| 8 |
<button
|
|
|
|
| 1 |
|
| 2 |
import React, { useState } from 'react';
|
| 3 |
import { Play, Sparkles, AlertCircle, CheckCircle2, ChevronRight, Loader2 } from 'lucide-react';
|
| 4 |
+
// fix: removed .ts extension from imports to follow project pattern and resolved missing member error
|
| 5 |
+
import { runSimulationForecast } from '../services/geminiService';
|
| 6 |
+
import { SimulationResult } from '../types/index';
|
| 7 |
|
| 8 |
const ScenarioButton = ({ label, description, onClick }: any) => (
|
| 9 |
<button
|
views/routes.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
|
| 2 |
import React from 'react';
|
| 3 |
import {
|
| 4 |
LayoutDashboard,
|
|
@@ -29,29 +28,29 @@ import {
|
|
| 29 |
Radio
|
| 30 |
} from 'lucide-react';
|
| 31 |
|
| 32 |
-
import Overview from './Overview
|
| 33 |
-
import InternalAccounts from './InternalAccounts
|
| 34 |
-
import Counterparties from './Counterparties
|
| 35 |
-
import Connectivity from './Connectivity
|
| 36 |
-
import Documents from './Documents
|
| 37 |
-
import Simulation from './Simulation
|
| 38 |
-
import DCRManagement from './DCRManagement
|
| 39 |
-
import Payments from './Payments
|
| 40 |
-
import Cards from './Cards
|
| 41 |
-
import AnalyticsReport from './AnalyticsReport
|
| 42 |
-
import Sustainability from './Sustainability
|
| 43 |
-
import Advisor from './Advisor
|
| 44 |
-
import Settings from './Settings
|
| 45 |
-
import LineItems from './LineItems
|
| 46 |
-
import VirtualAccounts from './VirtualAccounts
|
| 47 |
-
import Flows from './Flows
|
| 48 |
-
import Validations from './Validations
|
| 49 |
-
import CryptoTerminal from './CryptoTerminal
|
| 50 |
-
import CryptView from './CryptView
|
| 51 |
-
import PrivacyPolicy from './PrivacyPolicy
|
| 52 |
-
import Documentation from './Documentation
|
| 53 |
-
import Airdrop from './Airdrop
|
| 54 |
-
import Broadcast from './Broadcast
|
| 55 |
|
| 56 |
export interface RouteConfig {
|
| 57 |
path: string;
|
|
@@ -63,7 +62,7 @@ export interface RouteConfig {
|
|
| 63 |
}
|
| 64 |
|
| 65 |
export const routes: RouteConfig[] = [
|
| 66 |
-
{ path: '/', component: Overview, label: 'Overview', icon: LayoutDashboard, showInSidebar: true, category: 'core' },
|
| 67 |
{ path: '/broadcast', component: Broadcast, label: 'Global Node', icon: Radio, showInSidebar: true, category: 'core' },
|
| 68 |
{ path: '/registry', component: InternalAccounts, label: 'Bank Registry', icon: Building2, showInSidebar: true, category: 'registry' },
|
| 69 |
{ path: '/virtual-nodes', component: VirtualAccounts, label: 'Virtual Nodes', icon: Network, showInSidebar: true, category: 'registry' },
|
|
@@ -77,16 +76,12 @@ export const routes: RouteConfig[] = [
|
|
| 77 |
{ path: '/dcr', component: DCRManagement, label: 'DCR Registry', icon: Key, showInSidebar: true, category: 'intelligence' },
|
| 78 |
{ path: '/validator', component: Validations, label: 'Registry Validator', icon: ShieldAlert, showInSidebar: true, category: 'intelligence' },
|
| 79 |
{ path: '/payments', component: Payments, label: 'Disbursements', icon: ArrowLeftRight, showInSidebar: true, category: 'finance' },
|
| 80 |
-
{ path: '/line-items/:type/:id', component: LineItems, label: 'Line Ledger', icon: ListTree, showInSidebar: false, category: 'finance' },
|
| 81 |
{ path: '/cards', component: Cards, label: 'Elite Cards', icon: CreditCard, showInSidebar: true, category: 'finance' },
|
| 82 |
{ path: '/analytics', component: AnalyticsReport, label: 'Statements', icon: FileText, showInSidebar: true, category: 'finance' },
|
| 83 |
{ path: '/sustainability', component: Sustainability, label: 'Carbon Audit', icon: Leaf, showInSidebar: true, category: 'finance' },
|
| 84 |
{ path: '/advisor', component: Advisor, label: 'AI Terminal', icon: MessageSquare, showInSidebar: true, category: 'intelligence' },
|
| 85 |
{ path: '/airdrop', component: Airdrop, label: 'jocall3 Airdrop', icon: Gift, showInSidebar: true, category: 'finance' },
|
| 86 |
-
|
| 87 |
-
// New Epic Pages
|
| 88 |
{ path: '/manifesto', component: PrivacyPolicy, label: 'Privacy Manifesto', icon: FileLock2, showInSidebar: true, category: 'admin' },
|
| 89 |
{ path: '/documentation', component: Documentation, label: 'Documentation Core', icon: BookOpen, showInSidebar: true, category: 'admin' },
|
| 90 |
-
|
| 91 |
{ path: '/settings', component: Settings, label: 'System Config', icon: SettingsIcon, showInSidebar: false, category: 'admin' },
|
| 92 |
-
];
|
|
|
|
|
|
|
| 1 |
import React from 'react';
|
| 2 |
import {
|
| 3 |
LayoutDashboard,
|
|
|
|
| 28 |
Radio
|
| 29 |
} from 'lucide-react';
|
| 30 |
|
| 31 |
+
import Overview from './Overview';
|
| 32 |
+
import InternalAccounts from './InternalAccounts';
|
| 33 |
+
import Counterparties from './Counterparties';
|
| 34 |
+
import Connectivity from './Connectivity';
|
| 35 |
+
import Documents from './Documents';
|
| 36 |
+
import Simulation from './Simulation';
|
| 37 |
+
import DCRManagement from './DCRManagement';
|
| 38 |
+
import Payments from './Payments';
|
| 39 |
+
import Cards from './Cards';
|
| 40 |
+
import AnalyticsReport from './AnalyticsReport';
|
| 41 |
+
import Sustainability from './Sustainability';
|
| 42 |
+
import Advisor from './Advisor';
|
| 43 |
+
import Settings from './Settings';
|
| 44 |
+
import LineItems from './LineItems';
|
| 45 |
+
import VirtualAccounts from './VirtualAccounts';
|
| 46 |
+
import Flows from './Flows';
|
| 47 |
+
import Validations from './Validations';
|
| 48 |
+
import CryptoTerminal from './CryptoTerminal';
|
| 49 |
+
import CryptView from './CryptView';
|
| 50 |
+
import PrivacyPolicy from './PrivacyPolicy';
|
| 51 |
+
import Documentation from './Documentation';
|
| 52 |
+
import Airdrop from './Airdrop';
|
| 53 |
+
import Broadcast from './Broadcast';
|
| 54 |
|
| 55 |
export interface RouteConfig {
|
| 56 |
path: string;
|
|
|
|
| 62 |
}
|
| 63 |
|
| 64 |
export const routes: RouteConfig[] = [
|
| 65 |
+
{ path: '/overview', component: Overview, label: 'Overview', icon: LayoutDashboard, showInSidebar: true, category: 'core' },
|
| 66 |
{ path: '/broadcast', component: Broadcast, label: 'Global Node', icon: Radio, showInSidebar: true, category: 'core' },
|
| 67 |
{ path: '/registry', component: InternalAccounts, label: 'Bank Registry', icon: Building2, showInSidebar: true, category: 'registry' },
|
| 68 |
{ path: '/virtual-nodes', component: VirtualAccounts, label: 'Virtual Nodes', icon: Network, showInSidebar: true, category: 'registry' },
|
|
|
|
| 76 |
{ path: '/dcr', component: DCRManagement, label: 'DCR Registry', icon: Key, showInSidebar: true, category: 'intelligence' },
|
| 77 |
{ path: '/validator', component: Validations, label: 'Registry Validator', icon: ShieldAlert, showInSidebar: true, category: 'intelligence' },
|
| 78 |
{ path: '/payments', component: Payments, label: 'Disbursements', icon: ArrowLeftRight, showInSidebar: true, category: 'finance' },
|
|
|
|
| 79 |
{ path: '/cards', component: Cards, label: 'Elite Cards', icon: CreditCard, showInSidebar: true, category: 'finance' },
|
| 80 |
{ path: '/analytics', component: AnalyticsReport, label: 'Statements', icon: FileText, showInSidebar: true, category: 'finance' },
|
| 81 |
{ path: '/sustainability', component: Sustainability, label: 'Carbon Audit', icon: Leaf, showInSidebar: true, category: 'finance' },
|
| 82 |
{ path: '/advisor', component: Advisor, label: 'AI Terminal', icon: MessageSquare, showInSidebar: true, category: 'intelligence' },
|
| 83 |
{ path: '/airdrop', component: Airdrop, label: 'jocall3 Airdrop', icon: Gift, showInSidebar: true, category: 'finance' },
|
|
|
|
|
|
|
| 84 |
{ path: '/manifesto', component: PrivacyPolicy, label: 'Privacy Manifesto', icon: FileLock2, showInSidebar: true, category: 'admin' },
|
| 85 |
{ path: '/documentation', component: Documentation, label: 'Documentation Core', icon: BookOpen, showInSidebar: true, category: 'admin' },
|
|
|
|
| 86 |
{ path: '/settings', component: Settings, label: 'System Config', icon: SettingsIcon, showInSidebar: false, category: 'admin' },
|
| 87 |
+
];
|