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 response

API

PropTypeDefaultDescription
childrenstringThe (possibly incomplete) markdown as the only child — pass the streaming message text directly.
classNamestringMerged 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-block component (well, copy key, highlighting); inline code stays a debossed chip. Links open in a new tab with rel="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.