spb/autoscholar
Public
1import Link from "next/link";2import { disciplineLabel, fmtDate, modeLabel } from "@/lib/format";3import { t } from "@/lib/i18n";4import { StatusBadge } from "./StatusBadge";56/** PublicationMetadata — consistent academic header block for a paper. */7export function PublicationMetadata({8 publicId,9 versionNo,10 status,11 synthetic,12 title,13 discipline,14 mode,15 firstPublishedAt,16 revisedAt,17 keywords,18 verified,19}: {20 publicId: string;21 versionNo: number;22 status: string;23 synthetic: boolean;24 title: string;25 discipline: string;26 mode: string;27 firstPublishedAt: string | Date;28 revisedAt: string | Date;29 keywords: string[];30 verified?: string;31}) {32 return (33 <header>34 <div className="flex flex-wrap items-center gap-x-3 gap-y-1.5">35 <span className="mono-id">{publicId}</span>36 <span className="muted text-xs">Version {versionNo}</span>37 <StatusBadge status={status} />38 {verified && <StatusBadge status="verified" label={verified} />}39 {synthetic && <span className="badge">staging sample — not a real paper</span>}40 </div>41 <h1 className="title-1 mt-4 max-w-4xl">{title}</h1>42 <p className="mt-4 text-sm">43 <span className="font-medium">{t("byline")}</span>44 <span className="muted"> · Research computed on MacLustr</span>45 </p>46 <dl className="mt-5 grid grid-cols-2 gap-x-6 gap-y-3 text-sm sm:grid-cols-4">47 <div>48 <dt className="label">Released</dt>49 <dd className="mt-0.5">{fmtDate(firstPublishedAt)}</dd>50 </div>51 <div>52 <dt className="label">Revised</dt>53 <dd className="mt-0.5">{fmtDate(revisedAt)}</dd>54 </div>55 <div>56 <dt className="label">Discipline</dt>57 <dd className="mt-0.5">58 <Link href={`/research?discipline=${discipline}`} className="no-underline hover:underline">59 {disciplineLabel(discipline)}60 </Link>61 </dd>62 </div>63 <div>64 <dt className="label">Methodology</dt>65 <dd className="mt-0.5">{modeLabel(mode)}</dd>66 </div>67 </dl>68 {keywords.length > 0 && (69 <ul className="mt-4 flex flex-wrap gap-1.5" aria-label="Keywords">70 {keywords.map((k) => (71 <li key={k}>72 <Link73 href={`/research?q=${encodeURIComponent(k)}`}74 className="chip no-underline"75 style={{ minHeight: "1.75rem" }}76 >77 {k}78 </Link>79 </li>80 ))}81 </ul>82 )}83 </header>84 );85}86