Meowland docs
Workbench

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.

packages/meowtail/stories/pattern-containers.stories.tsxline 22tsx
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

bun add meowtail

Usage

Taken from the examples on this page.

usage.tsxtsx
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.

packages/meowtail/stories/composer-panel.stories.tsxline 16tsx
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

PropTypeDefault
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

rootitemiconlabelseparatorprogress

Registry

The component is registered as meta-row in the meowtail component registry.