SPB Git forge

spb/rareindex

Public
54commits 1branches 0releases
7.1 MBsize
maindefault branch
10 days agolast push
TypeScript 61.9% HTML 37.2% SQL 0.7%
3.5 KB · 64 lines tsx
Raw Blame History
1import type { Metadata } from 'next';2import Link from 'next/link';3import { PageHeader } from '@/components/ui/page-header';4import { Tabs } from '@/components/ui/tabs';5import { Card, EmptyState, Badge } from '@/components/ui/primitives';6import { Thumb } from '@/components/market/bits';7import { listRadar } from '@/lib/queries/market-lists';8import { fmtMoney, fmtRelative } from '@/lib/format';9import { catName, humanize } from '@/lib/taxonomy';10import { sp1, type SP } from '@/lib/search-params';1112export const metadata: Metadata = { title: 'Rare Radar', description: 'Newly detected rare items: first listings in years, ultra-low populations, rare auction appearances, price discrepancies and undocumented variations.' };1314const KINDS = ['first_listing_in_years', 'ultra_low_population', 'rare_auction_appearance', 'price_discrepancy', 'undocumented_variation', 'record_sale'];1516export default async function RadarPage({ searchParams }: { searchParams: Promise<SP> }) {17  const sp = await searchParams;18  const kind = sp1(sp, 'kind') ?? null;19  const items = await listRadar({ kind, limit: 100 });20  return (21    <div>22      <PageHeader kicker="Signals" title="Rare Radar" description="Signals detected by the pipeline (§155): each finding cites its evidence (listing, sale, population report). Findings expire; nothing here is a recommendation." compact />23      <Tabs active={kind ?? 'all'} tabs={[{ id: 'all', label: 'All', href: '/radar' }, ...KINDS.map((k) => ({ id: k, label: humanize(k), href: `/radar?kind=${k}` }))]} className="mb-4" />24      {items.length ? (25        <ul className="grid grid-cols-1 gap-2 md:grid-cols-2 xl:grid-cols-3">26          {items.map((r) => (27            <li key={r.id} className="card flex gap-3 p-3">28              <Thumb src={r.heroImageUrl} alt="" size={56} rounded="rounded-md" />29              <div className="min-w-0 flex-1">30                <div className="flex items-center justify-between gap-2">31                  <Badge tone={r.kind === 'record_sale' ? 'gold' : r.kind === 'price_discrepancy' ? 'alert' : 'rarity'}>{humanize(r.kind)}</Badge>32                  <span className="num text-[11px] text-subtle">signal {r.score.toFixed(0)} · {fmtRelative(r.detectedAt)}</span>33                </div>34                <Link href={`/asset/${r.assetSlug}`} className="mt-1 block truncate text-[13px] font-medium text-fg hover:underline">35                  {r.assetTitle}36                </Link>37                <div className="text-[11px] text-muted">38                  {catName(r.categorySlug)} · RIV {r.rivUsd === null ? '—' : fmtMoney(r.rivUsd)}39                </div>40                {Object.keys(r.evidence).length ? (41                  <dl className="mt-1.5 grid grid-cols-2 gap-x-3 gap-y-0.5 text-[11px]">42                    {Object.entries(r.evidence)43                      .slice(0, 6)44                      .map(([k, v]) => (45                        <div key={k} className="contents">46                          <dt className="truncate text-subtle">{humanize(k)}</dt>47                          <dd className="num truncate text-muted">{typeof v === 'number' ? v.toLocaleString('en-US', { maximumFractionDigits: 2 }) : String(v)}</dd>48                        </div>49                      ))}50                  </dl>51                ) : null}52              </div>53            </li>54          ))}55        </ul>56      ) : (57        <Card>58          <EmptyState title="Radar is quiet" description="Findings appear when the pipeline has enough history to detect unusual events." />59        </Card>60      )}61    </div>62  );63}64