Skip to content

No.299 · Feedback· New

Forwarding 404

A not-found page for addresses that used to work: it follows your redirect table and draws the trail from the old link to where the page lives now.

The prompt

Copy this text

Automatic copying is unavailable. Copy the selected text using your device’s copy command.

Written for the variant you picked above: Paper

Build a not-found page for retired addresses. Take the requested path and a redirect table of { from, to, date, reason } records. Normalise addresses (lowercase, no query or hash, no trailing slash) and follow the table from the requested address until it settles, recording each move; stop and flag a loop if an address repeats or after 20 steps. Compose a single left-aligned 40rem column on a cool grey page. A mono 11px uppercase eyebrow '404 · Forwarding record', then a 30–48px Geist headline: 'This page moved on.' A muted lede says when the requested address was retired and how many times it has moved. Below, an ordered trail on a single 1.5px vertical rail with a 12px node beside every address. Each stop after the first carries a small uppercase mono line '↓ Renamed · 3 Jun 2025' (reason and date), then the address in mono. Retired addresses are struck through in a faint tone, with tags 'You asked for this' under the first. The final, live address is larger, in the accent colour as a link, with a filled accent node and a soft 4px ring, tagged 'Lives here now'. Then a filled accent button 'Continue to /plans/studio', an outline 'Copy new link' button, a polite status line, and a small uppercase home link. When the trail loops, the headline says 'This address goes round in circles.', the repeated stop is struck in red with a dashed node, and the actions become home plus a search field. When nothing forwards, the headline is 'No forwarding address.' with a search form (label, field, Search button) and a home button. Selected variant — Paper (paper): Paper theme with a two-move trail (/team-plan renamed to /pricing/teams, then merged into /plans/studio). Palette: page #eef1f4, ink #15202b, muted #586574, faint #8a96a3, hairlines rgb(21 32 43 / 0.14), rail rgb(21 32 43 / 0.22), accent #2643c4 with white text, loop red #b4232c, fields #ffffff. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: Continue follows the live address through an hrefFor mapping (the demo maps addresses to local fragments). Copy new link writes origin + address to the clipboard and only says 'Copied' on success; if copying fails, the status line spells out the address instead. The search form calls onSearch with the trimmed query. Motion: The rail draws downward over 900ms (scaleY, expo-out) while each stop rises 6px and fades in 220ms after the one before, so the reader follows the move in order. Reduced motion shows the finished trail. Accessibility: A section labelled by its heading; the trail is an ordered list labelled 'Forwarding trail' with real <s> and <time> elements; copy results go to a role=status line; the search is a labelled role=search form. Unique ids per instance and visible focus rings. Responsive behavior: One fluid column from 320px up; long addresses wrap anywhere instead of overflowing, and the action buttons wrap onto their own lines. Touch: All actions are buttons or links with 44px targets; nothing relies on hover. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.

Notes

Interaction
Continue follows the live address through an hrefFor mapping (the demo maps addresses to local fragments). Copy new link writes origin + address to the clipboard and only says 'Copied' on success; if copying fails, the status line spells out the address instead. The search form calls onSearch with the trimmed query.
Motion
The rail draws downward over 900ms (scaleY, expo-out) while each stop rises 6px and fades in 220ms after the one before, so the reader follows the move in order. Reduced motion shows the finished trail.
Accessibility
A section labelled by its heading; the trail is an ordered list labelled 'Forwarding trail' with real <s> and <time> elements; copy results go to a role=status line; the search is a labelled role=search form. Unique ids per instance and visible focus rings.
Responsive
One fluid column from 320px up; long addresses wrap anywhere instead of overflowing, and the action buttons wrap onto their own lines.
On touch
All actions are buttons or links with 44px targets; nothing relies on hover.

Featured

333 components