Components
Composer
A product-grade form shell for creating or editing work without turning every field into another bordered box.
Complete composer
The shell provides hierarchy, scrolling, responsive geometry, and action regions. Title and description are normal form controls in borderless mode, so submission and accessibility stay native.
import { Button, Composer, PropertyPill } from "@karnstack/dowel";
<Composer.Root aria-label="Create work item" onSubmit={createItem}>
<Composer.Header>
<PropertyPill label="Workspace" tone="accent" />
<Button size="sm" variant="muted">Save draft</Button>
</Composer.Header>
<Composer.Body>
<Composer.Title name="title" placeholder="Add title" />
<Composer.Description
name="description"
placeholder="What needs to change, and why?"
/>
</Composer.Body>
<Composer.Properties>
<PropertyPill label="Triage" />
<PropertyPill label="Priority" />
<PropertyPill label="Assignee" />
<PropertyPill label="Project" />
<PropertyPill label="Labels" />
</Composer.Properties>
<Composer.Footer>
<PropertyPill label="More actions" />
<Composer.Actions>
<Button variant="primary" type="submit">Create item</Button>
</Composer.Actions>
</Composer.Footer>
</Composer.Root>Property pills
PropertyPill is a compact trigger for status, priority, assignee, project, labels, dates, and similar metadata. Wrap it with a picker primitive when the property is editable.
<PropertyPill label="Status" />
<PropertyPill label="Selected" active />
<PropertyPill label="Workspace" tone="accent" />
<PropertyPill label="Blocked" tone="danger" />Anatomy
Header, Body, Properties, Footer, and Actions are layout contracts. Title and Description are the opinionated borderless controls. A Divider can separate structured content inside the editing region.