Component reference
AppBar
Compact application chrome: one title, one optional status line, and the actions that belong to the whole screen.
Preview
AppBar has no story of its own; this one draws it as part of PageFrame.
header, notice, messages and composer
One public composition for a small conversation screen: PageFrame owns the header, notice, scroll body and footer; AppBar carries identity and actions; ComposerPanel owns the writing surface.
render: () => (
<div
style={{
height: "min(680px, calc(100dvh - 90px))",
minHeight: 0,
width: "min(100%, 430px)",
margin: "0 auto",
overflow: "hidden",
border: "1px solid var(--ui-line-control)",
borderRadius: "14px",
}}
>
<PageFrame
variant="workspace"
header={
<AppBar
title="Studio MacBook"
status={<ChatStatus label="Offline · Draft saved" tone="waiting" />}
actions={[
<Button variant="quiet" size="small">
Reconnect
</Button>,
<IconButton label="Conversation actions">
<Icon name="menu" />
</IconButton>,
]}
/>
}
notice={
<Alert
layout="bar"
tone="warning"
actions={
<Button variant="quiet" size="small">
View receipt
</Button>
}
>
Last submission unverified; draft kept.
</Alert>
}
footer={
<ComposerPanel
placeholder="Type a message"
inputLabel="Message"
submitLabel="Send message"
submitContent={<Icon name="arrow-up" />}
>
<IconButton label="Add">
<Icon name="plus" />
</IconButton>
</ComposerPanel>
}
>
<ChatConversation ariaLabel="Conversation">
<ChatMessageList ariaLabel="Messages">
<ChatMessageListDate label="Today 20:40" />
<ChatMessage role="assistant" author="Assistant" timestamp="20:40">
<p>
You do not have to clear the desk completely. Keep a small “in progress” area so
things have a fixed home without having to dig them out every time.
</p>
<p>
Leave a book-sized area on the other side of your dominant hand for the two or three
books you are reading; keep the cable you are using in place and tuck the extra
length behind the desk.
</p>
</ChatMessage>
<ChatMessage role="user" author="You" timestamp="20:41">
<p>
A few more conditions: the desk is by the window and gets afternoon sun; I want my
usual pen, headphones and two current books within reach.
</p>
</ChatMessage>
<ChatMessage role="assistant" author="Assistant" timestamp="20:42">
<p>
That works. Keep the window side for the pen, headphones and those two books; split
cables into “in use / spare / archive” in three places.
</p>
</ChatMessage>
</ChatMessageList>
</ChatConversation>
</PageFrame>
</div>
)Installation
bun add meowtail
Usage
Taken from the examples on this page.
import { AppBar } from "meowtail";
<AppBar
title="Studio MacBook"
status={<ChatStatus label="Offline · Draft saved" tone="waiting" />}
actions={[
<Button variant="quiet" size="small">
Reconnect
</Button>,
<IconButton label="Conversation actions">
<Icon name="menu" />
</IconButton>,
]}
/>API reference
The page body keeps its own scroll.
Props
| Prop | Type | Default |
|---|---|---|
titleRequired | Child | – |
statusA short status line under the title, typically ChatStatus. | Child | – |
actions | Child | – |
Also takes className, children and the attributes and events of its root element.
DOM parts
rootidentitytitlestatusactions
Registry
The component is registered as app-bar in the meowtail component registry.