Compare
Three good alternatives, and when each one wins.
Oxygen UI compared to antd, TanStack, and building it yourself.
Every claim about another project below is a measurement against a named version, and each section says what they do well before it says what they do not.
Build it in-house
The components are the small part. The states are the work.
Choose it when — You have a design system, an accessibility practice, and a team that can carry both.
A lab result is an afternoon. A lab result that renders a corrected value without hiding the number a clinician saw an hour ago, distinguishes “no reference range published” from “within range”, and says “restricted” rather than showing an em dash — that is the part that takes a quarter and gets cut when the quarter runs out. Oxygen ships 30 components carrying 352 documented states because those states are the reason the library exists.
A general-purpose React library
Excellent engineering, aimed at a different problem.
Choose it when — Your product is not clinical, or clinical display is a small part of it.
Ant Design, MUI and their peers are better than anything we would write for the 80% of an application that is forms, layout and navigation — and Oxygen is deliberately API-compatible with antd v6 rather than competing with it. What they do not have is a vocabulary for absence: no component in a general-purpose library knows the difference between a result that is missing and a result you are not permitted to see, because no general-purpose product needs one.
A headless table library
You get the row model. You still own every cell and every keyboard interaction.
Choose it when — You need a data grid and you have the design and accessibility capacity to finish it.
TanStack Table v9 went stable on 4 August 2026 at roughly 25 KB with a substantially leaner memory profile than v8, and its row-model pipeline is the best in the ecosystem — we read it closely while building our own grid and chose not to depend on it. The reason is narrow: our row carries disclosure, absence and coverage semantics that a general row model has no place for, and adapting one costs more than the pipeline saves.
What we measured, in the table everyone starts from.
@rc-component/table@1.11.1 is the engine under Ant Design v6’s Table, and the honest starting point for anyone building a clinical grid. These figures come from reading its published ES build.
| Checked | rc-table + antd | Oxygen DataGrid 0.6.0 |
|---|---|---|
| aria-* attributes in the published ES build | One — aria-hidden. | Full grid semantics, shipped. |
| role on the table element | None emitted. | role="grid" with 2-D keyboard navigation. |
| Keyboard handlers | Zero in the engine. | Cell focus and roving tabindex. |
| aria-rowcount / rowindex / colindex | Emitted by neither rc-table nor antd's layer. | Required — a virtualised grid without them lies about its size. |
| scope on header cells | Emitted correctly. | Same. |
| Shift-range selection | Handled by useSelection. | Same behaviour, shipped. |
| Dynamic row heights when virtualised | Measured properly, with ResizeObserver and a cache. | No improvement claimed. |
The last three rows matter as much as the first four. rc-table is careful, well-built software that was not written for a clinical grid, and the gaps above are a description of its scope rather than of its quality. Our grid ships at beta — the column names the version so the row can be checked against it.
When not to choose Oxygen.
- You want components you can upgrade with a version bump. Source is copied into your repo, so fixes arrive as a diff you take deliberately — that is the trade, and for some teams it is the wrong one.
- You need a component library for a general product. Most of Oxygen is clinical, and the parts that are not are better served by antd or MUI.
- You need a general-purpose table. Ours is built for clinical worklists — a required coverage claim, five kinds of absence, model provenance on a derived column — and it does not generalise into a reporting grid.
- You are looking for a compliance shortcut. Oxygen is not a compliance boundary and not a medical device, and using it changes nothing about your regulatory position.