Examples
Three complete dashboards - an executive overview, a sales review and a finance pack - assembled entirely from ibcs-react components.
Three complete dashboards, each assembled entirely from library components and driven by the shared sample model (AC / PY / PL / FC). They show how the building blocks - KPI cards, charts, statements and tables - compose into a finished report in the IBCS notation. Each one is contained: it scrolls inside its frame, and the grids stack to a single column on narrow screens.
Executive overview
A one-glance summary built from a single ReportConfig handed to Report: a
four-card KPI strip, an operating-income waterfall, a revenue-by-region
structure chart and a 13-period trend, laid out on the responsive
12-column report grid.
Revenue +17.5% on PY; margin expansion lifts net income to €8.9M.
import { Report, type ReportConfig } from "ibcs-react";
import { sampleMonthlyTrend, sampleRevenueStructure } from "./sample-data";
// Sparkline series from the actual periods of the trend.
const acTrend = sampleMonthlyTrend.filter((d) => d.AC != null).map((d) => d.AC as number);
const executiveConfig: ReportConfig = {
title: {
who: "Contoso Group",
what: "Performance summary - € thousands",
when: "FY 2026 · Actual vs Previous year",
},
message: "Revenue +17.5% on PY; margin expansion lifts net income to €8.9M.",
columns: 12,
blocks: [
{
id: "k-rev",
type: "kpi",
span: 3,
config: {
label: "Revenue",
values: { AC: 30_100_000, PY: 25_600_000, PL: 28_500_000 },
comparisons: ["PY", "PL"],
format: { compact: true, decimals: 1 },
sparkline: acTrend,
},
},
// …three more KPI blocks: gross margin, operating income, net income
{
id: "ex-bridge",
type: "chart",
span: 7,
title: { who: "Contoso Group", what: "Operating income bridge", when: "FY 2026" },
config: {
type: "waterfall",
data: [
{ category: "Revenue", value: 30_100_000, flow: "add" },
{ category: "COGS", value: 9_700_000, flow: "subtract", higherIsBetter: false },
{ category: "Gross margin", value: 20_400_000, flow: "result" },
{ category: "Opex", value: 10_000_000, flow: "subtract", higherIsBetter: false },
{ category: "Op. income", value: 10_400_000, flow: "result" },
],
width: 460,
height: 280,
format: { compact: true, decimals: 1 },
},
},
{
id: "ex-structure",
type: "chart",
span: 5,
config: { type: "structure", data: sampleRevenueStructure, width: 360, height: 280 },
},
{
id: "ex-trend",
type: "chart",
span: 12,
config: { type: "trend", data: sampleMonthlyTrend, width: 820, height: 260 },
},
],
};
<Report config={executiveConfig} />;Components: Report · KpiCard · WaterfallChart · StructureChart · TrendChart
Sales performance
A revenue team's regional review, hand-laid on a responsive grid: a ranked structure chart, per-region quarterly small multiples, and a sortable table with embedded variance bars, pins and a trend sparkline.
| Trend | ||||
|---|---|---|---|---|
| North America | 12.4M | |||
| Europe | 8.9M | |||
| Asia Pacific | 5.6M | |||
| Rest of world | 3.2M | |||
| Total | 30.1M |
import { StructureChart, MiniVarianceMultiples, DataTable } from "ibcs-react";
import { sampleRevenueStructure } from "./sample-data";
const regionMultiples = [
{
label: "North America",
data: [
{ category: "Q1", AC: 2.9e6, PY: 2.6e6 },
{ category: "Q2", AC: 3.1e6, PY: 2.7e6 },
{ category: "Q3", AC: 3.2e6, PY: 2.9e6 },
{ category: "Q4", AC: 3.2e6, PY: 2.9e6 },
],
},
// …Europe, Asia Pacific, Rest of world
];
const salesColumns = [
{ key: "rev", label: "Revenue AC", kind: "value" as const },
{
key: "rev_dpy",
label: "ΔPY",
kind: "variance" as const,
measure: "rev",
base: "PY" as const,
mode: "abs" as const,
mark: "bar" as const,
},
{
key: "rev_dpy_pct",
label: "ΔPY %",
kind: "variance" as const,
measure: "rev",
base: "PY" as const,
mode: "pct" as const,
mark: "pin" as const,
},
{
key: "trend",
label: "Trend",
kind: "sparkline" as const,
measure: "rev",
sparkType: "line" as const,
},
];
const salesRows = [
{
id: "na",
label: "North America",
values: { rev: { AC: 12_400_000, PY: 11_100_000 } },
spark: { rev: [2.6e6, 2.7e6, 2.9e6, 3.1e6, 3.2e6, 3.2e6] },
},
// …one row per region
];
// Panel chrome omitted for brevity.
<div style={{ display: "flex", flexDirection: "column", gap: 18 }}>
<StructureChart data={sampleRevenueStructure} comparison="PY" width={380} height={280} />
<MiniVarianceMultiples groups={regionMultiples} comparison="PY" columns={2} />
<DataTable
columns={salesColumns}
rows={salesRows}
format={{ compact: true, decimals: 1 }}
showTotals
totalsLabel="Total"
defaultSort={{ key: "rev", dir: "desc" }}
/>
</div>;Components: StructureChart · MiniVarianceMultiples · DataTable
Financial statements
The finance pack: a waterfall income statement and a stock-mode balance
sheet side by side, each scrolling internally, plus a budget table of revenue
by quarter, Actual against Plan. All three are the same StatementTable and
DataTable primitives over the shared model.
| PY | AC | ΔPY | ΔPY% | |
|---|---|---|---|---|
| 16.1M | ||||
| 9.5M | ||||
| = | 25.6M | |||
| − | 3.1M | |||
| − | 5.3M | |||
| = | 17.2M | |||
| − | 3.5M | |||
| − | 4.3M | |||
| − | 1.4M | |||
| − | 306K | |||
| = | 7.7M | |||
| 276K | ||||
| = | 8M | |||
| − | -111K | |||
| = | 8.1M |
| PY | AC | ΔPY | ΔPY% | |
|---|---|---|---|---|
| 14.8M | ||||
| 6.5M | ||||
| 4.9M | ||||
| 3.4M | ||||
| 19.2M | ||||
| = | 34M | |||
| 6.6M | ||||
| 3.6M | ||||
| 3M | ||||
| 10.7M | ||||
| 9.5M | ||||
| 1.2M | ||||
| = | 17.3M | |||
| 16.7M | ||||
| 5M |
| Q1 | 6.8M | 6.5M | ||
|---|---|---|---|---|
| Q2 | 7.3M | 7M | ||
| Q3 | 7.6M | 7.4M | ||
| Q4 | 8.4M | 7.6M | ||
| Full year | 30.1M | 28.5M |
import { StatementTable, DataTable } from "ibcs-react";
import { sampleStatementFlat, sampleBalanceSheet, sampleQuarterlyStatement } from "./sample-data";
const budgetColumns = [
{ key: "rev", label: "Actual", kind: "value" as const },
{ key: "rev_pl", label: "Plan", kind: "value" as const, measure: "rev", scenario: "PL" as const },
{
key: "rev_dpl",
label: "ΔPL",
kind: "variance" as const,
measure: "rev",
base: "PL" as const,
mode: "abs" as const,
mark: "bar" as const,
},
{
key: "rev_dpl_pct",
label: "ΔPL %",
kind: "variance" as const,
measure: "rev",
base: "PL" as const,
mode: "pct" as const,
mark: "pin" as const,
},
];
const budgetRows = sampleQuarterlyStatement
.filter((l) => l.flow !== "result")
.map((l) => ({
id: l.id,
label: l.label,
values: { rev: { AC: l.values.AC, PL: l.values.PL } },
}));
// Panel chrome omitted for brevity.
<div style={{ display: "flex", flexDirection: "column", gap: 18 }}>
<StatementTable lines={sampleStatementFlat} waterfallWidth={170} maxHeight={300} />
<StatementTable lines={sampleBalanceSheet} mode="stock" waterfallWidth={150} maxHeight={300} />
<DataTable
columns={budgetColumns}
rows={budgetRows}
format={{ compact: true, decimals: 1 }}
showTotals
totalsLabel="Full year"
/>
</div>;Components: StatementTable · DataTable
One model, many reports
Nothing here reshapes data per view - the same scenario-keyed figures feed
cards, charts, statements and tables alike. Swap the tokens prop on a
Report and every block re-themes at once.
Where to next
- Report - the config-driven layout used above, and the live report demo.
- IBCS templates and Table templates - the individual layouts these dashboards are built from.
- Theming - one
tokensprop re-themes a whole report.
Dashboards
Seven full management dashboards - KPI strip, charts and a table each - assembled entirely from ibcs-react components in IBCS notation.
Budget matrix
A budget and control statement crossed two ways - a P&L row hierarchy against an expanding period column tree, with Plan / Actual / Forecast sub-columns and a signed ΔBudget.