Skip to content
Zuno UI
Explore components
EXPLORE
Actions
Forms
Layout
Navigation
Data display
Feedback
Overlays
RESOURCES
Components/ComparisonTable

ComparisonTable

Options side by side across shared dimensions, with clear headers and a readable layout on phones.

Compare plans
FeatureFree$0Pro$20 per seat · RecommendedEnterpriseCustom pricing
Usage
Projects3UnlimitedUnlimited
Seats1Up to 50Unlimited
Security
SSOSAML and OIDCNot includedNot includedIncluded
Audit logNot includedIncludedIncluded

Installation

Run it from the root of a project already set up with zunoui init.

npx zunoui@latest add comparison-table

Dependencies

What add comparison-table installs alongside the component. The CLI skips any you already have in a compatible version.

ZUNO registry

Examples

2 examples · 1 component
comparison-table
Compare plans
FeatureFree$0Pro$20 per seat · RecommendedEnterpriseCustom pricing
Usage
Projects3UnlimitedUnlimited
Seats1Up to 50Unlimited
Security
SSOSAML and OIDCNot includedNot includedIncluded
Audit logNot includedIncludedIncluded

Plans in groups

Grouped dimensions, a recommended plan and boolean values. Narrow the window to see the pinned first column.

comparison-table
Storage options
CapabilityStandardArchive
RetrievalInstantWithin 12 hours
Price per GB$0.023$0.004
VersioningIncludedNot included

Two options

A flat list of rows comparing two products.

API reference

Configured through props: pass columns and rows (or groups of rows) and it renders the Table with the right header for every cell.

PropTypeDefault
caption

Names the comparison; it labels the scroll region too.

ReactNode—
columns

The options being compared, as column headers.

{ key; label; description? }[]—
rows

The dimensions, as row headers. values maps each column key to text, a node or a boolean.

{ label; description?; values }[][]
groups

Rows split into labelled sections ("Security", "Support"). Replaces rows.

{ label; rows }[]—
highlight

Column key to shade, such as the recommended plan. Say why in its label or description too.

string—
dimensionLabel

Header of the first column.

ReactNode"Feature"
includedLabel / excludedLabel

What screen readers hear for true and false values.

string"Included" / "Not included"
density

Row height, as in Table.

"comfortable" | "compact""comfortable"

Accessibility

Every cell has two headers: options are column headers (scope="col") and dimensions are row headers (scope="row"), so a screen reader announces "Pro, Custom domains, Included".

Groups are their own tbody with a row-group header, which is announced when entering the section.

true and false render a check or a dash with hidden text ("Included", "Not included"), never an icon alone.

On narrow screens the dimension column stays pinned and the options scroll sideways. The scroll area is a focusable region named by the caption, so keyboards can scroll it.

The highlighted column is only shaded; state the reason in text, for example "Recommended" in the column description.