Work Perks Bento Grid

Perks

Why you'll love it here

Beyond competitive pay, here are the things that make working here genuinely enjoyable.

Team offsite

Quarterly Team Offsites

Every quarter we bring the whole team together for a week of collaboration, workshops, and fun in a new city.

Unlimited PTO

Take the time you need to recharge. We encourage a minimum of 4 weeks off per year.

Wellness Stipend

Monthly budget for gym, meditation apps, therapy, or whatever keeps you healthy.

Home Office Budget

One-time $2,000 setup budget plus monthly internet and coffee reimbursement.

Latest Equipment

MacBook Pro, 4K display, and any accessories you need to do your best work.

About this block

Work Perks Bento GridPRO

Bento-style grid of work perks with featured image card and icon cards. Mixed layout showcasing PTO, wellness, equipment, and team events.

Careers38: Work Perks Bento Grid

A centered header (optional badge, <strong>-aware heading, and description) above a responsive bento grid of perk cards, where each item renders either as an image card with a hover-zoom cover photo or as an icon card with a rounded primary-tinted glyph, and any item can span two columns.

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

Base UI flavor

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

This installs the block to components/beste/block/careers38.tsx, plus the badge shadcn/ui primitive it uses for the section eyebrow.

Quick start

The installed file exports careers38Demo alongside the block: the exact props behind the preview above. Spread it to get a working perks grid in one line.

tsx
import { Careers38, careers38Demo } from "@/components/beste/block/careers38";

export default function Page() {
  return <Careers38 {...careers38Demo} />;
}

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

tsx
import { Dumbbell, Laptop } from "lucide-react";
import { Careers38 } from "@/components/beste/block/careers38";

export default function Page() {
  return (
    <Careers38
      badge={{ label: "Perks", variant: "secondary" }}
      heading="Why you'll <strong>love it</strong> here"
      description="The things that make working here genuinely enjoyable."
      items={[
        {
          span: 2,
          title: "Quarterly Team Offsites",
          description: "A week together in a new city every quarter.",
          image: { src: "/offsite.jpg", alt: "Team offsite" },
        },
        { icon: Dumbbell, title: "Wellness Stipend", description: "Monthly health budget." },
        { icon: Laptop, title: "Latest Equipment", description: "MacBook Pro and any accessories." },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Optional eyebrow badge above the heading
headingstringSection heading, supports inline <strong>
descriptionstringSub-heading paragraph under the heading
itemsPerkCard[][]Cards rendered in the bento grid
classNamestringExtra classes for the outer <section>
ts
type PerkCard = {
  title: string;
  description?: string;
  icon?: LucideIcon;
  image?: { src: string; alt: string };
  span?: number;
};

Behavior notes

  • The whole header block is conditionally rendered: it only appears when at least one of badge, heading, or description is provided.
  • Per card, the presence of item.image decides the layout entirely: an image card (aspect-[2/1] cover photo plus text) wins over any icon, so setting both image and icon on the same item silently drops the icon.
  • heading is injected via dangerouslySetInnerHTML, so inline <strong> is styled as text-primary; passing untrusted strings here is an HTML-injection risk.
  • Column spanning is binary: only span === 2 widens a card to sm:col-span-2, and any other span value (including 3) is ignored, leaving the card at one column.
  • Image cards apply a hover zoom (group-hover/careers38:scale-105) on the cover photo; this is decorative only, and the block exposes no click handlers or callbacks on any card.
  • The grid is fixed at one, two, then three columns (grid-cols-1 sm:grid-cols-2 lg:grid-cols-3) and cannot be configured via props.
  • Cards use the array index as their React key, so reordering items without stable identity can cause reconciliation quirks.

More Careers blocks

View all Careers
PRO

careers9

Employee Benefits Grid

Benefits and perks showcase with icon cards in a responsive grid. Highlights company offerings like health, remote work, and growth opportunities.

PRO

careers41

Benefits & Perks

Studio benefits grid with an accent highlight and icon cards.

PRO

careers4

Perks & Open Positions

Combined perks and job listings section with benefits grid and open positions list. Ideal for complete career pages.

PRO

careers54

Benefits And Honest Omissions

A working-here section pairing a six-item icon benefits grid and a captioned full-bleed photograph with two closing cards that set what you get against what the company deliberately does not offer.

PRO

careers2

Job Openings Grid

Job openings grid with department badges, location tags, and apply buttons. Card-based layout for career pages.

PRO

careers11

Culture & Values

Company values grid with icon cards and employee testimonial quote. Showcases team culture and work philosophy.