Unlinked entry03Static / Announced[Forthcoming]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.
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.
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
- [01]
Work-index specimen01Linked / Image - [02]
Dense register02Linked / Compact [03]
Unlinked entry03Static / Announced[Forthcoming]- [04]
Readable details04Linked / Metadata - [05]
Publication marker05Linked / Status
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.
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.
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
- Navigation
- Layout
- 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.
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.
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.
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.
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
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.
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
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.
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
- Component inventory12
- Identity guidance9
- Family index14
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.
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.
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
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.
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
| Aster Press | Paid | $4,200 | 2026-06-14 | |
| Field Office | Pending | $1,875 | 2026-06-18 | |
| North Room | Overdue | $9,640 | 2026-05-30 | |
| Index Studio | Paid | $320 | 2026-06-21 | |
| Common Shelf | Pending | $12,500 | 2026-06-24 | |
| Paper Works | Draft | — | 2026-06-27 |
1 selected · no active sort
| Title | Status |
|---|---|
| Primary row | Ready |
| 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.
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
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.
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
<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.
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.
- Revised
- Original
View data table
| Checkpoint | Revised | Original |
|---|---|---|
| CP-01 | 61.2 | 60.4 |
| CP-02 | 64.8 | 61.1 |
| CP-03 | 66.1 | 62.2 |
| CP-04 | 68.9 | 62.8 |
| CP-05 | 70.4 | 63.4 |
| CP-06 | 72.8 | 64.1 |
| CP-07 | 73.6 | 64.3 |
<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.
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
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.
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
| Span | Timing | 0ms470ms940ms |
|---|---|---|
| Root span. export issueroot | 940ms0ms → 940ms | |
| Child of export issue. collect linksfiles | 154ms18ms → 172ms | |
| Child of export issue. prepare imagescolor | 134ms184ms → 318ms | |
| Child of export issue. write PDFpress | 474ms332ms → 806ms | |
| Child of write PDF. embed fontstype | 164ms358ms → 522ms | |
| Child of write PDF. add bleedpages | 246ms536ms → 782ms | |
| Child of export issue. save manifestrecord | 94ms824ms → 918ms |
| Span | Timing | 0ms50ms100ms |
|---|---|---|
| Root span. before windowoutside | 60ms-80ms → -20ms | |
| Root span. enters windowclipped start | 48ms-20ms → 28ms | |
| Root span. reversed inputnormalized | 24ms58ms → 82ms | |
| Root span. after windowoutside | 46ms118ms → 164ms |
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.
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
Vertical / stacked
- Studio
- Review
- Press
<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.
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
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.
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
| Measure | Crop | Type | Credit | Profile |
|---|---|---|---|---|
| Cover | 0.91 | 0.84 | 0.88 | 0.73 |
| Feature | 0.82 | 0.79 | 0.80 | 0.78 |
| Index | 0.76 | 0.71 | 0.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.
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>.
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.
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



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.