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
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.