Two-Up Capability CardsPRO

A feature built from two tall bordered cards, each stacking an image tile with a live asset over a small kicker, an editorial title, a checked list on hairlines, and its own outline action.

Feature258: Two-Up Capability Cards

A feature built from two tall bordered cards, each stacking an image tile with a live asset over a small kicker, an editorial title, a checked list on hairlines and its own outline action.

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

Base UI flavor

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

This installs the block to components/beste/block/feature258.tsx, the money23 and notification20 pieces it floats on the two card tiles (installed to components/beste/piece/{name}.tsx), and the badge23 and button21 components it uses for the eyebrow and the card actions.

Quick start

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

tsx
import { Feature258, feature258Demo } from "@/components/beste/block/feature258";

export default function Page() {
  return <Feature258 {...feature258Demo} />;
}

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

tsx
import { Feature258 } from "@/components/beste/block/feature258";
import { Money23 } from "@/components/beste/piece/money23";
import { Notification20 } from "@/components/beste/piece/notification20";
import { ShieldCheck } from "lucide-react";

export default function Page() {
  return (
    <Feature258
      badge={{ label: "Two hard parts" }}
      heading="Billing and access, handled without a second system"
      description="The two things practices usually bolt on afterwards are the two things this refuses to leave out."
      items={[
        {
          kicker: "Billing",
          title: "One bill instead of four",
          description: "Charges accrue as care happens and reconcile themselves.",
          points: [
            "Invoices raised from the appointment record",
            "Insurer and self-pay on the same ledger",
          ],
          button: { label: "See billing", href: "/billing" },
          media: <Money23 label="Estimated saving" amount="$1,840" period="per month" />,
          image: { src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" },
        },
        {
          kicker: "Access",
          title: "Records open to the right people only",
          description: "Access is requested inside the product and logged either way.",
          points: ["Six named roles, no checkbox grid", "Every grant and export written down"],
          button: { label: "See permissions", href: "/security" },
          media: (
            <Notification20
              icon={ShieldCheck}
              title="Access request"
              meta="Noah Reyes is asking for the records role"
              primaryLabel="Approve"
              secondaryLabel="Decline"
            />
          ),
          image: { src: "/backdrops/green.jpg", alt: "Deep green gradient backdrop" },
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the hairline rule, rendered through Badge23
headingstringSection heading in the left column of the header
descriptionstringSupporting paragraph, right-aligned from md up
itemsFeatureCard[][]Cards, laid out two-up from lg
classNamestringExtra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type FeatureCard = {
  kicker: string;
  title: string;
  description: string;
  points: string[];
  button: ActionLink;
  media: ReactNode;
  image?: TileImage;
};

type TileImage = {
  src: string;
  alt: string;
};

Behavior notes

More Feature blocks

View all Feature
PRO

feature189

Masonry Feature Cards over Media

Masonry-style two-column cards with alternating heights and image accents over background media

PRO

feature183

Split Image Card with Feature Stack

Two-column layout with large image card on left and stacked glass feature cards on right

PRO

feature243

Compact Asset Cards

A feature with an eyebrow over a hairline rule, a two-column heading, and three bordered cards that each float a compact live micro-asset above a title and description.

PRO

feature187

Two-Column Alternating Cards over Media

Alternating two-column feature cards with large icons over background media, left-right zigzag layout

PRO

feature193

Asymmetric Tall + Compact Cards over Media

Alternating rows with tall highlight card and stacked compact cards over background media

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.