Entry screens: hub, sign-in, 404
Three screens every app has, and each one is a rendering of something the system already knows.
The hub — examples/hub-page.tsx, wrapped in HubShell
The workspace's front door: the tools as tiles, from the same PRODUCTS array
the rail's switcher and the 404 read.
A tile is: the icon in accent ink, the name in mono caps, an ↗ mark,
and one sentence saying what question the tool answers. The sentence is the
point — a grid of names is a menu, and a reader choosing a tool is choosing a
question.
- Tile: 16 px radius, 1px border, card fill, 24 px padding, 12 px internal gap.
- Grid: 1 / 2 / 3 columns at base /
md/lg, 16 px gap. - Hover: border steps to
--border-strongand the fill to the accent tint. The icon animates only on a tile that goes somewhere. soon: no link, 60% opacity, still icon in secondary ink, a mono-caps SOON — the same signal the rail gives.adminOnly: absent for a member; present on an unconfigured deploy, because the route really is open and hiding the tile would hide that fact.
The h1 may carry one to three accented words, and only when they are the subject.
Sign-in — examples/login-page.tsx
A split card, centred, max-w-4xl (max-w-sm on a phone).
- Left, the action: accent eyebrow, one
<h1>, one sentence, one button, and under it the constraint that would otherwise be discovered as a failure ("@domain accounts only") in caption ink. - The button is
quiet, full width,lg— not the accent fill. There is only one action on the page, so nothing needs to out-shout anything, and a full-width emerald bar reads as marketing. The provider's mark keeps the provider's colours; never recolour a Google or Microsoft logo. - Right, the brand:
data-theme="dark"on that half alone — the system's subtree rule made visible — with the vertical fade, one off-screen accent glow on its own layer, the wordmark at 160 px, and three claim rows. Hidden belowmd, where the action is the whole screen. - Not configured: the button is replaced by a
warningAlert listing the exact environment variables. Not a disabled button — a control that cannot work should not be offered, and the reader needs the fix, not a refusal.
404 — examples/not-found.tsx
There are no redirects, and that is the decision. A stale link lands here
and the page names the moves: old path struck through, arrow, new path as a
link, all in mono at caption size, inside a bracket Callout. A redirect table
silently keeps stale links working and nobody ever updates one.
Under it, "Go to" and the same PRODUCTS list as exits, two columns, in the
smaller 16 px-padding tile.
It wears SiteHeader, not the rail: a reader who mistyped a URL is not inside a
tool. A tool may add its own 404 that KEEPS its rail, for wrong addresses inside
it.