The Report Studio — a library, and one renderer for every report

Featurekamo-internal
Shipped
September 2, 2026 at 4:27 AM UTC
Author
Kamo
Commit
ff03eab

/reports is a shelf, not a card grid: two hundred identical rounded boxes is a wall to scan, and a row gives a report's name room to be read. Saved views nest under the report they belong to, which is what teaches the distinction the whole subsystem rests on — there is no "New report" control anywhere, because a report is a Java class and what a member saves here is a configuration of one. The studio is three bands: what you are asking, one sentence saying what is on screen, and the answer. The middle band is load-bearing. A report screen fails when somebody can see figures and cannot say what they are figures OF, and every question in that category — how many rows, over what period, narrowed how, and covering how much of the organization — fits in a sentence. The data-scope note sits there verbatim, because a total produced under "your own records only" is a different document and nothing else on screen distinguishes them. Nothing in app/components/reports asks which report it is rendering. visibleStudioControls reads a definition's declared capabilities and draws the matching controls; ParameterControl dispatches on a parameter's type; every cell renders through its column's ReportFormat descriptor. A KPI-only report gets a period and a Run button and nothing else, without a line of code that knows it exists — and the day this stops being true, adding a report stops being a Java change. formatters.ts is the one place a value becomes a string, and its Java twin reads the same descriptor, so a figure on screen and the figure in a downloaded PDF cannot disagree. Dates go through app/lib/serverTime.ts rather than a second parser: Java writes LocalDateTime with no offset and a browser reads that as local time, which is hours out. The chart palette is fixed hex, not derived from --color-primary. Every other colour here is a tint of the organization's brand, which is right for chrome and wrong for a chart — a pale white-label primary would give a series palette nobody could tell apart. The order was searched for and validated rather than eyeballed: all eight pass the lightness band, chroma floor, CVD separation, normal-vision floor and contrast checks on this app's light surface, which is the only surface it has. --report-* follows the --legal-* and --training-* pattern exactly, and its seal is --accent-work, which the Instrument Panel palette already names as the accent for "tasks, calendar, reports". Reports takes its place in the nav, the AppType mirror, the Organization flags and the permission tree. Its five rights are ungrantable without that last one.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing