Component reference
MetaRow
A page-level fact row.
Preview
MetaRow has no story of its own; this one draws it as part of ActionRail.
action rail and meta row
The action rail owns start/end anchoring and keeps the submit action visible; the meta row owns fact separators, wrapping and progress. Callers pass actions and facts, not layout styles.
render: () => (
<Measure width="content">
<Stack gap="relaxed">
<Stack gap="compact">
<strong>Action rail</strong>
<span>
Leading actions stay at the start; trailing actions and the submit action stay at the
end. Flexible actions wrap so the submit action remains visible.
</span>
</Stack>
<ActionRail
aria-label="Composer actions"
role="group"
leading={
<Button variant="quiet" size="small">
Add
</Button>
}
trailing={[
<Button variant="quiet" size="small">
Auto review
</Button>,
<IconButton label="Voice input">
<Icon name="message-square" />
</IconButton>,
]}
submit={
<Button size="small" aria-label="Send message">
<Icon name="arrow-up" />
</Button>
}
/>
<ActionRail
aria-label="Long action rail"
role="group"
leading={
<IconButton label="Add an attachment">
<Icon name="plus" />
</IconButton>
}
trailing={[
<Button variant="quiet" size="small">
A long provider or model selection to inspect
</Button>,
<IconButton label="Voice input">
<Icon name="message-square" />
</IconButton>,
]}
submit={
<Button size="small" aria-label="Send message">
<Icon name="arrow-up" />
</Button>
}
/>
<Stack gap="compact">
<strong>Meta row</strong>
<span>
Facts keep separators and wrap instead of clipping. Progress is one more fact and does
not add a leading separator when the row has no items.
</span>
</Stack>
<MetaRow
aria-label="Run facts"
items={[
{ icon: <Icon name="refresh-cw" />, label: "7 turns 162 steps" },
{ label: "219 tok/s" },
{ icon: <Icon name="list-checks" />, label: "Cache hit 99.5%" },
]}
progress={45}
progressLabel="Cache progress"
/>
<MetaRow
aria-label="Centered run facts"
align="center"
progressTone="accent"
items={[
{ icon: <Icon name="folder" />, label: "46.9M tokens" },
{ label: "Session budget" },
]}
progress={72}
progressLabel="Session budget"
/>
<MetaRow
aria-label="Progress only"
items={[]}
progress={72}
progressLabel="Session budget"
/>
</Stack>
</Measure>
)Installation
Usage
Taken from the examples on this page.
import { MetaRow } from "meowtail";
<MetaRow
aria-label="Run facts"
items={[
{ icon: <Icon name="refresh-cw" />, label: "7 turns 162 steps" },
{ label: "219 tok/s" },
{ icon: <Icon name="list-checks" />, label: "Cache hit 99.5%" },
]}
progress={45}
progressLabel="Cache progress"
/>Examples
Other stories that draw MetaRow.
surface and meta
ComposerPanel refines ChatComposer's single writing surface. The keyboard hint and optional page-level facts follow outside the rounded editor and its bottom action row.
render: () => (
<Measure width="content">
<Stack gap="relaxed">
<Stack gap="compact">
<strong>Default panel</strong>
<span>
Draft and actions share one writing surface. Supporting instructions and page facts stay
below its edge.
</span>
</Stack>
<ComposerPanel
value="Continue — I'm wondering whether the component set is still too thin, especially for containers."
placeholder="Continue, type a message…"
inputLabel="Message"
hint="Enter for a new line · Use Send to submit"
hintId="panel-composer-hint"
submitLabel="Send message"
submitContent={<Icon name="arrow-up" />}
trailing={[
<IconButton label="Auto review">
<Icon name="shield-check" />
</IconButton>,
<Button variant="quiet" size="small">
DeepSeek-V4.1-Flash <Badge tone="accent">1017</Badge>
</Button>,
]}
meta={
<MetaRow
items={[
{ icon: <Icon name="refresh-cw" />, label: "7 turns 162 steps" },
{ label: "219 tok/s" },
]}
progress={45}
progressLabel="Cache progress"
align="center"
/>
}
>
<IconButton label="Add">
<Icon name="plus" />
</IconButton>
</ComposerPanel>
</Stack>
</Measure>
)API reference
Items keep separators, wrap instead of clipping, and carry facts as text; the optional progress segment is one more fact.
Props
| Prop | Type | Default |
|---|---|---|
align | "start" | "center" | "start" |
progressTone | "neutral" | "accent" | "neutral" |
itemsRequiredPlain arrays are fixed for the mount. A signal keeps the row live. | MaybeSignal<readonly MetaItem[]> | – |
progressFinite values clamp to 0–100; non-finite values omit the progress segment. A signal stays live. | MaybeSignal<number | undefined> | – |
progressLabelAccessible name for the progress segment. | string | "Progress" |
Also takes className, children and the attributes and events of its root element.
DOM parts
Registry
The component is registered as meta-row in the meowtail component registry.