ValuationOS
ValuationOS — initial commit (Phases 1–5)
d31acaa
import type { ComparableOut } from "@/types/api";
import { Link } from "react-router-dom";
export function ComparablesTable({ rows }: { rows: ComparableOut[] }) {
return (
<div className="panel">
<div className="px-4 py-3 border-b border-border flex items-center justify-between">
<div className="heading">Comparables · similarity-weighted peers</div>
<div className="text-xs text-muted">{rows.length}</div>
</div>
<div className="overflow-x-auto">
<table className="w-full text-sm">
<thead>
<tr className="text-[11px] uppercase tracking-wider text-muted">
<th className="text-left font-medium px-4 py-2">Issuer</th>
<th className="text-left font-medium px-2 py-2">Bond</th>
<th className="text-left font-medium px-2 py-2">Rating</th>
<th className="text-right font-medium px-2 py-2">Coupon</th>
<th className="text-left font-medium px-2 py-2">Maturity</th>
<th className="text-right font-medium px-2 py-2">Peer spread</th>
<th className="text-right font-medium px-2 py-2">Δ vs target</th>
<th className="text-right font-medium px-4 py-2">Similarity</th>
</tr>
</thead>
<tbody>
{rows.map((r) => {
const simBar = Math.max(0, Math.min(1, r.similarity));
return (
<tr key={r.bond_id} className="border-t border-border hover:bg-panel2/60">
<td className="px-4 py-2.5 truncate max-w-[180px]">{r.issuer_name}</td>
<td className="px-2 py-2.5 num text-muted">
<Link to={`/bonds/${r.bond_id}`} className="hover:text-accent">
{r.bond_id.slice(-10)}
</Link>
</td>
<td className="px-2 py-2.5 num text-muted">{r.rating ?? "—"}</td>
<td className="px-2 py-2.5 num text-right">{r.coupon.toFixed(3)}</td>
<td className="px-2 py-2.5 num text-muted">{r.maturity}</td>
<td className="px-2 py-2.5 num text-right">{r.peer_spread_bps.toFixed(1)}</td>
<td className="px-2 py-2.5 num text-right text-muted">
{r.distance_bps.toFixed(1)}
</td>
<td className="px-4 py-2.5 num text-right">
<div className="flex items-center gap-2 justify-end">
<div className="relative h-1.5 w-14 rounded bg-panel2 overflow-hidden">
<div
className="absolute top-0 bottom-0 left-0 bg-accent"
style={{ width: `${simBar * 100}%` }}
/>
</div>
<span>{r.similarity.toFixed(2)}</span>
</div>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
</div>
);
}