ibcs-react

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.

Contoso Group
Performance summary - € thousands
FY 2026 · Actual vs Previous year

Revenue +17.5% on PY; margin expansion lifts net income to €8.9M.

Revenue
30.1M+4.5M+17.6%vs PY
+1.6M+5.6%vs PL
Gross margin
20.4M+3.2M+18.6%vs PY
Operating income
10.4M+2.7M+35.1%vs PY
Net income
8.9M+800K+9.9%vs PY
+1.4M+18.8%vs PL
Contoso Group
Operating income bridge - € thousands
FY 2026
+30.1M-9.7M20.4M-10M10.4MRevenueCOGSGross marginOpexOp. income
Bridge of actual contributions - data table
ContributionRunning total
Revenue+30.1M30.1M
COGS-9.7M20.4M
Gross margin20.4M20.4M
Opex-10M10.4M
Op. income10.4M10.4M
Contoso Group
Revenue by region - € thousands
FY 2026 vs PY
North America12.4M+1.3M41%Europe8.9M+900K30%Asia Pacific5.6M+1.4M19%Latin America2.1M+600K7%Middle East & Af…1.1M+300K4%Total30.1M+4.5M100%
Composition versus PY - data table
ValuePYΔPYShare
North America12.4M11.1M+1.3M41%
Europe8.9M8M+900K30%
Asia Pacific5.6M4.2M+1.4M19%
Latin America2.1M1.5M+600K7%
Middle East & Africa1.1M800K+300K4%
Total30.1M25.6M+4.5M100%
Contoso Group
Revenue - € thousands
13 periods, AC/FC vs PY
ACPYPL2.3M2.4M2.6M2.5M2.6M2.7M2.7M2.8M2.9M3M3.1M3.1M3.2MP1P2P3P4P5P6P7P8P9P10P11P12P13+150K+220K+170K+60K+170K+210K+80K+170K+230K+190K+190K+170K+180K
Trend versus PY - data table
CurrentPYPLΔPYΔPY%
P12.3M2.2M2.3M+150K+7.0%
P22.4M2.2M2.4M+220K+10.0%
P32.6M2.4M2.5M+170K+7.1%
P42.5M2.4M2.5M+60K+2.5%
P52.6M2.5M2.6M+170K+6.9%
P62.7M2.5M2.6M+210K+8.4%
P72.7M2.6M2.7M+80K+3.1%
P82.8M2.6M2.7M+170K+6.5%
P92.9M2.7M2.9M+230K+8.5%
P10 (FC)3M2.8M2.9M+190K+6.8%
P11 (FC)3.1M2.9M3M+190K+6.6%
P12 (FC)3.1M3M3.1M+170K+5.8%
P13 (FC)3.2M3M3.2M+180K+6.0%
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.

Contoso Group · Sales
Revenue by region - € thousands
FY 2026 · Actual vs Previous year
Asia Pacific +33% leads growth; every region beats prior year.
Structure · share and ΔPY
North America12.4M+1.3M41%Europe8.9M+900K30%Asia Pacific5.6M+1.4M19%Latin America2.1M+600K7%Middle East & Af…1.1M+300K4%Total30.1M+4.5M100%
Composition versus PY - data table
ValuePYΔPYShare
North America12.4M11.1M+1.3M41%
Europe8.9M8M+900K30%
Asia Pacific5.6M4.2M+1.4M19%
Latin America2.1M1.5M+600K7%
Middle East & Africa1.1M800K+300K4%
Total30.1M25.6M+4.5M100%
Small multiples · quarterly ΔPY
North America+300KQ1+400KQ2+300KQ3+300KQ4
Europe+200KQ1+200KQ2+300KQ3+200KQ4
Asia Pacific+300KQ1+400KQ2+300KQ3+400KQ4
Rest of world+200KQ1+200KQ2+200KQ3+300KQ4
Variance versus PY - data table
ACPYΔPY
North America - Q12.9M2.6M+300K
North America - Q23.1M2.7M+400K
North America - Q33.2M2.9M+300K
North America - Q43.2M2.9M+300K
Europe - Q12.1M1.9M+200K
Europe - Q22.2M2M+200K
Europe - Q32.3M2M+300K
Europe - Q42.3M2.1M+200K
Asia Pacific - Q11.3M1M+300K
Asia Pacific - Q21.4M1M+400K
Asia Pacific - Q31.4M1.1M+300K
Asia Pacific - Q41.5M1.1M+400K
Rest of world - Q1700K500K+200K
Rest of world - Q2800K600K+200K
Rest of world - Q3800K600K+200K
Rest of world - Q4900K600K+300K
Detail · revenue, variance and trend
 Trend
North America
12.4M
+1.3M+11.7
Europe
8.9M
+900K+11.3
Asia Pacific
5.6M
+1.4M+33.3
Rest of world
3.2M
+900K+39.1
Total
30.1M
+4.5M+17.6
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.

Contoso Group · Finance
Financial statements - € thousands
FY 2026 · Actual vs Previous year and Plan
Net income €8.9M, +10% on PY; balance sheet grows to €37.0M.
Income statement · flow (waterfall)
 PYACΔPYΔPY%
Product revenue16.1M17.2M+1.1M+6.8
Service and other revenue9.5M12.9M+3.4M+35.8
=Revenue25.6M30.1M+4.5M+17.6
−Product cost3.1M3.5M+400K+12.9
−Service and other costs5.3M6.2M+900K+17.0
=Gross margin17.2M20.4M+3.2M+18.6
−Research and development3.5M3.9M+400K+11.4
−Sales and marketing4.3M4.8M+500K+11.6
−General and administrative1.4M1.3M-100K-7.1
−Restructuring306K0-306K-100.0
=Operating income7.7M10.4M+2.7M+35.2
Other income, net276K301K+25K+9.1
=Income before income taxes8M10.7M+2.7M+34.3
−Provision for income taxes-111K1.8M+1.9M+1,721.6
=Net income8.1M8.9M+820K+10.1
Balance sheet · stock (levels)
 PYACΔPYΔPY%
Current assets14.8M16.7M+1.9M+12.8
Cash and equivalents6.5M8.2M+1.7M+26.2
Accounts receivable4.9M5.4M+500K+10.2
Inventory3.4M3.1M-300K-8.8
Non-current assets19.2M20.3M+1.1M+5.7
=Total assets34M37M+3M+8.8
Current liabilities6.6M6.6M00.0
Accounts payable3.6M4.1M+500K+13.9
Short-term debt3M2.5M-500K-16.7
Non-current liabilities10.7M10.4M-300K-2.8
Long-term debt9.5M9M-500K-5.3
Deferred tax & other1.2M1.4M+200K+16.7
=Total liabilities17.3M17M-300K-1.7
Shareholders’ equity16.7M20M+3.3M+19.8
Share capital5M5M00.0
Budget · revenue by quarter, Actual vs Plan
 
Q1
6.8M
6.5M
+300K+4.6
Q2
7.3M
7M
+300K+4.3
Q3
7.6M
7.4M
+200K+2.7
Q4
8.4M
7.6M
+800K+10.5
Full year
30.1M
28.5M
+1.6M+5.6
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

ibcs-react is an independent open-source library and is not affiliated with, certified by, or endorsed by the IBCS Association or ISO. It follows the IBCS® notation rules (the basis of ISO 24896); IBCS® is a registered trademark of the IBCS Association.

On this page