Table
Table manifests describe tables bound to datasets.
They control formatting, grouping, scenarios, and optional drilldown views.
Spec outline
Section titled “Spec outline”apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_table
spec:
dataset: revenue_by_customer
filter: "region = 'DE'"
order: ac1 # category | categoryindex | rowgroup | rowgroupindex | ac1-4 | fc1-4 | pp1-4 | pl1-4 | auto
orderDirection: desc
measureScale: M
measureType: currency # volume | currency
measureUnit: "EUR"
internationalisation: "_system"
internationalisationMode: "default"
translation: "table.revenue.by_customer"
categoryWidth: w25 # w5 | w10 | w15 | w20 | w25 | w50 | inf
dataFormat: decimal # percent | decimal
dataFormatDigitsDecimal: 1
dataFormatDigitsPercent: 1
grouped: true
showGroupTitle: true
showMeasureScale: true
limit: 10
type: list # list | sum | opt | sumnototal | optnototal
sumTitle: "Total" # label of the grand-total row; only rendered for type sum | opt
scenarios: ["ac1", "py1"] # ac1-4 | fc1-4 | pp1-4 | pl1-4 | auto
variances: ["dpy1_ac1_pos"]
barColumns: [] # columns to render as inline bar charts
barColumnWidth: w10 # w5 | w10 | w15 | w20 | w25 | w30 | w40 | w60 | w80 | w100
scale: auto # "" | none | auto | 0.5 | 1.2 | …
unitScaling: 0.01 # pixels per unit for absolute variance bars
percentageScaling: 0.5 # pixels per percentage for relative variance pins
thereof: []
partof: []
columnthereof: null
interval: none # none | setname | year | quarter | month | week | day | hour | minute | second | millisecond | auto
attributes: [] # computed attribute columns (label + expression)
selectedStyle: corporate-style # name of a ComponentStyle to apply
ruleset: corporate-rules # name of a RuleSet to applyFields
Section titled “Fields”dataset– required dataset reference.filter– optional filter expression.order– sort key; using scenario names requires them to appear inscenarios. Set toautoto detect from the dataset silently. Default:category.orderDirection– sort direction (ascordesc).measureScale,measureType,measureUnit– control how measures are interpreted and displayed.categoryWidth– width of the category column (w5..w50,inf).dataFormat,dataFormatDigitsDecimal,dataFormatDigitsPercent– number formatting.grouped,showGroupTitle– group rows byrowgroupand optionally show group headers.showMeasureScale– toggle measure unit in table header.limit– maximum rows per group; extra rows are cumulated as REST.type– table type (list,sum,opt,sumnototal,optnototal). Onlysumandoptrender a grand-total row at the bottom of the table.sumTitle– label of that grand-total row. It is not a title above the table: it is the text in the category cell of the total row. Since the other table types render no total row, they ignore the value. When empty, the row is labelled with the IBCS grand-total symbol ❖.scenarios– list of scenario measures, orauto. When set toauto, scenarios are detected from the dataset silently. When left blank (and variances are also blank), they are detected with a warning.variances– list of variance definitions of the formd<scenarioB>_<scenarioA>_[pos|neg|neu].barColumns– list of column names to render as inline IBCS-compliant bar charts instead of numbers.barColumnWidth– maximum width of inline bar/pin chart columns in em (w5..w100). Default:w10.unitScaling– pixels per unit for absolute variance bars (d_ prefix columns). Default: 0.01.percentageScaling– pixels per percentage point for relative variance pins (dr_ prefix columns). Default: 0.5.scale– proportional scaling of the entire table (font size, em-based spacing, SVG bar charts, pins, patterns). All visual dimensions scale together.- not set or
""– auto-scale to fit the parent width; emits anAUTO_scalewarning with the applied factor. "none"– no scaling; render at the base font size regardless of available space."auto"– auto-scale to fit the parent width silently (no warning).- A positive number (
"0.5","1.2", …) – fixed factor applied to the base font size.
- not set or
thereof,partof,columnthereof– drilldown configuration.interval– repeats the entire scenario/variance column block once per interval group, rendered under a spanning header band. Values:none(default),setname, or a date granularity (year,quarter,month,week,day,hour,minute,second,millisecond,auto). Mutually exclusive withcolumnthereof(columnthereofwins). See Interval column grouping.attributes– computed attribute columns rendered between the category and scenario columns; ordered list of{label, expression}pairs. See Computed attribute columns.selectedStyle– optional name of aComponentStyleto apply; merged over the_systemand_defaultstyles.ruleset– optional name of aRuleSetto apply, orinherited-closest/inherited-pageto inherit the surrounding layout's rule set; merged over the_systemand_defaultrule sets.
Example: Grouped table with drilldown
Section titled “Example: Grouped table with drilldown”---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_grouped_table
spec:
dataset: revenue_detail
measureScale: M
measureType: currency
measureUnit: "EUR"
grouped: true
showGroupTitle: true
categoryWidth: w25
type: list
limit: 5
scenarios: ["ac1", "py1"]
variances: ["dpy1_ac1_pos"]
thereof:
- rowGroup: "Revenue"
category: "Applications"
subCategory: "Applications-A"
partof:
- rowGroup: "Revenue"
category: "Applications"
columnthereof:
- scenario: "ac1"
name: "DE"
subGroups: ["Berlin", "Hamburg"]Computed attribute columns
Section titled “Computed attribute columns”attributes adds custom columns computed from dataset fields, rendered between
the category column and the scenario columns. Each entry maps a column header
label to an aggregate expression evaluated over the dataset rows behind each
table row:
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_with_attributes
spec:
dataset: revenue_by_region
scenarios: ["ac1", "pp1"]
grouped: true
type: sum
attributes:
- label: "Verkaufsleiter"
expression: "set(_leiter)"
- label: "Umsatz gesamt"
expression: "sum(ac1)"The list order defines the column order. Alternatively, a raw JSON object string can be used; its key order defines the column order:
attributes: '{"Verkaufsleiter": "set(_leiter)", "Umsatz gesamt": "sum(ac1)"}'Expression functions
Section titled “Expression functions”| Function | Result |
|---|---|
set(field) | All distinct values in the group, joined with ", ". |
first(field) | Value of the first row in the group. |
last(field) | Value of the last row in the group. |
min(field), max(field) | Numeric minimum/maximum. |
avg(field), sum(field) | Numeric average/sum; respects the row operation sign. |
lit(value) | Constant value rendered in every row. |
Notes:
- Field arguments must be plain identifiers (
[A-Za-z_][A-Za-z0-9_]*): standard dataset fields (e.g.ac1) or custom fields prefixed with_(e.g._leiter). Custom fields pass through datasources and datasets as extra row columns.litaccepts any non-empty constant. - Results of
min,max,avg, andsumare formatted like scenario cells (measure scale and decimal digits); other functions render as-is. - Cells stay blank on total and group-header rows (SUM, GROUP_SUM, GROUPHEAD,
REST, PARTELEMENT). On
thereofdrill rows, aggregates are computed over the drilled subset. - Invalid entries are ignored and produce a component warning. Duplicate labels collapse (the last one wins).
- Requires template engine
v1.0.0-alpha.15or newer; older engines silently ignore the attribute.
Inline bar chart columns
Section titled “Inline bar chart columns”Render variance and scenario columns as inline IBCS-compliant bar charts using barColumns:
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_with_bars
spec:
dataset: revenue_by_segment
measureScale: M
measureUnit: "EUR"
scenarios: ["ac1", "pp1"]
variances: ["dac1_pp1_pos", "drac1_pp1_pos"]
barColumns: ["dac1_pp1_pos", "drac1_pp1_pos"]
unitScaling: 0.02
percentageScaling: 1Bar chart types
Section titled “Bar chart types”| Column prefix | Visualization | Description |
|---|---|---|
d_ (absolute variance) | Horizontal bar | Bar extends left (negative) or right (positive) from center axis. Green for positive-good, red for negative-bad. |
dr_ (relative variance) | Pin/dot chart | Thin colored line from axis with dot at end. Arrow for extreme values (>100%). Italic percentage label. |
ac, pp, fc, pl (scenarios) | IBCS grayscale bars, or an IBCS waterfall when grouping structure is present (see below) | AC: dark gray solid, PP: light gray solid, FC: dark gray hatched, PL: dark gray outlined. |
Example: Scenario columns as bar charts
Section titled “Example: Scenario columns as bar charts”---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: scenario_bars
spec:
dataset: quarterly_data
scenarios: ["ac1", "pp1", "fc1"]
barColumns: ["ac1", "pp1", "fc1"]Scenario columns as an IBCS waterfall
Section titled “Scenario columns as an IBCS waterfall”When a scenario column listed in barColumns appears on a table with grouping
structure (type: sum/opt, or thereof/partof drilldowns), it automatically
renders as an IBCS waterfall instead of plain grayscale bars: data rows cascade
from the running total and sum rows anchor at zero.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_waterfall
spec:
dataset: revenue_by_segment
grouped: true
type: sum
sumTitle: "Revenue waterfall"
scenarios: ["ac1"]
barColumns: ["ac1"]
thereof:
- rowGroup: "Revenue"
category: "Applications"
subCategory: "Applications-A"Notes:
- Waterfall columns auto-scale to fit
barColumnWidth;unitScalingdoes not apply to them (it only affectsd_-prefixed absolute variance bars). - Not supported in combination with
intervalorcolumnthereof— scenario columns on tables using either of those fall back to plain grayscale bars.
Interval column grouping
Section titled “Interval column grouping”interval repeats the entire configured scenario/variance column block once
per interval group, rendered under a spanning header band (e.g.
2023 | 2024 | 2025, each with the same columns):
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: revenue_by_year
spec:
dataset: revenue_by_year
scenarios: ["ac1"]
variances: ["dac1_pp1_pos"]
barColumns: ["dac1_pp1_pos"]
interval: yearValues:
| Value | Behaviour |
|---|---|
none (default) | Feature disabled. |
setname | Groups by the dataset's setname column (non-date comparison). Rows with a blank setname are grouped under a — bucket. Blocks are ordered by first appearance in the data. |
year, quarter, month, week, day, hour, minute, second, millisecond | Buckets rows by the dataset's date column at the given granularity. |
auto | Detects the date granularity from the dataset's date span. |
interval and columnthereof are mutually exclusive; if both are set,
columnthereof wins and interval is ignored. A date-based interval on a
dataset with no date values is likewise ignored.
Scaling
Section titled “Scaling”Use scale to shrink or grow the entire table proportionally.
Font size, em-based padding, border widths, SVG bar charts, pin lengths,
dot radii, and hatch patterns all scale together.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
name: scaled_table
spec:
dataset: revenue_by_segment
scenarios: ["ac1", "pp1"]
scale: auto # shrink to fit the available card widthScale modes
Section titled “Scale modes”| Value | Behaviour |
|---|---|
not set / "" | Auto-scale to fit the parent width. Emits an AUTO_scale warning with the applied factor. |
none | No scaling. The table renders at its base font size regardless of available space. |
auto | Auto-scale to fit the parent width silently (no warning). |
0.5, 1.2, … | Fixed factor applied to the base font size. All dimensions scale proportionally. |
Inherited props
Section titled “Inherited props”Instead of repeating scenarios, variances, order, and orderDirection on every component, you can inherit them from an ancestor LayoutPage or LayoutCard. Set any of these fields to a special keyword:
| Value | Resolves from |
|---|---|
inherited-closest | Nearest ancestor LayoutCard or LayoutPage |
inherited-page | Nearest ancestor LayoutPage only (skips cards) |
The inherited value is read from the ancestor's corresponding titleScenarios, titleVariances, titleOrder, or titleOrderDirection field. If no ancestor is found, the component falls back to its normal auto-detection logic.
children:
- kind: Table
spec:
dataset: revenue_data
grouped: true
type: sum
scenarios: inherited-page # uses page's titleScenarios
variances: inherited-page # uses page's titleVariancesSee the ChartStructure inherited props section for full examples.
Attribute Reference
Section titled “Attribute Reference”Common Metadata
Section titled “Common Metadata”| Attribute | Type | Required | Default | Description |
|---|---|---|---|---|
apiVersion | string | yes | — | Must be bino.bi/v1alpha1. |
kind | string | yes | — | Must be Table. |
metadata.name | string | yes | — | Unique identifier. |
metadata.labels | object | no | — | Key-value pairs for categorization and constraint matching. |
metadata.annotations | object | no | — | Arbitrary key-value metadata, not used by the system. |
metadata.description | string | no | — | Free-form description. |
metadata.constraints | array | no | — | Conditional inclusion rules. See Constraints. |
Spec Attributes
Section titled “Spec Attributes”| Attribute | Type | Required | Default | Description | Sample |
|---|---|---|---|---|---|
spec.dataset | string or object | yes | — | Dataset reference (name or inline definition). Provided by the withDataset mixin in the template engine. | dataset: revenue_by_customer |
spec.filter | string | no | "" | AlaSQL WHERE clause fragment to filter rows before rendering. | filter: "region = 'DE'" |
spec.order | string | no | category | Sort key. Values: category, categoryindex, rowgroup, rowgroupindex, ac1–ac4, fc1–fc4, pp1–pp4, pl1–pl4, auto, inherited-closest, inherited-page. | order: ac1 |
spec.orderDirection | string | no | asc | Sort direction. Values: asc, desc, inherited-closest, inherited-page. | orderDirection: desc |
spec.measureScale | string | no | greatest | SI prefix for measure scaling. Values: _, k, M, G, T, P, E, Z, Y, m, μ, n, p, f, a, z, y, GREATEST, LEAST. | measureScale: M |
spec.measureType | string | no | volume | Measure interpretation. Values: volume, currency. | measureType: currency |
spec.measureUnit | string | no | "" | Unit string displayed in headers. | measureUnit: "EUR" |
spec.categoryWidth | string | no | w15 | Width of the category column. Values: w5, w10, w15, w20, w25, w50, inf. | categoryWidth: w25 |
spec.dataFormat | string | no | decimal | Number formatting. Values: percent, decimal. | dataFormat: decimal |
spec.dataFormatDigitsDecimal | integer | no | 1 | Number of decimal digits in table cells. | dataFormatDigitsDecimal: 2 |
spec.dataFormatDigitsPercent | integer | no | 2 | Number of percent digits in table cells. | dataFormatDigitsPercent: 1 |
spec.grouped | boolean | no | false | Group rows by rowGroup dimension. | grouped: true |
spec.showGroupTitle | boolean | no | true | Show group header rows when grouped. | showGroupTitle: true |
spec.showMeasureScale | boolean | no | false | Toggle measure unit in table header. | showMeasureScale: true |
spec.limit | integer | no | 0 | Maximum rows per group. Extra rows are cumulated as REST. 0 means unlimited. | limit: 10 |
spec.type | string | no | list | Table type. Values: list, sum, opt, sumnototal, optnototal. Only sum and opt render a grand-total row. | type: sum |
spec.sumTitle | string | no | ❖ | Label of the grand-total row at the bottom of the table (not a title above it). Ignored by the table types that render no total row. Empty renders the IBCS grand-total symbol ❖. Maps to the sum-title HTML attribute. | sumTitle: "Total" |
spec.scenarios | string or array | no | — | Scenario measures to display. Values: ac1–ac4, fc1–fc4, pp1–pp4, pl1–pl4, auto, inherited-closest, inherited-page. | scenarios: ["ac1", "py1"] |
spec.variances | string or array | no | — | Variance definitions. Pattern: d<scenarioB>_<scenarioA>_[pos|neg|neu]. Also accepts inherited-closest or inherited-page. | variances: ["dpy1_ac1_pos"] |
spec.barColumns | string or array | no | — | Column names to render as inline IBCS-compliant bar/pin charts. | barColumns: ["dac1_pp1_pos"] |
spec.barColumnWidth | string | no | w10 | Maximum width of inline bar chart columns. Values: w5, w10, w15, w20, w25, w30, w40, w60, w80, w100. | barColumnWidth: w20 |
spec.unitScaling | number | no | 0.01 | Pixels per unit for absolute variance bars (d_ prefix columns). | unitScaling: 0.02 |
spec.percentageScaling | number | no | 0.5 | Pixels per percentage point for relative variance pins (dr_ prefix columns). | percentageScaling: 1 |
spec.scale | string or number | no | auto-scale with warning | Proportional scaling of the entire table. "" or omitted: auto-scale with warning. "none": no scaling. "auto": auto-scale silently. Positive number: fixed factor. | scale: auto |
spec.internationalisation | string | no | — | i18n namespace for the table. Maps to the internationalisation HTML attribute. | internationalisation: "_system" |
spec.internationalisationMode | string | no | — | i18n mode. Maps to the internationalisation-mode HTML attribute. | internationalisationMode: "default" |
spec.translation | string | no | — | Translation key prefix for table labels. | translation: "table.revenue" |
spec.thereof | string or array | no | [] | Drilldown rows (subCategory level). | see below |
spec.partof | string or array | no | [] | Part-of groupings (category level). | see below |
spec.columnthereof | string, array, or null | no | null | Column-level drilldown configuration. | see below |
spec.interval | string | no | none | Repeats the scenario/variance column block once per interval group. Values: none, setname, year, quarter, month, week, day, hour, minute, second, millisecond, auto. Mutually exclusive with columnthereof. See Interval column grouping. | interval: year |
spec.attributes | string or array | no | — | Computed attribute columns (header label → aggregate expression). See Computed attribute columns. | see below |
spec.selectedStyle | string | no | — | Name of a ComponentStyle manifest to apply. Merged over the _system and _default styles. Maps to the selected-style HTML attribute. | selectedStyle: corporate-style |
spec.ruleset | string | no | — | Name of a RuleSet manifest to apply, or inherited-closest / inherited-page to inherit the surrounding layout's rule set. Merged over the _system and _default rule sets. Maps to the ruleset HTML attribute. | ruleset: corporate-rules |
Thereof (drilldown rows)
Section titled “Thereof (drilldown rows)”spec:
thereof:
- rowGroup: "Revenue"
category: "Applications"
subCategory: "Applications-A"Partof (category groupings)
Section titled “Partof (category groupings)”spec:
partof:
- rowGroup: "Revenue"
category: "Applications"Columnthereof (column drilldown)
Section titled “Columnthereof (column drilldown)”spec:
columnthereof:
- scenario: "ac1"
name: "DE"
subGroups: ["Berlin", "Hamburg"]Attributes (computed columns)
Section titled “Attributes (computed columns)”spec:
attributes:
- label: "Verkaufsleiter"
expression: "set(_leiter)"
- label: "Umsatz gesamt"
expression: "sum(ac1)"