demos
Every feature, running.
219 demos, one feature each, and every one is the real product generating its data in your browser from a fixed seed, so sorting, filtering and editing all do what they would do in your application. Nothing here is a video or a screenshot.
Start here
Eight demos worth your first five minutes. The rest are below, by feature.
-
Dashboards
One filter moves the whole dashboard
Top reps, best-selling lines and headline figures, all built from one grid - filter it and every panel follows.
-
Live data
A trading book that moves
Currency formatting, a running P&L, live rankings and a streaming price feed - one dense grid doing a desk’s work.
-
Statistics
Process capability, built in
Cp, Cpk, Pp and Ppk from a single column, ready for a quality report without dropping into a spreadsheet.
-
Formatting
Rules that read the data
Highlight the outliers or the top tenth without naming a number - you describe it, the data sets the line.
-
Performance
A million rows, still smooth
Load a million rows and scroll them, timed live on your own machine, with no pages and no server behind it.
-
Editing
Edit right in the grid
Twenty editors on one screen - date, duration, colour, rating, slider - so input lives in the table, not a form.
-
Rendering
Made to look modern
Sparklines, data bars, bullets and gauges - every built-in renderer, each drawing a column of its own.
-
Extensibility
Extend it to your own data
Give the grid a type of your own - how it stores, sorts, formats and edits - so it speaks your domain, not just text and numbers.
Then these
- A production line A capability figure, an out-of-tolerance list and a live measurement profile, all from one batch.
- Chaining, three levels deep Sales, then revenue per rep, then the top three - three grids, and one filter moves all of them.
- Sankey, chord and network Relationships between categories, drawn straight from the grid’s rows.
- A unit family of your own Register a unit family from its symbols and factors, then format cells in it.
- The statistics panel The full column profile as a docked panel that follows the filters.
- Locales, and it mirrors The same grid in English, Japanese and Arabic - which lays it out right to left.
Every demo, by feature
Getting started
The first ninety seconds. Each of these is readable in full without scrolling the code.
-
D01
Hello grid
A working grid in ten lines, no build step and no dependencies
createGrid(el, { columns, rows }) -
D02
One million rows
Load a million rows and scroll them, timed on your machine
rows: 1_000_000 -
D03
Thirty columns, thirty types
The realistic wide grid: text, numbers, dates, booleans, all at once
columns: [{ type: … }] -
D04
Sizing and layout
Filling a container, fixed height, auto height, and resizing
autoHeight -
D05
Column defaults and presets
Declaring shared column behaviour once, used by six columns
columnDefaults · columnPresets -
D06
Loading data after the grid exists
An empty grid that fills from a fetch, with the loading state between
rows.load(data) -
D07
Type inference
Undeclared columns that still sort the way you would expect
default comparator
Modern SaaS UI
The same grid dressed as the product screens it ends up inside, styled through the theme's own tokens rather than against them.
-
D220
Open positions board
A recruitment dashboard screen: a progress bar, a status pill and a templated kebab, on a card
render: 'progress' · 'pill' · cell.template -
D221
Recent candidates
A candidate list: circular avatar, name over email, a stage pill and two action buttons
render: 'image' · 'twoline' · 'pill' · cell.template
Columns
Structure and geometry. Several of these are the reason to choose a grid over a table.
-
D08
Column groups
Nested headers, collapsible, deciding which children survive a collapse
columnGroups · showWhen -
D09
Pinned columns
Left and right pinned regions scrolling independently
layout: { pin: 'start' | 'end' } -
D10
Resize, including the neighbour
Drag a grip; shift-drag to take the width from the column beside it
resizePreview: 'live' | 'deferred' -
D11
Reorder by drag
Moving columns, constrained to their group and pinned region
columns.move(id, index) -
D12
Show, hide and the tool panel
The visibility list, and what generated columns keep out of it
columns.show / hide -
D13
Two hundred columns
Body cells exist only for the columns in the horizontal window
columnVirtualisationAbove -
D14
Auto-size and fit
Size a column to its content, or fit every column to the viewport
columns.autoSize() · columns.fit() -
D15
Column spanning
A cell covering several columns, in its own layer so recycling cannot clip it
cell.spanColumns -
D16
Row spanning
The same in the other axis, with a bounded scroll frame
cell.spanRows -
D17
Custom headers
A header rendering a sparkline, a filter chip or a unit toggle
column.header.render -
D18
Alignment
Left, right and centre, and why numbers default the way they do
align: 'left' | 'right' | 'center' -
D19
Lock position
Columns that cannot be moved, or that always lead the row
layout.lockPosition -
D155
Column tags
Tag columns, then show only the ones carrying a chosen tag
columnTagFilter · column.tags -
D156
Aligned grids
A summary band whose columns stay locked to the detail grid
alignedGrids: [grid]
Types and formatting
A type is not a label. It is storage, comparison, parsing, formatting and an editor.
-
D20
The built-in types
text, number, date, boolean, lookup, object, image, one column each
type: 'number' | 'date' | … -
D21
Numbers and currency
Precision, grouping, negatives in parentheses, currency by locale
format: 'currency:GBP:2' -
D22
Dates, times and zones
The same instant in four time zones
timeZone -
D23
Durations
Elapsed time that sorts numerically and reads as 3h 12m
type: 'duration' -
D24
Units
Bytes, distances and rates, parsed in the unit the user typed
createUnitType() -
D25
Hex, binary and octal
A register dump: one value in four radixes, editable in any
createRadixType({ radix: 16 }) -
D26
IP addresses and CIDR
IPv4, IPv6 and subnets that sort correctly
type: 'ipv4' | 'ipv6' | 'cidr' -
D27
JSON and structured values
A nested object in a cell, summarised inline and expandable
type: 'json' -
D28
Lookups
Storing an id and showing a label, sorting by the label
lookup: { options } -
D29
Multi-value cells
Tags in one cell, with containsAny and containsAll filtering
multiple: true -
D30
Computed columns
A column derived from others, recomputed only when its inputs move
value: { deps, compute } -
D31
Pure versus impure computations
Why one is cached and offloadable and the other is not
value.pure -
D207
Every type
A column per type, from every group, each sorting on its value not its text
type: 'voltage' · 'bytes' · 'ipv4' · … -
D208
Configuring a type
One field, five presentations; the stored value never changes
createUnitType({ display, decimals, … }) -
D209
A unit family of your own
Register a unit system from symbols and their factors
registerUnitSystem · createUnitType -
D217
A type of your own
A part number, AB-1234-X, in five functions: matches, parse, format, compare
dataTypes: { partNumber: { base, matches, parse, format, compare } }
Cell rendering
Twenty-four built-in renderers. Visual first, explanatory second.
-
D32
The renderer gallery
Every built-in renderer in one grid, each in its own column
cell: { render: … } -
D33
Pills and variants
Status chips across the six semantic variants, in every theme
decoration: 'pill' · variant.map -
D34
Progress and bullet
Completion against a target, with a threshold marker
render: 'progress' | 'bullet' -
D35
Sparklines
Line, area and column charts inside a cell
render: 'line' | 'area' | 'column' -
D36
Win-loss, gauge, range
The compact chart set for KPI grids
render: 'winloss' | 'gauge' | 'range' -
D37
Pie and donut in a cell
Composition per row, at 24 pixels, still legible
render: 'pie' | 'donut' -
D38
Stacked bars
Several series in one cell, sharing a scale across the column
render: 'stacked' -
D39
Delta indicators
Change since last value, with direction and colour, on a live feed
render: 'delta' -
D40
Ratings, colours and icons
Interactive stars, colour swatches and value-mapped icon sets
render: 'rating' | 'colour' | 'icon' -
D41
Images, avatars and QR codes
Media in cells, including a QR generated with no dependency
type: 'image' · render: 'qrcode' -
D42
Two-line cells
A primary value with a caption beneath, at full row density
render: 'twoline' -
D43
Skeleton loading
What a remote source looks like while a block is in flight
render: 'skeleton' -
D44
Templates and your own renderer
The template compiler, then a custom renderer when it is not enough
cell.template · config.components -
D138
HTML in cells, safely
Templates escape by default; the opt-out and what it opens up
allowUnsafeTemplates: true -
D154
Cards, lists and feeds
Draw each row as a card instead of dividing it into columns
rowTemplate
Conditional formatting
Rules as live state rather than a compile step, editable on the page.
-
D45
Rules from configuration
Colouring cells by value, seeded at build time
formatting: { col: [{ when, style }] } -
D46
The formatting panel
A user building their own rules at runtime, undoable and saved
grid.formatting.add() -
D47
Colour scales
A heat map across a numeric column, between bounds you declare
formatting scale rules -
D48
Row class and row style
Styling whole rows from the record, and how it survives recycling
rowClass · rowStyle -
D49
Change highlighting
Flashing a cell when its value moves
grid.highlight.cell() -
D188
Rules that describe the data
The outliers, found in the data, beside a threshold you typed
when: { op: 'outlier' } -
D189
Quantile colour scales
A scale that ignores the outlier flattening it
scale: { from: 'quantile' }
Sorting
Where it runs and what it costs, with real numbers.
-
D50
Single and multi-column
Click, shift-click, and the order index that appears when it means something
sort.set([{ col, dir }]) -
D51
Locale collation
Sorting names in Swedish, German and Turkish
locale · type.compare -
D52
Custom comparators
Sorting by priority words, versions, or a domain rule
value.compare -
D53
Sort at a million rows
Timed on the page, and honest about where it runs
measured, main thread
Filtering
One filter model behind every control, which is the point worth making.
-
D54
The filter menu
Per-column filtering with the operators each type supports
filters.set(tree) -
D55
Set filters
Checkbox lists over distinct values, on a dictionary-encoded column
filter: 'set' -
D56
Ranges and relative dates
Between, before, after, and "last 30 days" that stays relative
op: 'between' -
D57
Quick filter, four ways
contains, words, fuzzy and regex over the same box
filters.quick(text, { mode }) -
D58
Header histograms
A distribution in every heading that is also the filter control
facets: { enabled: true } -
D59
Cross-filtering, done properly
Why a column is never counted against its own filter
pruneColumn() -
D60
Facets for a server source
Supplying counts from an API when the grid holds one page
facets.provider -
D61
The advanced filter builder
Nested and/or/not groups against the same tree the menus produce
FilterSet -
D62
An application-level filter
A host predicate composed with the grid’s own, for permissions
hostFilter: { active, passes } -
D63
Filters in saved views
Round-tripping a filter model, including relative dates
state.get() / state.apply()
Grouping, totals and pivot
Reducing many rows to the few numbers someone asked for.
-
D64
Grouping
One level, then several, surviving sort, filter and reload
columns.group(['region']) -
D65
Group footers
A closing total per group
groupFooter: true -
D66
The grand total row
Inline at the end, or pinned above the status bar
grandTotalRow: 'bottom' -
D67
The aggregations
sum, avg, min, max, count, countValues, first, last, one column each
total: 'sum' -
D68
Your own total function
A weighted mean or a median, and why it re-reduces
total: (values, ctx) => … -
D69
Totals that keep up
A live feed against a million rows with a totals row, timed
incremental grand totals -
D70
Totals of the view or the data
The same grid filtered, totals answering each question in turn
totalFilteredOnly: false -
D71
Only what changed
Reducing only the columns an update touched
totalOnlyChangedColumns: true -
D72
Pivot
Transposing values across distinct keys, with a column guard
columns.pivot(['status']) -
D73
Pivot with several value columns
Generated column groups, and what the headings do
pivot.groupTotals
Tree data and master-detail
Hierarchies and detail rows, including the awkward cases rather than only the tidy one.
-
D74
Tree data
A hierarchy from a parent reference
tree: { parentKey: 'parentId' } -
D75
Hierarchy from a path
Rows carrying their own ancestry, missing levels synthesised
tree: { path } -
D76
Orphans and cycles
Data that is not quite a tree. Nothing is dropped
orphans: 'Unassigned' -
D77
A large tree
Fifty thousand nodes, ten deep, a collapsed branch costing nothing
virtualised tree -
D78
Master-detail
A row expanding into a nested grid, several open at once
detail: { rows, config } -
D79
A detail pane beside the list
The detail renders into your own element, one record at a time
detail: { target: '#pane' } -
D80
An editable detail
Editing inside the nested grid, reported on the master
detail:cell:changed -
D81
Lazy children
Fetching a branch on expand, with an abort when it closes first
tree.loadChildren
Selection and editing
An unusually broad editor set, and what happens when a write is refused.
-
D82
Row selection
Single and multiple row selection, visible in the grid and on the row
selection: 'multiple' -
D83
Checkboxes and select-all
A pinned checkbox column with a tri-state header
selection: { checkbox, headerCheckbox } -
D84
Cell ranges
Dragging a block, ctrl-clicking a second, and a summary of it
selection.setRange() -
D85
The fill handle
Dragging a corner to extend a series it recognises
fillHandle · detectSeries() -
D86
Clipboard
Copy and paste against Excel and Sheets
clipboard interop -
D87
Inline editing
Double-click, type, Tab, Enter, Escape, and clicking away
edit: { enabled: true } -
D88
The editor gallery
Twenty editors in one grid: date, duration, colour, rating, slider
editors/* -
D89
Validation
Refusing a value, showing why, keeping the editor open
edit.validate -
D90
Row editing
Editing a whole row as one transaction
edit: { mode: 'row' } -
D91
Optimistic writes
The server disagrees, and the cell reverts with an explanation
edit: { commit, confirm } -
D92
Undo and redo
A history stack over edits, fills and pastes
grid.history -
D93
Read-only and per-cell rules
Columns that never edit, and cells that depend on the record
edit.enabled: (row) => … -
D94
Bulk edits
Writing a value across a range, and what one undo then means
edit.setCells() -
D128
Formula entry
A spreadsheet formula typed into a cell, and the evaluator reach limit
formulaFunctions -
D151
Editing a row on a form
Double-click a row to edit it in a drawer, one control per field
rowForm: { fields } -
D218
The form, four ways
The same row form as a drawer, a dialog, an inline region and a curated set
rowForm: { mode: 'drawer' · 'dialog', container } -
D152
Row reorder
Drag a handle to move rows, and persist the new order
rowReorder: true -
D153
Moving rows between grids
Drag a row out of one grid and into another
rowTransfer: { group }
Sources and live data
Four source modes with genuinely different contracts.
-
D95
The memory source
Everything resident, and the columnarisation threshold
source: { mode: 'memory' } -
D96
Paged
A page at a time from a server that paginates
source: { mode: 'paged' } -
D97
Remote, with the server doing the work
Blocks fetched as you scroll, sort and filter pushed to the API
source: { mode: 'remote' } -
D229
Pushdown to a live OData service
A grid over the public Northwind service; filter and sort are pushed to it, and lastPlan shows the split
createPushdownSource · odataAdapter · lastPlan() -
D231
A million rows in DuckDB, no server
A full analytical engine behind the grid, querying a Parquet file in the browser, with the generated SQL and timing on screen
createPushdownSource · duckdbAdapter -
D98
Streaming
Rows arriving over time, first paint on the first chunk
source: { mode: 'stream' } -
D99
A bounded window
A never-ending feed as a sliding window
source.maxRows -
D100
Ten thousand updates a second
A trading-desk feed with the frame budget on screen
grid.updates.stats() -
D101
Holding the feed
Pausing incoming data deliberately, with the backlog counted
grid.updates.pause() -
D102
Scrubbing back through time
Drag back and watch the grid, and the charts, run backwards
grid.timeline -
D103
The transaction API
Batching adds, updates and removes into one applied change
rows.apply({ add, update, remove }) -
D104
Row identity
Why rowKey matters, and the features that switch off without it
rowKey
Collaboration and governance
What happens when more than one person is looking at the same grid.
-
D105
Collaborative presence
Two windows, two cursors, live selections and edits
grid.presence -
D106
Advisory locking
A peer holding a cell, and what happens if you edit it anyway
presence lock -
D107
Cell comments
Threaded discussion on a cell, with an unresolved count
grid.comments -
D108
Permissions
Column-level visibility and edit rights against a user context
permissions · context -
D109
Redaction
Masking values a viewer must not see
grid.redaction -
D110
Diagnostics and devtools
Frame times, stage rebuilds, store layout, warnings
grid.diagnostics -
D127
Diff and audit mode
Before and after against a baseline, computed only when asked
config.diff · grid.diff
Theming and accessibility
The pages where the theme itself is the subject.
-
D111
Four themes, one grid
Light, dark, high contrast and terminal, switched live
theme: 'high-contrast' -
D112
High contrast, and why it is not just dark
Borders at 6.1:1 against 1.3:1, and drawn cell edges
WCAG 1.4.11 -
D113
Terminal
A phosphor console: one hue, monospaced, status by brightness
theme: 'terminal' -
D114
Your own theme
Overriding tokens rather than rules
--lattice-* tokens -
D115
Density
compact through spacious, with the row height following the token
density: 'comfortable' -
D116
Keyboard only
The whole grid driven without a mouse, keys shown as pressed
one tab stop · roving focus -
D117
Screen reader
What the grid announces, and the ARIA it writes
aria-rowindex · aria-selected -
D132
prefers-reduced-motion
Every animation the grid drops when the viewer asks for less
@media (prefers-reduced-motion: reduce) -
D157
Translating the grid
Every string the grid renders, from a message catalogue
messages · FR_FR -
D219
Locales, and it mirrors
The same grid in English, Japanese and Arabic, which sets the grid right to left
locale · direction: 'rtl'
Export and integration
The last mile, which decides whether a grid gets adopted inside an existing app.
-
D118
CSV export
Delimiters, quoting, which rows, and per-cell processing
export.csv() -
D119
Excel export
A styled .xlsx with frozen panes, written with no dependency
export.excel() -
D120
Printing
Virtualisation off for the print pass, then restored
print mode -
D123
A web component
<lattice-grid> in a page with no framework at all
customElements -
D124
Saved views
Naming a configuration and switching between them
grid.views -
D159
htmx integration
A plain server-rendered table, upgraded to a live grid in place
hydrateTable(table, { licence }) -
D160
Coming from dhtmlx Grid
The dhtmlx Grid API, unchanged, on a Lattice grid underneath
new Grid(el, { columns, data }) -
D161
Grid state in a URL
Sort, filter and reorder, then share the whole arrangement as a short link
serialiseState() · restoreState() -
D141
Licence and the trial watermark
What an unlicensed grid does, and the loopback exemption
config.licence · grid.licence
Rows and layout
What a row is, how tall it is, and what sits outside the scrolling body.
-
D131
Auto row height
Wrapped text measured per row, and the ceiling where it degrades
autoHeight: true | 'visible' -
D143
Pinned columns and scroll extent
A centre column stays reachable behind a pinned region
pinned regions · horizontal extent -
D145
The row types
Leaf, group, footer, grand total, detail, synthesised and pinned, in one grid
Row.group · detail · grandTotal -
D146
Pinned rows
A grand total pinned below the scrolling body
grandTotalRow: 'bottom' -
D150
Row height per row
Height as a function of the row, and what that costs
rowHeight: (row) => number -
D158
Full-width rows
A row drawn as one band across every column, for section banners
fullWidth: { when, render }
Chrome and menus
The controls around the grid, and the rules behind what each one offers.
-
D130
Header context menu
Right-click a heading. The menu, not the rendering
header:contextmenu -
D133
The action rail
The grouped control rail down the edge of the grid
tool panel dock · rail actions -
D134
Type a page to jump to it
The pager interaction, not the paged source
pagination -
D137
Maximise
Full-screen a grid and come back to the same scroll and selection
grid.maximise -
D139
The cell context menu
An item that writes is never offered on a cell that cannot be written
cell:contextmenu -
D140
Host menu items and rail actions
Adding your own items to the grid menus from the application
menu extension -
D142
N of M rows
Three counts that are not interchangeable, and which one is shown
rows.count() · matchCount() · totalCount()
Presenting
Showing a grid to a room rather than to one person at a desk.
Automation and AI
A model proposing a change, and the grid validating it before anything is applied.
Charts
Thirty-five chart types drawn from the grid's own filtered rows, redrawing as it moves.
-
D162
Your first chart
A chart from the grid's own data in six lines
createChart({ grid, container, type, x, y }) -
D163
Line, area, bar and scatter
The cartesian types, one dataset
type: 'line' · 'step' · 'area' · 'bar' · 'combo' · 'pareto' -
D164
Histogram and box plot
The distribution of a single column
type: 'histogram' · 'boxplot' · 'violin' -
D165
Pie, donut, sunburst, treemap
Composition, flat and hierarchical
type: 'pie' · 'donut' · 'sunburst' · 'treemap' -
D166
Sankey, chord and network
Relationships between categories
type, source, target, y -
D167
Gauge, funnel and radar
The specialist types and what each is for
type: 'gauge' · 'funnel' · 'radar' -
D168
Waterfall, stream, marimekko
Sequence and composition across categories
type: 'waterfall' · 'stream' · 'marimekko' -
D169
Values on a map
Continents and countries from ISO codes
type: 'geomap', code, y -
D214
Candlestick
Open, high, low and close, one row a day
type: 'candlestick', measures: [open, high, low, close] -
D215
Gantt
A row label with a start and an end, coloured by phase
type: 'gantt', label, start, end -
D216
Heatmap
A measure at the crossing of two categories
type: 'heatmap', x, series, y -
D170
Charts follow the grid
Filter, sort or edit the grid and every chart bound to it redraws
createChart({ grid, type, x, y }) -
D171
Click a chart to filter
Click a slice and the grid narrows to it
chart.on('point:click', …) -
D172
Chart events
Click, hover and selection, wired to your app
chart.on('point:click' | 'point:hover' | 'series:toggle') -
D173
Brushing a time range
Drag a range on the chart and the grid narrows to it
brush: true -
D174
Small multiples
One chart per category, on a shared scale
multiples: col -
D175
Colour schemes
Built-in palettes, the default colour-blind safe
scheme: 'default' · 'bright' · 'earth' · 'mono' -
D176
Axes and legends
A series per category, named by the legend
series, legend -
D177
Data labels
Values beside the marks, or left to the axis
labels: true -
D178
Charts with no grid on screen
The data engine driving charts on its own
createHeadlessGrid -
D200
The correlation matrix
Every numeric column against every other, Pearson or Spearman
type: 'correlogram' -
D201
Is this column normal?
A Q-Q plot against a line through the quartiles
type: 'qq', y -
D202
Cumulative distribution
The ECDF, binless, beside a histogram of the same column
type: 'ecdf', y -
D203
How concentrated is it?
A Lorenz curve, the picture a Gini number is read off
type: 'lorenz', y -
D204
Statistical process control
Control limits against spec limits, which are not the same thing
type: 'control', y, baseline -
D205
Density over a histogram
A kernel density estimate over the bars, so binning and data separate
curve: true, buckets -
D206
A fitted line
Least squares per series, with R², agreeing with the API
fit: true
Statistics
What the grid knows about its own numbers, and about how they have changed since the page loaded.
-
D179
Statistics in the totals row
Median, percentiles, deviation and spread, each over the filtered rows
total: 'median' · 'p95' · 'stddev' -
D180
Profiling a column
Count, spread, quartiles and outliers from the API, into a panel of your own
grid.statistics.profile(col) -
D181
The statistics panel
The column profile as a docked tool panel, following the filters
toolPanel: { panels: ['statistics'] } -
D182
Correlation and weighted averages
Two-column figures from the API, over the filtered rows
grid.statistics.correlation(a, b) -
D184
Shadow columns: what changed
Delta, percent change and a move count against the value at page load
shadow: { of, kind: 'delta' } -
D185
Shadow columns: rank and movement
Rank, percentile and places moved; sort by places moved for live top movers
shadow: { of, kind: 'rankChange' } -
D186
Shadow columns: rate and streak
Speed of change, direction runs, and a sparkline of recent history
shadow: { of, kind: 'rate' } -
D187
Marking a baseline
"Mark all" resets every delta to now
grid.statistics.rebase(col) -
D194
Variation along an ordering
Volatility, growth and drawdown, from rows loaded out of order
grid.statistics.series(col, { by }) -
D195
Capability against a tolerance
Cp, Cpk, Pp and Ppk from one column declaration
grid.statistics.capability(col, { baseline }) -
D228
Confidence intervals, charted
The mean lead time of each supplier with its 95% interval as a whisker, and a tile that narrows as you filter
grid.statistics.interval(col) · chart error: true -
D230
An SPC study: control, range, capability
A drifting process with limits fixed on the first thirty readings, so the drift breaks a rule rather than being absorbed
chart type: control · movingRange · capability -
D197
Running totals
The one derived value that depends on the display order
running: { of, kind: 'total' } -
D199
Statistics of a selection
Drag a rectangle; it is summarised as one set of figures
grid.selection.statistics() -
D183
Statistical values in a column
A column's median, deviation and percentile, read into computed columns
value.compute -
D193
Statistics without a panel
Every figure available to your own interface, as an object
grid.statistics.* -
D210
A trading book
Money units, shadow columns, a running P&L and a live feed, in one grid
createUnitType · shadow · running · statistics -
D211
Analytical chemistry
Molarity, ppb and dose types, with a contaminated batch the rules find
type: molarity · ppb · doseRate -
D212
Manufacturing and process
A machined bore with a tolerance driving capability, drifting in one shift
spec · grid.statistics.capability -
D213
Fleet and network
Address, data-size and rate types, latency long-tailed so p99 bites
type: ipv4 · bytes · bitrate
Derived and chained
One grid built from another and following its filter, to any depth, with a single figure in a tile reading the same rows.
-
D222
Chaining, three levels deep
sales → revenue per rep → top three and a profile, with tiles reading the middle level; one filter moves all of it
source: { mode: 'derived', from, groupBy, profile } · createStat -
D223
A sales dashboard
Top reps by grouping, most-sold products by unnesting the order lines, and five tiles, one ignoring the filter
groupBy · unnest · scope: 'all' · createStat -
D224
A production line
A measurement profile transpose, an out-of-tolerance list, spread by line, and Cpk in a tile against the column spec
profile · where · statistics.capability -
D225
A support desk
Tickets by week, the busiest agent per queue, the commonest tags, and SLA breaches, from one filtered source
bucket · limitPer · unnest · where -
D226
Joining a second grid
Orders carry a customer id but no tier; a join brings it across from a customers grid, then groups revenue by tier
join: { with, on, select } -
D227
Cross-filtering, the path back up
Two summary panels over one book; click a row in either and it filters the book, so the other narrows
crossFilter: true · crossFilter.toggle
Building one of these
Each demo is a column list and a row array. The configuration playground lets you change the options and read back the object that produced the result, the developer guide walks through the same configurations with the code beside them, and the API reference lists every option.