You
Why did deploy 42 take longer than usual?
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 UserMessage 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 User Message
npm i @grassroot/ui-headless-react
data-slot="assistant-user-message" 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 User Message composes into. The import for Assistant User Message itself is under Show code.
packages/ui/react/src/assistant.ts
import { UserMessage } from "@grassroot/ui-react/assistant";
packages/ui/vue/src/assistant.ts
import { UserMessage } from "@grassroot/ui-vue/assistant";
packages/ui/angular/src/assistant.ts
import { GrassrootAssistantUserMessage } from "@grassroot/ui-angular/assistant";
packages/ui/svelte/src/assistant.ts
import { UserMessage } from "@grassroot/ui-svelte/assistant";
packages/ui/solid/src/assistant.ts
import { UserMessage } 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-*.