Response
Renders an assistant's markdown as flat seam prose — hardened so a half-arrived response never flashes broken markup mid-stream.
Springs beat durations because they carry velocity. A few consequences:
- an interrupted animation redirects smoothly
- release always settles naturally
- there is no fixed clock to fight
Inline code like springs.press stays debossed, and blocks get a well:
ts
whileTap={reduceMotion ? reduced.pressed : depth.pressed}Reduced motion swaps movement for opacity — it never removes feedback.
tsx
import { Response } from "@/registry/seam/ui/response"
const MARKDOWN = `Springs beat durations because they carry **velocity**. A few consequences:
- an interrupted animation redirects smoothly
- release always settles naturally
- there is no fixed clock to fight
Inline code like \`springs.press\` stays debossed, and blocks get a well:
\`\`\`ts
whileTap={reduceMotion ? reduced.pressed : depth.pressed}
\`\`\`
> Reduced motion swaps movement for opacity — it never removes feedback.`
export default function ResponseDemo() {
return (
<div className="w-full max-w-md">
<Response>{MARKDOWN}</Response>
</div>
)
}bunx --bun @seamui/cli@latest add responseAPI
| Prop | Type | Default | Description |
|---|---|---|---|
| children | string | — | The (possibly incomplete) markdown as the only child — pass the streaming message text directly. |
| className | string | — | Merged onto the prose container. |
Plus all native <div> props except children, which must be a string.
Notes
- Built on
react-markdown+remark-gfm; an unterminated code fence is auto-closed each frame, so streaming tokens stay renderable and never flash broken markup. - Static by design: streamed text appends with no per-character animation (explicitly forbidden in seamui) and no layout springs — the sense of life comes from the Conversation viewport following along, which makes the reduced-motion story trivial.
- Fenced code renders through the seam
code-blockcomponent (well, copy key, highlighting); inline code stays a debossed chip. Links open in a new tab withrel="noreferrer"; wide code and tables scroll in their own containers. - Semantic HTML is preserved (headings, lists, tables). Announcement of streamed content is the Conversation's responsibility, so Response stays quiet to avoid double-announcing.
Press feedback, reduced motion, and haptics follow the global policy — see Motion and Haptics.