Roles By Department

Open Roles

Build the studio with us

Polaris is a small, opinionated creative studio. We hire people who care about the last ten percent. Find your department below.

  • Senior Brand Designer

    Brooklyn, NYFull-time

  • Motion Designer

    Remote (Americas)Full-time

  • Design Systems Lead

    Brooklyn, NYFull-time

  • Staff Frontend Engineer

    Remote (Global)Full-time

  • Creative Technologist

    Brooklyn, NYContract

  • Brand Strategist

    Remote (Europe)Full-time

  • Content Strategist

    Brooklyn, NYPart-time

  • Producer

    Brooklyn, NYFull-time

  • Studio Coordinator

    Brooklyn, NYFull-time

About this block

Roles By DepartmentPRO

Department-tabbed open roles list using shadcn Tabs.

Careers44: Roles By Department

A centered careers section that groups open roles into department tabs: a header with an optional badge eyebrow, heading, and description sits above a shadcn Tabs bar whose first tab flattens every department's roles into one "All" list and whose remaining tabs each show a single department, with every role rendered as a bordered row showing title, location • type, and an arrow apply link.

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

Base UI flavor

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

This installs the block to components/beste/block/careers44.tsx, plus the tabs shadcn/ui primitive it uses for the department filter bar.

Quick start

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

tsx
import { Careers44, careers44Demo } from "@/components/beste/block/careers44";

export default function CareersPage() {
  return <Careers44 {...careers44Demo} />;
}

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

tsx
import { Careers44 } from "@/components/beste/block/careers44";

export default function CareersPage() {
  return (
    <Careers44
      eyebrow="Open Roles"
      heading="Build the studio with us"
      description="Find your department below."
      allLabel="All"
      departments={[
        {
          tabLabel: "Design",
          roles: [
            {
              title: "Senior Brand Designer",
              location: "Brooklyn, NY",
              type: "Full-time",
              href: "/jobs/senior-brand-designer",
            },
          ],
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringBadge6 eyebrow text above the heading; the badge is omitted when unset
headingstringSection heading; omitted when unset
descriptionstringSupporting paragraph below the heading; omitted when unset
allLabelstringLabel and value for the first tab that aggregates every department's roles
departmentsDepartment[][]Department tabs, each with its own scoped role list
classNamestringExtra classes for the outer <section>
ts
type Role = {
  title: string;
  location: string;
  type: string;
  href: string;
};

type Department = {
  tabLabel: string;
  roles: Role[];
};

Behavior notes

  • The first tab always uses allLabel for both its trigger label and its value; Tabs opens on defaultValue={allLabel}, so if allLabel is unset the default value is undefined and no tab is initially active.
  • The "All" tab content is built by departments.flatMap((d) => d.roles), so it lists every role across every department in department order; adding a role to a department automatically adds it to the All list.
  • Each remaining tab renders one department by its tabLabel, which is used as the TabsTrigger and TabsContent value, so two departments sharing a tabLabel would collide.
  • Roles have no client state or callbacks: each row's apply control is a plain <a href={role.href}>, so navigation is native and there is no onSelect-style handler to intercept.
  • The apply link carries aria-label={Apply for $} and animates its ArrowUpRight icon on hover; the location and type are joined by a literal bullet.
  • Nothing scrolls internally: the role lists grow to their full height, so long department lists extend the page rather than clipping to a fixed max-height.

More Careers blocks

View all Careers
PRO

careers6

Tab-Filtered Job Board

Tabbed job board with department filters using shadcn Tabs component. Browse positions by team with location and type details.

PRO

careers1

Job Listings List

Job listings section with role cards showing department, location, and employment type. Clean list layout with hover effects and apply buttons.

PRO

careers18

Department Overview Grid

Department cards with team lead, headcount, open roles badge, and links. Helps candidates explore teams before applying.

PRO

careers40

Open Roles

A studio jobs list with role meta, salary and apply arrows.

PRO

careers48

Join The Studio

Sticky employer-value intro beside a scrollable open-roles list.

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.