Skip to content
microcharts
ReferenceExpressiveHoneycomb

Honeycomb

Honeycomb shows how many of a capacity's slots are taken, as filled cells in a hex comb you can count.

encodes
filled-cell count in a hex grid (unit counting)
precision
high
nodes
2

34 of 40 seats are taken: Honeycomb fills 34 cells of an area-filling hex grid. The unit is the cell, so the count is countable, and this stays occupancy of a capacity rather than a magnitude. Cell size never changes with value, only the count does. It fills row-major from the top left, so occupancy reads as a sweep, and the whole grid is exactly two SVG paths (filled and empty) no matter how large the total.

Honeycomb
interactive · 4.93 kB · static · 2.26 kB

Install

Import & usereact/honeycomb
import { Honeycomb } from "@microcharts/react/honeycomb";<Honeycomb value={34} total={40} unit="seats" title="Occupancy" />
Needs package + stylesheetSet up with AI

Try it

When to use it

Use it for seats or licenses taken of a capacity, an occupancy read in a KPI card, or a countable of-total in a cell. For a capacity over about sixty use Progress, and for a magnitude with no total, MiniBar. It isn't a trend chart, and PictogramRow is the one that counts unlike things.

Sizing

Variants

strip mode + blank empties

Empty cells are outlined by default, so takenness survives grayscale: a filled cell against an outlined one reads without color. empty="blank" drops the empty cells entirely instead of dimming them, for surfaces where the outline reads as noise. Packing is automatic, because a near-square comb is the recognizable form; rows overrides it.

Edge cases

value = 0
value past total — fills every cell, the name keeps the true count
total = 0 — 'No data.'

A value past the total fills every cell while the accessible name keeps the true number, so occupancy is never silently clipped. Above sixty cells the counting stops working, so the chart emits a dev warning; reach for Progress there.

Four homes

Accessibility

The accessible name is the exact occupancy — "45 of 40 seats filled." — always the true value, even when it exceeds the total. The interactive entry announces the count on change through a polite live region and reveals the value and total on hover. Focus it and the arrow keys rove cell by cell (←/→ within a row, ↑/↓ holding the column), each cell announced as "Cell 7 of 40 — filled."

The interactive entry follows the shared interaction contract: arrow keys rove between units on both axes, Home and End jump to the ends, and a click, tap, Enter or Space selects a unit — pinning its readout so it survives blur, until you select it again or press Escape. On touch, a tap pins and a drag scrubs.

Props

PropTypeNotes
value*numberFilled count (fractional rounds).
totalnumberCapacity = cell count (default 10).
rowsnumber | "auto"auto (near-square) or a number; 1 = strip.
empty"outline" | "blank"How empty cells render (default outline).
unitstringNoun for the summary (e.g. "seats").
label"none" | "count" | "percent"Centered readout when the comb has room (default "none").
cellnumberHex cell radius in viewBox units (default 4).
animatebooleaninteractiveOpt-in entrance motion when the chart mounts client-side — add import "@microcharts/react/motion" once. Inert on the server, on hydrated server HTML, and under prefers-reduced-motion.

Plus the shared grammar — data, domain, color, title, summary, format — and the layout props (width, height, className, style) that every chart accepts. Interactive entries also share animate and live, and — wherever a chart has more than one navigable unit — onActive, onSelect, selectedIndex and defaultSelectedIndex; and — wherever the chart shows a hover value — readout. See the shared grammar.

Related charts