Ballmac UI home

Fan-out Grid

New

Many things done at once as a grid of tiles, one per file or record, marked by state with an icon and a word, a segmented progress bar, filters, arrow-key movement in every direction, and Retry for the ones that failed.

v1.0.0Updated Oct 25, 2026Ships with a test
What changed

Matching 48 invoices to purchase orders

32 of 48 finished · 5 running · 3 failed

invoice-007.pdfFailed0.9 s

The total did not match the line items: $412.00 against $421.00.

Installation

$ pnpm dlx shadcn@latest add @ballmac/fan-out-grid

Usage

import { FanOutGrid } from "@/components/ballmac/fan-out-grid"

The full example is in the Code tab above.

Examples

Everything finished

Importing 24 customer files

24 of 24 finished

Select a tile to see what happened. Arrow keys move between tiles.

API reference

PropTypeDefault
items*FanItem[]—
titlestring—
selected

The selected item id. Controlled.

string | null—
defaultSelectedstring | nullnull
onSelectedChange(id: string | null) => void—
onRetry

Called by Retry with the ids of the failed items it should run again. Reject and the card says why.

(ids: string[]) => void | Promise<void>—

Also accepts the standard attributes of its root element.

Accessibility

KeyAction
TilesButtons named for the item and its state, such as 'invoice-004.pdf, failed'; one tile is in the tab order and the arrow keys move in every direction, with Home and End
StateNever only colour: done, running, failed and skipped each have their own icon, and the state is a word in the name and in the detail
BarThe segmented bar is an image with a spoken total; the header says it in words too
FiltersToggle buttons with pressed state and counts
RetryNative buttons; a failure is an alert and nothing is changed

Use with AI

items is [{ id, label, status: queued | running | done | failed | skipped, detail?, duration? }] (required); title, selected / defaultSelected / onSelectedChange. onRetry(ids) adds Retry buttons (all failed, and one on a selected failed tile); reject and the card says why. Filters appear for the states that have items. The header counts finished (done, failed and skipped) of the total. With the shadcn MCP server set up (guide), ask your agent:

Add the Ballmac UI Fan-out Grid (@ballmac/fan-out-grid) to this project with the shadcn MCP, then use it where it fits.

Use it for

  • Showing a batch where one agent task runs over many files, rows or records
  • Bulk operations where the question is 'which ones failed?'

Not for

  • A handful of named steps; use plan-tracker
  • Work waiting in order; use agent-queue
  • A density of numbers by two dimensions; use heat-grid

Registry JSON: https://ui.ballmac.com/r/fan-out-grid.json

Credits

Free to use in personal and commercial projects.

Ballmac UI Pro

Need the whole screen, not one piece?

150 premium blocks (dashboards, settings, calendars, mail, shops, onboarding), a private shadcn registry and Figma tokens. Blocks that show data come with loading, empty and error states built in.

Not ready? Try three Pro blocks free

Leave your email and the blocks appear right here, ready to copy. Yours to use in any project.