Switchable Capability Ledger

(Scope by track)

Pick the track, read the whole list.

Three ways studios usually arrive at our door. Switch between them to see exactly what the work covers, and roughly how long each piece takes.

Positioning workshop

Two days with your founders, ending in a single page everyone can repeat without notes.

Typical duration

2 weeks

Identity system

Marks, type, colour and the layout grid, drawn to survive a decade of new hires.

Typical duration

6 weeks

Guideline set

A short manual written for the people who will use it, not for the awards jury.

Typical duration

3 weeks

About this block

Switchable Capability LedgerPRO

Capability section with a row of pill filters that swap the list below: each entry becomes a ruled three-column row holding the title, an explanation and the typical duration pinned right.

Feature246: Switchable Capability Ledger

Capability section with a row of pill filters that swap the list below. Each entry becomes a ruled three-column row holding the title, the explanation and the typical duration pinned to the right edge, so a long service list stays readable without an accordion.

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

Base UI flavor

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

This installs the block to components/beste/block/feature246.tsx plus the badge7 component it uses for the eyebrow.

Quick start

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

tsx
import { Feature246, feature246Demo } from "@/components/beste/block/feature246";

export default function Page() {
  return <Feature246 {...feature246Demo} />;
}

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

tsx
import { Feature246 } from "@/components/beste/block/feature246";

export default function Page() {
  return (
    <Feature246
      badge={{ label: "Scope by track" }}
      heading="Pick the track, read the whole list."
      description="Switch between them to see what the work covers."
      labels={{ metaTitle: "Typical duration" }}
      groups={[
        {
          label: "Brand",
          items: [
            {
              title: "Identity system",
              description: "Marks, type, colour and the layout grid.",
              meta: "6 weeks",
            },
          ],
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow label rendered as a Badge7
headingstringSection heading in the left column
descriptionstringSupporting paragraph, right-aligned from md up
groupsCapabilityGroup[][]Each group becomes one filter pill and its own list
labelsFeature246Labels{}Fixed strings that are not content: the label above every duration
classNamestringExtra classes for the outer <section>
ts
type CapabilityGroup = {
  label: string;
  items: Capability[];
};

type Capability = {
  title: string;
  description: string;
  meta: string;
};

type Feature246Labels = {
  metaTitle?: string;
};

Behavior notes

  • The filter holds an index in useState, defaulting to 0, so the first group renders on the server and the block is never empty before hydration.
  • Filters are real <button type="button"> elements with aria-pressed, not links, so switching a group never changes the URL or scrolls the page.
  • Every pill carries cursor-pointer, since Tailwind v4 leaves buttons on the default arrow cursor.
  • Rows use md:grid-cols-[minmax(0,16rem)_1fr_auto] on md:items-baseline, which puts the title, the explanation and the duration on one baseline and lets the middle column absorb the spare width.
  • meta is a free-text string, so a row can read 6 weeks, 2 days or Ongoing without a separate unit prop.
  • Below md each row stacks into title, paragraph and duration in that order, with the duration keeping its small label so it still reads as a data point rather than a stray line.

More Feature blocks

View all Feature
PRO

feature257

Capability Selector

An interactive feature where a hairline list of four capabilities swaps the image tile beside it, each one floating a different live asset with its own supporting paragraph.

PRO

feature224

Capability Checklist Split

Two-column split with an eyebrow, big heading, description, and CTA on the left and a checklist of capabilities with rounded check seals on the right.

PRO

feature273

Question And Answer Ledger

A two-column ledger pairing the question a reader sent on the left with the thing that was built in response on the right, under column labels that only appear on desktop.

PRO

feature254

Photographic Year Ledger

Timeline where every ruled row lines up a year, a photograph from that moment and the explanation of what forced the change, headed by a pill CTA on the heading line and stacking to a readable block on mobile.

FREE

feature5

Compact Two-Column Capabilities

Left-aligned headline followed by a compact two-column grid of capability rows. Each row leads with a Lucide icon.

PRO

feature155

Feature Comparison Table

Simple 3-column comparison table with feature names and check/cross icons. Essential for plan comparison, feature tier table, or pricing comparison.