Closes #023-warn - Implement PEAD fallback transparency warning badge

This commit is contained in:
Antigravity Agent
2026-06-14 16:05:06 +02:00
parent 8ffe8de06a
commit 776a41f159
5 changed files with 88 additions and 12 deletions

View File

@@ -40,6 +40,7 @@ interface PEADData {
epsConsensus: number;
surprisePercent: number;
driftStatus: 'Active Drift' | 'Consolidating';
isLiveApi?: boolean;
}
export default function ScannerDemo() {
@@ -71,6 +72,7 @@ export default function ScannerDemo() {
{ ticker: 'TSLA', name: 'Tesla Inc.', peadSector: 'Consumer Goods', announcementDate: '2026-04-23', daysElapsed: 52, epsActual: 0.45, epsConsensus: 0.51, surprisePercent: -11.76, driftStatus: 'Consolidating' },
{ ticker: 'JPM', name: 'JPMorgan Chase & Co.', peadSector: 'Financial Services', announcementDate: '2026-04-12', daysElapsed: 63, epsActual: 4.44, epsConsensus: 4.15, surprisePercent: 6.99, driftStatus: 'Consolidating' }
]);
const [isLivePeadApi, setIsLivePeadApi] = useState(false);
// Cache for metadata and prices retrieved dynamically
const [alertsMetadata, setAlertsMetadata] = useState<Record<string, { name: string; whyDropped: string; sentiment: 'GREEN' | 'YELLOW' | 'RED' }>>({});
@@ -193,12 +195,16 @@ export default function ScannerDemo() {
epsActual: r.epsActual || 0,
epsConsensus: r.epsConsensus || 0,
surprisePercent: r.surprisePercent || 0,
driftStatus: r.driftStatus || 'Consolidating'
driftStatus: r.driftStatus || 'Consolidating',
isLiveApi: r.isLiveApi
});
});
peadList.sort((a, b) => Math.abs(b.surprisePercent) - Math.abs(a.surprisePercent));
setPeadData(peadList);
const hasLivePead = peadList.some(item => item.isLiveApi === true);
setIsLivePeadApi(hasLivePead);
// Update global store alerts for Sandbox module use
updateScannerAlerts(newAlerts);
@@ -766,12 +772,27 @@ export default function ScannerDemo() {
>
<Sparkles className="text-amber-400 w-4 h-4 animate-pulse" /> 3-Tier Screener Capacity Grid
</button>
<button
onClick={() => setLeftPanelTab('pead')}
className={`text-sm font-bold flex items-center gap-2 pb-1 transition-all cursor-pointer ${leftPanelTab === 'pead' ? 'text-white border-b-2 border-amber-500' : 'text-slate-400 hover:text-slate-200'}`}
>
<TrendingUp className="text-amber-400 w-4 h-4" /> 🚀 PEAD Drift Radar
</button>
<div className="flex items-center gap-2">
<button
onClick={() => setLeftPanelTab('pead')}
className={`text-sm font-bold flex items-center gap-2 pb-1 transition-all cursor-pointer ${leftPanelTab === 'pead' ? 'text-white border-b-2 border-amber-500' : 'text-slate-400 hover:text-slate-200'}`}
>
<TrendingUp className="text-amber-400 w-4 h-4" /> 🚀 PEAD Drift Radar
</button>
{leftPanelTab === 'pead' && (
isLivePeadApi ? (
<span className="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[9px] font-bold bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 shadow-[0_0_10px_rgba(16,185,129,0.15)]">
<span className="w-1 h-1 rounded-full bg-emerald-500 animate-ping" />
🟢 LIVE EPS FEED
</span>
) : (
<span className="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[9px] font-bold bg-amber-500/10 text-amber-400 border border-amber-500/20 shadow-[0_0_10px_rgba(245,158,11,0.15)]">
<span className="w-1 h-1 rounded-full bg-amber-500 animate-pulse" />
ARCHIV-DATEN (API OFFLINE)
</span>
)
)}
</div>
</div>
<span className="text-[10px] text-slate-400 font-mono">Modus: {scanMode.toUpperCase()} | Region: {marketRegion.toUpperCase()}</span>
</div>