404 With Featured Work

Lost Page
404

You found the one empty shelf.

Whatever sat at this address has been packed away. The work below is what we would show you if you walked in and asked.

About this block

404 With Featured WorkPRO

Studio 404 that recovers a dead project URL: a square eyebrow and status code over a hairline rule, an accent headline and seal button, then two large project cards with category lines and hover arrow chips.

A studio 404 for a dead project URL: the apology and a seal button sit under the eyebrow rule, then two large project cards with category lines and arrow chips that take the accent colour on hover.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/error24?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/error24?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/error24.tsx, plus the two design-system primitives it renders through: badge6 for the square eyebrow and button1 for the seal call to action.

Quick start

The installed file exports error24Demo alongside the block: the exact props behind the preview above. Spread it to get a working error page in one line.

tsx
import { Error24, error24Demo } from "@/components/beste/block/error24";

export default function NotFound() {
  return <Error24 {...error24Demo} />;
}

Then pass your own projects. The category line is optional per card:

tsx
import { Error24 } from "@/components/beste/block/error24";

export default function NotFound() {
  return (
    <Error24
      label="Lost Page"
      code="404"
      heading="You found <strong>the one empty shelf</strong>."
      description="Whatever sat at this address has been packed away."
      button={{ label: "Open the archive", href: "/archive" }}
      projectsLabel="Worth a look instead"
      projects={[
        {
          title: "Meridian rebrand",
          category: "Identity, 2026",
          href: "/work/meridian",
          image: { src: "/images/meridian.jpg", alt: "Printed brand identity pieces" },
        },
        {
          title: "Foldwork storefront",
          category: "Commerce, 2025",
          href: "/work/foldwork",
          image: { src: "/images/foldwork.jpg", alt: "Storefront dashboard on a screen" },
        },
      ]}
      link={{ label: "See every project", href: "/work" }}
    />
  );
}

Props

PropTypeDefaultDescription
labelstringEyebrow text rendered through the square-marker badge
codestringStatus code shown after the eyebrow divider
headingstringHeadline HTML, rendered as an h1; <strong> marks the accent clause
descriptionstringExplanatory paragraph under the headline
buttonActionLinkSeal call to action under the description
projectsLabelstringCaption above the project grid
projectsProjectItem[][]Project cards
linkActionLinkText link under the grid
classNamestringExtra classes for the outer <section>
ts
type ProjectItem = {
  title: string;
  category?: string;
  href: string;
  image: { src: string; alt: string };
};

type ActionLink = {
  label: string;
  href: string;
};

Behavior notes

  • Each card is one link wrapping the image, category line, title and arrow chip, so the whole card is clickable and the markup stays a plain anchor.
  • Images sit in a 4:3 aspect box with object-cover and do not move on hover. The only hover change is the arrow chip beside the title flipping to the accent colour, driven by the named group/error24 group.
  • The grid is one column on mobile and two from the md breakpoint up, which is why two projects fill a row exactly.
  • The project section, its caption and the closing link all sit behind the same check: nothing below the seal button renders when projects is empty.
  • heading is injected with dangerouslySetInnerHTML and accepts inline HTML; <strong> takes the accent colour. Keep the value under your own control, never user input.

More Error blocks

View all Error
PRO

error14

Editorial 404 Section Index

Editorial 404 with a square eyebrow and status code over a hairline rule, an oversized accent-highlighted headline, and a ruled index of the sections visitors reach for next.

PRO

error15

500 Incident Report

Server error page with a square eyebrow and status code over a hairline rule, a bold accent headline, a bordered incident table of reference, timestamp and service rows, and a retry seal button beside a status page link.

PRO

error29

Oversized Numeral 404

Monochrome 404 led by the status code set as an oversized numeral, with the statement and pill call to action on one side of a hairline rule and the explanation plus display-type links on the other.

FREE

error6

Inline 404 Line

The smallest possible 404: the status code and the message sit on one line separated by a vertical rule, stacking on mobile, with a single outline button underneath.

PRO

error5

404 Support Panel

Card-style 404 panel that echoes the requested URL in monospace, pairs a browser-history back button with link actions, and closes with a support and status link row.

PRO

error4

404 With Destination Cards

404 page that recovers the visit with a grid of destination cards, each with an icon, title, description, and hover arrow, followed by a centered row of fallback buttons.