SPB Git forge

spb/websensor

Public
33commits 1branches 0releases
3.4 MBsize
maindefault branch
10 days agolast push
TypeScript 55.4% Python 43.2% SQL 1.2%
1.5 KB · 28 lines tsx
Raw Blame History
1import Link from "next/link";2import { api } from "@/lib/api";3import { fmtInt } from "@/lib/format";4import { Bar, Empty, Panel } from "./ui";56/** Homepage rail: Global Observation Coverage Score by sector (server component). */7export async function CoverageRail() {8  const c = await api.coverage();9  return (10    <Panel title={<span>Observation coverage {c ? <span className={`font-mono ${c.global_score >= 60 ? "text-signal" : "text-high"}`}>{c.global_score.toFixed(1)}</span> : null}</span>} dense action={<Link href="/coverage" className="text-[11px] text-fg-subtle hover:text-fg">coverage →</Link>}>11      {!c || !c.sectors.length ? (12        <Empty>Coverage universes are loading.</Empty>13      ) : (14        <ul className="px-3 py-1.5 text-[12px]">15          {c.sectors.slice(0, 10).map((s) => (16            <li key={s.sector} className="grid grid-cols-[7.5rem_1fr_2.5rem] items-center gap-2 py-0.5">17              <Link href={`/coverage/${s.sector}`} className="truncate text-fg-muted hover:text-fg" title={`${fmtInt(s.covered)} / ${fmtInt(s.members)} observed`}>{s.label}</Link>18              <Bar value={s.score} tone={s.score >= 80 ? "signal" : s.score >= 60 ? "high" : s.score >= 40 ? "mid" : "info"} />19              <span className="text-right font-mono tabular text-fg-muted">{Math.round(s.score)}%</span>20            </li>21          ))}22          <li className="pt-1 text-[10.5px] text-fg-subtle">{fmtInt(c.covered)} / {fmtInt(c.members)} organizations · {fmtInt(c.monitored.shadow)} sensors in shadow</li>23        </ul>24      )}25    </Panel>26  );27}28