"use client"; import Link from "next/link"; import { useState } from "react"; /* * One record-line entry. `copy` marks the value as worth lifting to the * clipboard an instance UUID or a licence ID, the strings people paste into * support tickets. */ export type RecordField = { key: string; value: string; copy?: boolean }; function CopyButton({ value }: { value: string }) { const [done, setDone] = useState(false); return ( ); } /* * The page frame every screen starts with, replacing nine hand-rolled header * blocks that each picked their own gaps and their own place for actions. * * The record line is the one new idea: Vantage HQ is a registry, so every screen * is a record and records have reference numbers. Giving the reference a fixed * slot, in mono, above the fold, means "where is the ID" stops being a per-page * question. It costs one hairline rule. */ export function PageHeader({ back, title, subtitle, actions, record, status, }: { back?: { href: string; label: string }; title: string; subtitle?: React.ReactNode; actions?: React.ReactNode; record?: RecordField[]; status?: React.ReactNode; }) { return (
{back && ( ← {back.label} )}

{title}

{subtitle &&

{subtitle}

}
{actions &&
{actions}
}
{(record?.length || status) && (
{record?.map((f) => ( // min-w-0 and break-all because the commonest value here // is a 36-character UUID with a Copy button beside it, // which does not fit a 320px screen as one unbreakable // token and pushed the whole page sideways. {f.key} {f.value} {f.copy && } ))} {status && {status}}
)}
); }