import Link from "next/link"; import { Signal } from "@/lib/types"; import { formatPercent, formatPrice, formatVolume } from "./MarketSnapshotStrip"; import { StatusBadge } from "./StatusBadge"; export function SignalTable({ signals }: { signals: Signal[] }) { if (!signals.length) return
No signal snapshots are available yet. Run the full intelligence pipeline and review pipeline readiness for price, news and provider diagnostics.
; return (
{signals.map((signal) => ( ))}
Asset Market Score Classification Risk Momentum Trend Sentiment Why it surfaced
{signal.ticker} {signal.asset?.name ?? "Name pending"} {signal.asset?.asset_type ?? "Asset"} | {signal.asset?.sector ?? "Sector pending"} | {signal.asset?.exchange ?? "Exchange n/a"} {formatPrice(signal.market_snapshot?.price, signal.market_snapshot?.currency)} {formatPercent(signal.market_snapshot?.perf_1d)} 1D | {formatPercent(signal.market_snapshot?.perf_5d)} 5D {signal.market_snapshot?.provider ?? "provider n/a"} | vol {formatVolume(signal.market_snapshot?.volume)} {signal.blum_score.toFixed(1)} {signal.risk_level} {metric(signal, "momentum_score")} {metric(signal, "trend_score")} {metric(signal, "sentiment_score")} {signal.explanation}
); } function metric(signal: Signal, key: string) { const value = signal.score_breakdown?.[key] ?? 0; return {Number(value).toFixed(0)}; }