Reporting tools accumulate.
Every new requirement adds a chart. Without a shared vocabulary, each is designed from scratch, and five charts end up showing the same idea five different ways.
Users then re-learn the page on every visit — a cost nobody measures and everyone pays.
Design the parts, not the reports
If the pieces are right, every future report composes correctly without a designer in the room.
A component set with defined use cases rather than a set of finished pages.
Chart types, axis and label rules, empty and loading states, and explicit guidance on when a number should be a figure rather than a chart.
Charts defined by use case
The choice is made once, not per screen.
Each chart type is documented against what it is for, so selecting one is a lookup rather than a judgement call.
States included from the start
Empty, loading and error are part of the component.
These are the states that get invented inconsistently when they are left undefined, and they are what users see most often on slow data.
New views compose from existing parts.
Consistency stopped depending on review, which is the only way it survives a backlog.