Skip to content
VVVER

Design System / 07.5

Data display

Choose the display by the shape of the information: tables for exact values, charts for patterns, ledgers for fixed metadata, and compact markers for status or identity.

Component reference

Index table

Rows in uppercase hairline columns, for archives and directories. Linked rows dim to the readable 60% floor on hover and keep a 44px target; external URLs are detected automatically and get a stroke arrow plus target="_blank".

Live specimen

Rendered output

API reference

Inputs, types, and behavior

Inputcolumns
Typestring
BehaviorRaw grid-template-columns shared by every row.
Inputrows
Type{ cells, href? }[]
Behaviorcells is one ReactNode per column; rows without href are static and do not dim.
InputclassName
Typestring?
BehaviorMerged onto the outer element.

Component reference

Work index

A selected-work register with compact media, bracketed sequence numbers, title, year, scope, and status. Linked entries dim their image to 60% while the readable metadata stays unchanged. Entries without an href remain static for announced or forthcoming work.

Live specimen

Rendered output

API reference

Inputs, types, and behavior

Inputitems
Type{ title, media, href?, year?, scope?, status? }[]
BehaviorMedia owns its alt text. Omit href for a static forthcoming entry; keep interactive controls out of linked media.
Inputcolumns
Type2 | 3 | 4 | 5 (default 5)
BehaviorMaximum wide-screen track count; every variant holds at two columns on small screens.
InputstartIndex
Typenumber = 1
BehaviorFinite values are truncated to an integer for the bracketed number and semantic ol start.
InputmediaClassName / className
Typestring? / string?
BehaviorOverride an item crop or the outer grid; both merge after defaults.

Component reference

Project ledger

A fixed-schema provenance register for a case-study opening. Client, year, scope, and optional publication status share one ruled row; the about note spans beneath it. Use DescriptionList when the fields do not follow this project-specific schema.

Live specimen

Rendered output

Client
Catalog specimen
Year
Neutral sample
Scope
Identity, editorial design, website development
Status
Published
About
A short account of the commission, its constraints, and the delivered work.

API reference

Inputs, types, and behavior

Inputclient / year / scope
TypeReactNode
BehaviorRequired project facts; year accepts a semantic time element.
Inputstatus
TypeReactNode?
BehaviorOptional factual state such as Published, In progress, or Forthcoming.
Inputabout
TypeReactNode?
BehaviorOptional longer note in a separate full-width ledger row.
InputclassName
Typestring?
BehaviorMerged onto the semantic dl after its layout defaults.

Component reference

Tree view

Nested disclosure rows behind hairline left guides, with full-ink mono labels, a square selection marker, and a rotating 1px chevron on branches. Arrows move and disclose, Home/End jump, and character keys search visible rows.

Live specimen

Rendered output

  • Components
    • Actions
  • Icons

API reference

Inputs, types, and behavior

Inputnodes
TypeTreeViewNode[]
Behavior{ label, id?, children? } — ids default to the index path; pass stable ids for dynamic trees.
Inputlabel
Typestring
BehaviorRequired accessible name for the tree.
InputdefaultExpandedIds / defaultSelectedId
Typestring[] / string
BehaviorInitial expansion and selection; the component stays uncontrolled.
InputonSelect
Type(id, node) => void?
BehaviorFires when a row is activated by click, Enter, or Space.

Component reference

Accordion

Disclosure rows over hairline dividers, single- or multi-open, with a rotating plus icon or a flipping chevron. Panel layout changes discretely while its contents settle through opacity and a four-pixel translation in 300ms, then retreat in 180ms before unmount. The icon uses the same shorter exit duration; reduced motion is immediate.

Live specimen

Rendered output

Plus, single-open

Chevron, multi-open

API reference

Inputs, types, and behavior

Inputitems
Type{ title, content, subtitle?, icon?, badge?, headerRight? }[]
BehaviorUncontrolled rows. Closed panels unmount, so their controls cannot remain focusable.
Inputmultiple
Typeboolean = false
BehaviorAllow several panels open at once.
Inputicon
Type"plus" | "chevron"
BehaviorDefault "plus" (rotates 45°); chevron flips 180°.
InputheadingAs
Type"h2" | "h3" | "h4" | "h5" | "h6"
BehaviorDefault h3; choose the level that follows the surrounding document outline.
InputclassName
Typestring?
BehaviorMerged onto the root element.

SpecAccordion (below) is the spec-sheet variant.

Component reference

Spec accordion

The spec-sheet disclosure variant: hairline rows, a one-pixel plus icon, and one open panel at a time. Its panels use the same 300ms settle and 180ms retreat as the general accordion.

Live specimen

Rendered output

API reference

Inputs, types, and behavior

Inputitems
Type{ title: string, content: ReactNode }[]
BehaviorSingle-open uncontrolled disclosures; closed content unmounts.
InputheadingAs
Type"h2" | "h3" | "h4" | "h5" | "h6"
BehaviorDefault h3; match the surrounding heading hierarchy.
InputclassName
Typestring?
BehaviorMerged onto the ruled root after defaults.

Component reference

Spec bar

Entry metadata expressed as mono label-and-value pairs over a hairline. Article pages may pin it beneath the header; this specimen keeps it static to show the complete row.

Live specimen

Rendered output

mode:
Static
scope:
Catalog
style:
Hairline

API reference

Inputs, types, and behavior

Inputdetails
TypeRecord<string, string>
BehaviorLabel → value pairs in insertion order; an empty object renders nothing.
InputclassName
Typestring?
BehaviorMerged onto the sticky <dl> — override the top-[74px] / lg:top-[84px] header offset here.

Component reference

Information bar

A nineteen-pixel, three-column information strip with truncating cells and a hairline base. It belongs beneath heroes or above footers when a composition needs terse, persistent context.

Live specimen

Rendered output

Ink + Paper + Type + Rules

API reference

Inputs, types, and behavior

Inputleft / right
Typestring
BehaviorThe two side labels; each truncates in its cell.
Inputcenter
Typestring[]
BehaviorCentered item row, joined for AT with an sr-only separator.
InputmobileSides
Typeboolean = false
BehaviorKeep the side labels visible on small screens (hidden by default under sm).
InputmobileSpread
Typeboolean = false
BehaviorPush the center items edge-to-edge on mobile when the sides are hidden.
InputclassName
Typestring?
BehaviorMerged onto the root element.

Component reference

Activity rail

A compact operational register for releases, jobs, or audit events. Records stay plain text and the shared marquee provides a visible pause control. It also pauses on attention, offscreen placement, and hidden tabs; reduced motion collapses to one complete static row.

Live specimen

Rendered output

Build 1184Static export completedReview 07Keyboard path approvedReleaseTag candidate preparedCatalogComponent specimen updated

API reference

Inputs, types, and behavior

Inputitems
TypeActivityRailItem[]
BehaviorRequired action plus optional actor, time, and stable id. Blank actions are omitted.
InputautoPlay / speed
Typeboolean = true / number = 36
BehaviorInitial playback and finite px/s drift; Marquee still exposes pause and live motion-preference behavior.
Inputlabel
Typestring = "Recent activity"
BehaviorAccessible name for the moving region.
InputclassName
Typestring?
BehaviorMerged last onto the ruled outer register.

Component reference

Hover preview list

Ruled rows that reveal an aria-hidden image in a viewport corner on fine-pointer hover or keyboard focus. Optional destinations turn rows into 44px links that remain fully useful on touch; static rows never become fake tab stops.

Live specimen

Rendered output

API reference

Inputs, types, and behavior

Inputitems
Type{ label, detail?, href?, imageSrc? }[]
Behaviorhref makes a 44px keyboard/touch link; imageSrc is aria-hidden decoration on fine-pointer hover or focus.
Inputposition
Type"top-left" | "top-right" | "bottom-left" | "bottom-right"
BehaviorViewport corner for the preview slot, default "top-right".
Inputsize
Typenumber = 150
BehaviorSquare preview size in px.
InputoffsetX / offsetY
Typenumber = 15
BehaviorEdge insets — bump offsetY to clear a fixed nav.

Component reference

Clock

A semantic local-time stamp for footers and datelines. Server output is a stable placeholder, then the client updates once per second. Invalid locale input falls back to en-US instead of breaking render.

Live specimen

Rendered output

Local time /

24 hour /

Locale fallback /

API reference

Inputs, types, and behavior

Inputhour12
Typeboolean = true
BehaviorPassed to Intl.DateTimeFormat.
Inputlocale
Typestring = en-US
BehaviorBCP 47 locale; invalid values safely use en-US.
InputclassName
Typestring?
BehaviorMerged onto the semantic time element after defaults.

Component reference

Status dot

A squared status mark and readable mono label. Live state adds a slow inner-square pulse that only steps down the opacity ladder. Reduced motion holds a complete static mark. Optional companion tints support the written status and fall back to currentColor.

Live specimen

Rendered output

Service onlineReview pendingSync failedInformationArchive offline

API reference

Inputs, types, and behavior

Inputlabel
Typestring
BehaviorRequired text that carries the status without relying on tint.
Inputlive
Typeboolean = true
BehaviorAdds a 2.4s down-opacity pulse; false leaves the outer hairline only. Reduced motion holds the inner square still.
Inputstatus
Type"neutral" | "success" | "warning" | "error" | "info"
BehaviorOptional companion tint for the mark; neutral stays currentColor.
InputclassName
Typestring?
BehaviorMerged onto the root element after defaults.

Component reference

Data table

A sortable, dense table: header buttons announce their next sort state, numeric columns use tabular-nums, and empty cells show an em dash. Row selection is optional, with a header select-all; Skeleton rows show while loading, and an EmptyState appears when the set is empty. Sort and selection can each be controlled or uncontrolled — below, selection is controlled to read back a count, while the table owns its own sort.

Live specimen

Rendered output

Example invoices
Aster PressPaid$4,2002026-06-14
Field OfficePending$1,8752026-06-18
North RoomOverdue$9,6402026-05-30
Index StudioPaid$3202026-06-21
Common ShelfPending$12,5002026-06-24
Paper WorksDraft2026-06-27

1 selected · no active sort

Table state examples
TitleStatus
Primary rowReady
Empty-cell row

No row action yet

API reference

Inputs, types, and behavior

Inputcolumns
TypeDataTableColumn<T>[]
Behavior{ key, header, align?, sortable?, width?, render? }. align "end" right-aligns + tabular-nums.
Inputrows / rowKey
TypeT[] / (row) => string
BehaviorThe data and a stable key per row.
Inputsort / onSortChange
Type{ key, direction } | null
BehaviorPassing sort controls state and leaves row ordering to the parent. Omit sort for internal reorder; onSortChange observes either mode.
Inputselectable
Typeboolean
BehaviorAdds a checkbox column with a header select-all. Default false.
InputselectedKeys / onSelectionChange
Typestring[] / (keys) => void
BehaviorControlled selection; omit selectedKeys for internal state.
InputonRowClick
Type(row) => void
BehaviorMakes rows focusable + Enter/Space activatable; nested links, controls, editable content, and tab stops do not bubble row activation.
Inputloading / empty / caption / stickyHeader
Typeboolean / ReactNode / ReactNode / boolean
BehaviorSkeleton rows when loading; empty overrides the default EmptyState; caption is a mono top caption; stickyHeader pins the head.

Component reference

Stat card

A KPI tile: a mono micro-label with an optional icon slot, a poster-weight tabular figure, then a delta + note row and an optional sparkline across the base. Direction is shown by a glyph (▲/▼/–) with an sr-only word, never by colour alone. Given href, the shell becomes a link while its full-ink figure and delta self-dim; /60 supporting copy stays readable.

Live specimen

Rendered output

Invoice total
$48.2k
increase, +12.4%current period
Active accounts
1,284
decrease, −3.1%current period
Monthly total
26.4k
increase, +8.0%

API reference

Inputs, types, and behavior

Inputlabel / value
TypeReactNode
BehaviorMono micro-label and the big figure (--fluid-h2, tabular-nums).
Inputdelta
Type{ direction?, value }
Behaviordirection "up" | "down" | "flat" (default flat) picks the glyph + sr-only word; value is the change, e.g. "+2.4%".
Inputsub
TypeReactNode?
BehaviorSmall note beside the delta.
Inputchart
TypeReactNode?
BehaviorSparkline (or any node) spanning the bottom of the card.
Inputicon
TypeReactNode?
BehaviorTop-right slot — currentColor SVG (an <Icon as={…} />).
Inputhref
Typestring?
BehaviorWhen defined, including an empty string, renders an anchor shell.

Component reference

Sparkline

A monochrome mini chart: an inline SVG polyline in currentColor, optionally filled beneath at the dim-3 opacity. Data normalises into the viewBox, and a non-scaling stroke keeps the hairline even at any box size. Flat, single-point, and empty series all render without throwing. It appears inside StatCard above, and stands alone here.

Live specimen

Rendered output

Line
Area
Flat + invalid input
tsx
<Sparkline data={[8, 11, 9, 14, 12, 18, 16, 22]} label="Sessions" variant="area" />

API reference

Inputs, types, and behavior

Inputdata
Typenumber[]
Behavior0/1-point and flat data are safe; NaN and infinite readings are ignored.
Inputvariant
Type"line" | "area"
BehaviorDefault "line" is stroke only; "area" fills beneath at --dim-3.
Inputlabel
Typestring?
BehaviorAccessible name; omitted, the SVG is aria-hidden decoration.
Inputwidth / height
Typenumber
BehaviorPositive finite viewBox size, default 120 × 32; invalid values use the default.
InputstrokeWidth
Typenumber
BehaviorPositive finite non-scaling hairline, capped to height; default 1.5.

Component reference

Chart frame

A frame for analytical graphics with a semantic heading, unit or context, written legend, source, and an optional disclosed table. The plot slot stays open so exact values and explanatory copy remain separate from the drawing layer.

Live specimen

Rendered output

Review scores

Two sample score series across seven review rounds.

Score / higher is better
  • Revised
  • Original
Revised and original scores by review round2 series (Revised, Original), 14 plotted observations.5863677276CP-01CP-03CP-05CP-07
View data table
Evaluation score by checkpoint
CheckpointRevisedOriginal
CP-0161.260.4
CP-0264.861.1
CP-0366.162.2
CP-0468.962.8
CP-0570.463.4
CP-0672.864.1
CP-0773.664.3
The table lists the same sample values shown in the plot.Source / Illustrative data
tsx
<ChartFrame
  title="Review scores"
  meta="Score / higher is better"
  legend={[{ label: "Revised" }, { label: "Original", mark: "dash" }]}
  table={<ScoreTable />}
  source="Illustrative data"
>
  <TimeSeriesChart label="Revised and original scores by review round" series={series} />
</ChartFrame>

API reference

Inputs, types, and behavior

Inputtitle / children
TypeReactNode
BehaviorRequired semantic frame title and the visualization it names.
Inputdescription / meta
TypeReactNode?
BehaviorShort reading instruction and compact unit or scope metadata.
Inputlegend
TypeChartLegendItem[]?
BehaviorWritten labels with solid, dash, dot, or hatch marks; never rely on the mark alone.
Inputtable / tableLabel
TypeReactNode? / string
BehaviorOptional details disclosure for the exact data. The caller supplies a semantic table.
Inputcaption / source
TypeReactNode?
BehaviorInterpretive note and factual provenance in the figcaption.
InputheadingAs / className
Type"h2"–"h6" / string?
BehaviorDefault h3; match the surrounding outline. className merges last.

Component reference

Time series chart

A static-first SVG plot for ordered observations. Series use solid, dashed, or dotted currentColor strokes rather than hue; invalid observations are omitted and flat or single-point domains settle to a safe range. Put exact values in ChartFrame's table disclosure.

Live specimen

Rendered output

Seven-round score comparisonTwo fixed sample series. The solid line shows the revision; the dashed line shows the original.58%63%67%72%76%D1D3D5D7

API reference

Inputs, types, and behavior

Inputlabel / description
Typestring / string?
BehaviorRequired SVG name and optional concise chart summary.
Inputseries
Type{ id, label, points, style? }[]
BehaviorFinite numeric x/y observations; style is solid, dash, or dot.
InputxDomain / yDomain
Typereadonly [number, number]?
BehaviorOptional explicit domains; reversed endpoints normalize safely.
InputformatX / formatY
Type(value) => string
BehaviorVisible tick formatting; defaults to compact neutral figures.
InputshowGrid / showPoints
Typeboolean
BehaviorGrid defaults on; point marks default off. Both remain static under reduced motion.

Component reference

Trace timeline

A semantic span table with an exact time ruler and restrained Gantt-like bars. Written labels, nesting, durations, and endpoints carry the meaning; low-opacity currentColor fills only accelerate scanning. Bars reveal by horizontal scale over 340ms and resolve to the complete trace immediately under reduced motion or no script.

Live specimen

Rendered output

Publication export trace
Nested spans retain their duration and endpoints; indentation shows parent and child work.
SpanTiming0ms470ms940ms
Root span. export issueroot940ms0ms940ms
Child of export issue. collect linksfiles154ms18ms172ms
Child of export issue. prepare imagescolor134ms184ms318ms
Child of export issue. write PDFpress474ms332ms806ms
Child of write PDF. embed fontstype164ms358ms522ms
Child of write PDF. add bleedpages246ms536ms782ms
Child of export issue. save manifestrecord94ms824ms918ms
Fixed-domain clipping states
Original endpoints stay written when the chosen comparison scale clips or excludes a span.
SpanTiming0ms50ms100ms
Root span. before windowoutside60ms-80ms-20ms
Root span. enters windowclipped start48ms-20ms28ms
Root span. reversed inputnormalized24ms58ms82ms
Root span. after windowoutside46ms118ms164ms

API reference

Inputs, types, and behavior

Inputitems
TypeTraceTimelineItem[]
BehaviorUp to 200 finite spans with label, start, end, optional depth 0–4, parent id, duration label, metadata, and stable id.
Inputlabel / description
Typestring / ReactNode?
BehaviorVisible table caption, optional reading instruction, and accessible name for the horizontal region.
Inputdomain / unit / formatValue
Type[number, number]? / string / (number) => string
BehaviorOptional fixed scale, default-formatter suffix, and custom formatter shared by ticks, endpoints, and generated durations.
InputclassName
Typestring?
BehaviorMerged last on the focusable overflow region; the semantic table keeps a readable minimum width.

Component reference

Bar chart

Grouped or stacked comparisons in either orientation. Repeating solid, stripe, cross, and dot registers distinguish up to six series without saturated colour; negative values retain a real zero baseline. The horizontal specimen keeps long measure names readable.

Live specimen

Rendered output

Horizontal / grouped

  • Revised
  • Original
Revised and original layout scoresFour sample review scores for two layout revisions.02550751007866Cover7169Contents9287Feature6374Index

Vertical / stacked

  • Studio
  • Review
  • Press
Sample production hours by phase3 categories and 3 stacked series (Studio, Review, Press).0255075100EditLayoutPrepress
tsx
<BarChart
  label="Layout score comparison"
  orientation="horizontal"
  series={[
    { id: "revised", label: "Revised", pattern: "solid" },
    { id: "original", label: "Original", pattern: "stripe" },
  ]}
  data={[
    { label: "Cover", values: { revised: 78, original: 66 } },
  ]}
/>

API reference

Inputs, types, and behavior

Inputseries / data
TypeBarChartSeries[] / BarChartDatum[]
BehaviorSeries declare id, written label, and pattern; each datum maps those ids to finite values.
Inputmode / orientation
Type"grouped" | "stacked" / "horizontal" | "vertical"
BehaviorDefaults grouped and vertical. Both modes preserve a zero baseline.
Inputdomain / tickCount
Type[number, number]? / number
BehaviorOptional fixed comparison scale; tick count clamps to 2–10.
InputshowGrid / showValues
Typeboolean
BehaviorGrid defaults on; written values are opt-in when the frame is spacious enough.

Component reference

Distribution plot

A deterministic histogram from raw finite observations. Equal-width bins, an optional observation rug, and factual reference markers support model error, latency, and return distributions. The component does not interpolate a smooth curve.

Live specimen

Rendered output

Neutral sample return distribution52 finite observations across 14 equal-width bins from -3.0% to 3.0%.04711-3.0%-1.5%0.0%1.5%3.0%Median / 0.1%Limit / -1.5%

API reference

Inputs, types, and behavior

Inputvalues / label
Typenumber[] / string
BehaviorRaw observations and the required accessible SVG name; non-finite values are ignored.
InputbinCount / domain
Typenumber / [number, number]?
Behavior4–40 equal-width bins; an explicit domain clips observations outside its range.
Inputmarkers
Type{ label, value }[]?
BehaviorWritten dashed references such as a median, target, or limit.
InputshowRug / formatValue
Typeboolean / (value) => string
BehaviorOptional first-240-observation rug and visible axis/marker formatter.

Component reference

Matrix

A semantic table with a low-contrast scanning layer. Every cell keeps its written value in full ink; low-opacity washes and repeated rules indicate range or magnitude without turning colour into meaning. Invalid cells render an explicit em dash.

Live specimen

Rendered output

Image preparation matrixEach score remains written in the cell; density provides a secondary visual cue.
MeasureCropTypeCreditProfile
Cover0.910.840.880.73
Feature0.820.790.800.78
Index0.760.710.74

API reference

Inputs, types, and behavior

Inputrows / columns / values
Typestring[] / string[] / number[][]
BehaviorSemantic row and column headers plus the matching value matrix.
Inputlabel / description
Typestring / ReactNode?
BehaviorVisible table caption and optional reading instruction.
Inputdomain / intensity
Type[number, number]? / "magnitude" | "range"
BehaviorSigned domains default to magnitude; one-sided domains default to range.
InputformatValue / className
Type(value) => string / string?
BehaviorVisible exact-value formatter and outer overflow-container override.

Component reference

Description list

Key/value details at density: a semantic <dl> of mono uppercase terms against ink values, tabular-nums throughout. Inline layout puts the term in a narrow left column beside its value on md+ and stacks below that; stack layout keeps term over value at every width. Hairline row separators by default.

Live specimen

Rendered output

Record
Catalog specimen
Scope
Description list
Content
Neutral sample data
Status
Documented
Source
Local component catalog

API reference

Inputs, types, and behavior

Inputitems
Type{ term, description }[]
BehaviorThe term/value rows.
Inputlayout
Type"inline" | "stack"
BehaviorDefault "inline" (term column beside value on md+); "stack" keeps term over value at every width.
Inputdivided
Typeboolean
BehaviorHairline separators between rows. Default true.
InputclassName
Typestring?
BehaviorMerged onto the <dl>.

Component reference

Stat band

Displays several large statistics in one row. Each item uses the fluid display scale with a mono label beneath. Hairlines run between columns at md and switch to horizontal rules when the band stacks on mobile.

Live specimen

Rendered output

Components
185
from src/index.ts
Families
14
Hooks
4
Stylesheets
3
source files

API reference

Inputs, types, and behavior

Inputstats
Type{ value, label, sub? }[]
Behaviorvalue uses the fluid display scale; label uses mono type; sub adds an optional secondary line at /60.
Inputcolumns
Type2 | 3 | 4
BehaviorRow width at md+. Defaults to one column per stat, capped at four.
Inputalign
Type"start" | "center"
BehaviorDefault "start" — a start figure sits flush to the band edge.
InputclassName
Typestring?
BehaviorMerged onto the dl.

Component reference

Avatar

Squared, not circular — people are never shown in circles. Photographs run through the monochrome pipeline; without a source it falls back to mono initials on the secondary surface.

Live specimen

Rendered output

Image specimenImage specimenImage specimen

API reference

Inputs, types, and behavior

Inputname
Typestring
BehaviorRequired accessible name; also feeds the two-letter initials fallback.
Inputsrc
Typestring?
BehaviorPhoto source rendered through photo-bw; omission or load failure falls back to initials.
Inputsize
Type"sm" | "md" | "lg"
Behavior28 / 40 (default) / 64px, with the initials type scaled per rung.
InputclassName
Typestring?
BehaviorMerged onto the root element.