import Link from "next/link"; /* * The frame for every screen you can reach without a session: sign in, email * verification, and accepting an invitation. * * These three had drifted into three different layouts. Sign in was a centred * 26rem card with the lockup above it; verify and accept-invite were bare * left-aligned text on the full 1200px rail, with no masthead, no panel and no * brand anywhere on the page. Those two are the first screens a new customer * ever sees — arriving from an email, on a domain they have not visited before * — and they were the two that did not say whose product this is. * * There is no AppBar here on purpose: it carries navigation and an account * menu, and none of it works without a session. */ export function AuthShell({ title, lede, children, footnote, }: { title: string; lede?: React.ReactNode; children?: React.ReactNode; /** Sits outside the panel: orientation, not part of the task. */ footnote?: React.ReactNode; }) { return (
{/* The masthead's lockup, unlinked: there is nowhere to go yet. */}
Vantage HQ

{title}

{lede &&

{lede}

}
{children &&
{children}
} {footnote &&
{footnote}
}
); } /* * A terminal state — verified, expired, already used, invalid. Always says what * happened and what to do next: a dead end that only reports the failure leaves * someone holding an email they cannot act on. */ export function AuthMessage({ title, body, action }: { title: string; body: React.ReactNode; action?: { href: string; label: string } }) { return (

{body}

{action && ( {action.label} )}
); }