Assistant
A streamed answer.
DocsPlatform
One assistant-ui behaviour contract, shared by every layer on this page and by all five framework adapters. Where a machine exists it holds the state and nothing else. The headless layer turns that into accessible DOM, and the styled layer is where tokens finally get involved.
The styled React MessageTiming with a focused fixture — the component this page documents,
not the shared showcase. Five-framework parity is demonstrated once, by the Thread demo
below and on the Thread page.
Machine is state with no framework attached, headless adds the accessible anatomy on top, and styled adds Grassroot's own visual recipe. This component has no statechart machine of its own, so its headless layer is where the contract starts.
Install Assistant Message Timing
npm i @grassroot/ui-headless-react
data-slot="assistant-message-timing" or its documented sub-slot.The public names stay aligned across React, Vue, Angular, Svelte and Solid. Each tab mounts that framework's real assistant package showing the shared Thread composition — the conversation surface Assistant Message Timing composes into. The import for Assistant Message Timing itself is under Show code.
packages/ui/react/src/assistant.ts
import { MessageTiming } from "@grassroot/ui-react/assistant";
packages/ui/vue/src/assistant.ts
import { MessageTiming } from "@grassroot/ui-vue/assistant";
packages/ui/angular/src/assistant.ts
import { GrassrootMessageTiming } from "@grassroot/ui-angular/assistant";
packages/ui/svelte/src/assistant.ts
import { MessageTiming } from "@grassroot/ui-svelte/assistant";
packages/ui/solid/src/assistant.ts
import { MessageTiming } from "@grassroot/ui-solid/assistant";
The names come from assistant-ui's own component vocabulary, but the packages are Grassroot's:
runtime state lives in @grassroot/assistant, the DOM contracts live in the headless
adapters, and the visual recipes live in @grassroot/ui-*.