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
collection
Expressive
Source

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 · 5.13 kB · static · 2.39 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

Live playground
onActive
idle
  1. hover · rove · click…

Tap to take another seat — the new count fills a cell and is announced through a polite live region. Hover reveals the value / total. The cells are anonymous units, so there is no per-cell cursor.

filled · 28
total · 40
empty
label
readout
animate
import { Honeycomb } from "@microcharts/react/honeycomb/interactive";<Honeycomb  value={28}  total={40}/>

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

strip mode for a table cell
blank empties for a quieter, uncluttered surface

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

In a sentence

Seat occupancy — 34 of 40 taken, one row left.

In a table cell
Room A34/40
Room B28/40
Room C12/40
In a KPI card
Occupancy
34/40seats taken
In a tab header
Room ARoom BRoom C

Preview uses the public chart API only. When an interactive twin exists, it swaps in with the same props and no entrance motion - code samples stay on the static import. Placement recipes: Composition, Sizing.

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, press Escape, or press outside the chart. 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