Open Roles With Published Bands

Open roles

We hire slowly and say so

Two roles are open. Both are advertised with the band we will actually pay, and neither will be filled by anyone who has to guess at it.

Nothing here that fits?

Write to us anyway
About this block

Open Roles With Published BandsPRO

A short roles list where the pay band sits on the row rather than behind an application, with a written empty state for when nothing is open and a speculative line underneath.

Careers57: Open Roles With Published Bands

A short roles list where the pay band sits on the row rather than behind an application, with a written empty state for when nothing is open and a speculative line underneath.

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/careers57?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/careers57.tsx and the badge6 component it uses for the eyebrow (installed to components/beste/component/badge6.tsx).

Quick start

The installed file exports careers57Demo alongside the block: the exact props behind the preview above. Spread it to get a working roles list in one line.

tsx
import { Careers57, careers57Demo } from "@/components/beste/block/careers57";

export default function CareersPage() {
  return <Careers57 {...careers57Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Careers57 } from "@/components/beste/block/careers57";

export default function CareersPage() {
  return (
    <Careers57
      eyebrow="Open roles"
      heading="We hire slowly and say so"
      description="Both roles are advertised with the band we will actually pay."
      roles={[
        {
          title: "Product designer",
          team: "Product",
          location: "Lisbon or remote in Europe",
          pay: "£62,000 to £74,000",
          href: "/careers/product-designer",
        },
      ]}
      emptyState="Nothing is open at the moment."
      speculativeText="Nothing here that fits?"
      speculativeLink={{ label: "Write to us anyway", href: "/contact" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Badge6 label above the hairline rule
headingstring–Section heading under the rule
descriptionstring–Supporting paragraph
rolesRole[][]One linked row per open role
emptyStatestring–Sentence shown when roles is empty
speculativeTextstring–Line under the list
speculativeLinkSpeculativeLink–Link beside that line
classNamestring–Extra classes for the outer section
ts
type Role = {
  title: string;
  team: string;
  location: string;
  pay: string;
  href: string;
};

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

Behavior notes

  • The empty state is a written sentence inside the list rather than a hidden section, so a careers page with nothing open still says something rather than collapsing to a heading.
  • The pay band is a plain string on the row, so it can be a range, a single figure or "pro rata" without a schema.
  • Team and location share one line under the role title, separated by a middle dot, which keeps the row to two columns on desktop.
  • The speculative line renders if either its text or its link is passed.

More Careers blocks

View all Careers
PRO

careers40

Open Roles

FREE

careers56

Role Fit Finder

PRO

careers52

Single Role Detail

Get Pro access