Salary Bands Table

Pay Transparency

Open and transparent pay

We publish our salary bands because we believe transparency builds trust. Every offer falls within these ranges based on experience and location.

Level
Role Example
Salary Range
Equity
L1
Junior Engineer
$85K $110K
0.01% – 0.03%
L2
Mid-Level Engineer
$110K $145K
0.03% – 0.06%
L3
Senior Engineer
$145K $185K
0.06% – 0.12%
L4
Staff Engineer
$185K $230K
0.12% – 0.25%
L5
Principal Engineer
$230K $290K
0.25% – 0.50%
L10.01% – 0.03%
Junior Engineer
$85K $110K
L20.03% – 0.06%
Mid-Level Engineer
$110K $145K
L30.06% – 0.12%
Senior Engineer
$145K $185K
L40.12% – 0.25%
Staff Engineer
$185K $230K
L50.25% – 0.50%
Principal Engineer
$230K $290K

Ranges reflect base salary for US-based roles. International salaries are adjusted using a cost-of-labor index. Total compensation includes base, equity, and annual bonus.

About this block

Salary Bands TablePRO

Transparent salary bands with level, role, visual range bars, and equity details. Pay transparency table with responsive card fallback.

Careers35: Salary Bands Table

A pay-transparency section that renders an optional centered header (badge, <strong>-aware heading, description) above a list of engineering levels shown as a bordered desktop table and a stacked mobile card layout, each row pairing a level badge, role name, a $XXK – $YYK salary range with a proportional range bar scaled against the highest band, and an optional equity string, closed by an optional fine-print note.

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

Base UI flavor

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

This installs the block to components/beste/block/careers35.tsx, plus the badge shadcn/ui primitive it uses for the header eyebrow and the per-row level tag.

Quick start

The installed file exports careers35Demo alongside the block: the exact props behind the preview above. Spread it to get a working salary bands table in one line.

tsx
import { Careers35, careers35Demo } from "@/components/beste/block/careers35";

export default function CareersPayPage() {
  return <Careers35 {...careers35Demo} />;
}

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

tsx
import { Careers35 } from "@/components/beste/block/careers35";

export default function CareersPayPage() {
  return (
    <Careers35
      badge={{ label: "Pay Transparency", variant: "secondary" }}
      heading="Open and <strong>transparent</strong> pay"
      description="Every offer falls within these published ranges."
      items={[
        { level: "L1", role: "Junior Engineer", salaryMin: 85000, salaryMax: 110000, equity: "0.01% – 0.03%" },
        { level: "L2", role: "Mid-Level Engineer", salaryMin: 110000, salaryMax: 145000 },
      ]}
      note="Ranges reflect base salary for US-based roles."
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Optional eyebrow badge above the heading
headingstringSection heading, supports inline <strong>
descriptionstringSub-copy shown under the heading
itemsSalaryBand[][]Rows rendered in the table and mobile cards
notestringFine-print line rendered below the table
classNamestringExtra classes for the outer <section>
ts
type SalaryBand = {
  level: string;
  role: string;
  salaryMin: number;
  salaryMax: number;
  equity?: string;
};

Behavior notes

  • The header block only renders when at least one of badge, heading, or description is present; with all three omitted the section starts directly at the table.
  • heading is injected via dangerouslySetInnerHTML, so inline <strong> is styled with text-primary; any HTML you pass is rendered raw and unsanitized.
  • The range bar is scaled against globalMax = Math.max(...items.map(i => i.salaryMax), 1), the largest salaryMax across all rows, so every band's bar is positioned relative to the top of the whole set, not each row independently.
  • Salary figures are formatted with formatSalary, which divides by 1000 and rounds to a whole number, rendering e.g. $85K; sub-thousand precision is lost.
  • The component renders two full copies of the data: a bordered table hidden below the md breakpoint and a stacked card list hidden at and above it; both are always in the DOM.
  • Desktop rows use a fixed grid-cols-[60px_1fr_1fr_140px] layout with zebra striping on odd rows (bg-muted/30) and a bottom border on every row except the last.
  • Rows are keyed by array index, and a missing equity value falls back to a literal em-dash character; there are no interactive elements, callbacks, or internal state in this block.

More Careers blocks

View all Careers
PRO

careers55

Published Pay Bands

A pay transparency table whose track pills swap the band column while the levels, their scope, and the headcount at each stay in place, closing on the written rules that govern the numbers beside a soft panel carrying the call to action.

PRO

careers21

Compensation & Total Rewards

Transparent compensation philosophy with salary, equity, bonus, and perks cards. Shows total rewards approach with highlighted details.

PRO

careers31

Role Comparison Table

Side-by-side role comparison grid showing team, skills, experience, and salary for different positions. Responsive table-to-card layout.

PRO

careers52

Single Role Detail

A job description laid out as a reading column with checked responsibility lists and a candid caveat panel, against a sticky rail carrying the published salary band, level, and location alongside the apply action.

PRO

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.

PRO

careers7

Culture Stats with Positions

Team culture stats bar followed by detailed job position cards. Combines social proof with open roles listing.