Product Surface Mosaic

The whole surface

One workspace, seen from six angles

Sirius is not a dashboard with modules bolted on. Every tile below is the same data, read by a different person.

Soft blue gradient backdrop

This week

Mon – Sun

Booked

142

+9

No-shows

3

-4

Hours

96

0

Overview

The week, already counted

Bookings, no-shows, and clinical hours are totalled as the work happens, so the morning huddle starts on decisions.

Built for the eleven people who touch a record

Roles read like jobs, access is asked for in the product, and every change writes itself into the log.

99.95%

availability we sign for, credited automatically when we miss it

Deep green gradient backdrop

Booking service

99.98%

Last 45 days

Reliability

Published, not promised

Forty-five days of service history, updated hourly.

Included on every plan

  • Multi-site rota
  • Audit log
  • Full data export
  • Insurer billing
A healthcare professional smiling in a bright clinic

Bramble Health, Bristol

About this block

Product Surface MosaicPRO

A six-column bento mixing a lead card whose image tile floats a live metrics panel, a soft statement tile, an inverted figure tile, a second asset tile carrying an uptime strip, a hairline inclusion list, and a captioned photograph.

Bento11: Product Surface Mosaic

A six-column bento mixing a lead card whose image tile floats a live metrics panel, a soft statement tile, an inverted figure tile, a second asset tile carrying an uptime strip, a hairline inclusion list and a captioned photograph.

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

Base UI flavor

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

This installs the block to components/beste/block/bento11.tsx, the dashboard33 and indicator14 pieces it floats on the two asset tiles (installed to components/beste/piece/{name}.tsx), and the badge23 component it uses for the eyebrow.

Quick start

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

tsx
import { Bento11, bento11Demo } from "@/components/beste/block/bento11";

export default function Page() {
  return <Bento11 {...bento11Demo} />;
}

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

tsx
import { Bento11 } from "@/components/beste/block/bento11";
import { Dashboard33 } from "@/components/beste/piece/dashboard33";
import { Indicator14 } from "@/components/beste/piece/indicator14";

export default function Page() {
  return (
    <Bento11
      badge={{ label: "The whole surface" }}
      heading="One workspace, seen from six angles"
      description="Every tile below is the same data, read by a different person."
      lead={{
        kicker: "Overview",
        title: "The week, already counted",
        description: "Bookings, no-shows, and clinical hours are totalled as the work happens.",
        media: (
          <Dashboard33
            title="This week"
            range="Mon to Sun"
            items={[{ label: "Booked", value: "142", delta: "+9", direction: "up" }]}
          />
        ),
        image: { src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" },
      }}
      statement={{
        title: "Built for the eleven people who touch a record",
        description: "Roles read like jobs and every change writes itself into the log.",
      }}
      figure={{ value: "99.95%", title: "availability we sign for" }}
      asset={{
        kicker: "Reliability",
        title: "Published, not promised",
        description: "Forty-five days of service history, updated hourly.",
        media: <Indicator14 title="Booking service" uptime="99.98%" range="Last 45 days" />,
      }}
      list={{ title: "Included on every plan", items: ["Multi-site rota", "Audit log"] }}
      photo={{
        caption: "Bramble Health, Bristol",
        image: { src: "/clinic/reception.jpg", alt: "A clinician in a bright clinic" },
      }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }–Eyebrow above the hairline rule, rendered through Badge23
headingstring–Section heading in the left column of the header
descriptionstring–Supporting paragraph, right-aligned from md up
leadMediaTile–Large card, four columns wide and two rows tall
statementStatementTile–Soft two-column tile of copy
figureFigureTile–Inverted two-column tile carrying one number
assetMediaTile–Three-column card with a second live asset
photoPhotoTile–Two-column photograph with a gradient caption
listListTile–One-column hairline list of inclusions
classNamestring–Extra classes for the outer section
ts
type TileImage = {
  src: string;
  alt: string;
};

type MediaTile = {
  kicker: string;
  title: string;
  description: string;
  media: ReactNode;
  image?: TileImage;
};

type StatementTile = {
  title: string;
  description: string;
};

type FigureTile = {
  value: string;
  title: string;
};

type PhotoTile = {
  caption: string;
  image: TileImage;
};

type ListTile = {
  title: string;
  items: string[];
};

Behavior notes

  • Every tile is a separate named prop with its own shape rather than one array of generic tiles. The mosaic is hand-composed, so each slot has a fixed span and a fixed role, and omitting one leaves a hole rather than reflowing the rest.
  • The grid is six columns with auto-rows-[minmax(14rem,auto)], so rows have a floor but still grow for long copy. The lead card takes col-span-4 row-span-2, and the remaining spans (2, 2, 3, 1, 2) are what make the rows add up.
  • Below md every span collapses and the tiles stack in source order: lead, statement, figure, asset, list, photo.
  • The lead card's tile is h-64 on mobile but md:h-auto md:flex-1 from md, so it absorbs the extra height of the two-row span rather than leaving a gap under the copy.
  • Three different surfaces are in play on purpose: bg-card with a border for the asset cards, bg-muted for the statement, and bg-foreground for the figure. The inverted tile uses fixed background text tokens, since its surface is fixed.
  • The photo tile lays its caption over a bottom-up gradient and uses justify-end, so the caption sits at the bottom regardless of the tile's final height.
  • The list closes with last:border-b, so it reads as a small table rather than an open list.

More Bento blocks

View all Bento
PRO

bento3

Selected Work Bento

PRO

bento4

Service Bento With Figure

PRO

bento2

Studio Summary Bento

Get Pro access