import { ComposerPrimitiveAddAttachmentProps, ComposerPrimitiveAttachmentByIndexProps, ComposerPrimitiveAttachmentDropzoneProps, ComposerPrimitiveAttachmentsProps, ComposerPrimitiveCancelProps, ComposerPrimitiveDictateProps, ComposerPrimitiveDictationTranscriptProps, ComposerPrimitiveIfProps, ComposerPrimitiveInputProps, ComposerPrimitiveQueueProps, ComposerPrimitiveQuoteDismissProps, ComposerPrimitiveQuoteProps, ComposerPrimitiveQuoteTextProps, ComposerPrimitiveRootProps, ComposerPrimitiveSendProps, ComposerPrimitiveStopDictationProps, ComposerPrimitiveUnstable_TriggerPopoverBackProps, ComposerPrimitiveUnstable_TriggerPopoverCategoriesProps, ComposerPrimitiveUnstable_TriggerPopoverCategoryItemProps, ComposerPrimitiveUnstable_TriggerPopoverItemProps, ComposerPrimitiveUnstable_TriggerPopoverItemsProps, ComposerPrimitiveUnstable_TriggerPopoverProps, ComposerPrimitiveUnstable_TriggerPopoverRootProps } from "@/generated/typeDocs";
import { ComposerPrimitive as ComposerPrimitiveDocs } from "@/generated/primitiveDocs";
{/* AUTO-GENERATED PAGE by scripts/generate-api-reference.mts /}
{/ Do not edit manually. */}
For examples and usage patterns, see Composer.
{/* api-manual */}
Anatomy#
import { ComposerPrimitive } from "@assistant-ui/react";
// creating a new message
const Composer = () => (
<ComposerPrimitive.Root>
<ComposerPrimitive.AttachmentDropzone>
<ComposerPrimitive.Quote>
<ComposerPrimitive.QuoteText />
<ComposerPrimitive.QuoteDismiss />
</ComposerPrimitive.Quote>
<ComposerPrimitive.Attachments />
<ComposerPrimitive.AddAttachment />
<ComposerPrimitive.Input />
<ComposerPrimitive.Send />
</ComposerPrimitive.AttachmentDropzone>
</ComposerPrimitive.Root>
);
// editing an existing message
const EditComposer = () => (
<ComposerPrimitive.Root>
<ComposerPrimitive.Input />
<ComposerPrimitive.Send />
<ComposerPrimitive.Cancel />
</ComposerPrimitive.Root>
);
// with voice input (dictation)
const ComposerWithDictation = () => (
<ComposerPrimitive.Root>
<ComposerPrimitive.Input />
<AuiIf condition={(s) => s.composer.dictation == null}>
<ComposerPrimitive.Dictate />
</AuiIf>
<AuiIf condition={(s) => s.composer.dictation != null}>
<ComposerPrimitive.StopDictation />
</AuiIf>
<ComposerPrimitive.Send />
</ComposerPrimitive.Root>
);
{/* api-manual */}
{/* api-reference /}
{/ AUTO-GENERATED by scripts/generate-api-reference.mts /}
{/ Do not edit this block manually. */}
API Reference#
Root#
{ComposerPrimitiveDocs.Root?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Root.deprecated}
)}
{ComposerPrimitiveDocs.Root?.description}
{ComposerPrimitiveDocs.Root?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Root?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveRootProps} />
Input#
{ComposerPrimitiveDocs.Input?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Input.deprecated}
)}
{ComposerPrimitiveDocs.Input?.description}
{ComposerPrimitiveDocs.Input?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Input?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveInputProps} />
{/* api-manual.Input */}
Keyboard Shortcuts#
Default (submitMode="enter"):
| Key | Description |
|---|---|
| Enter | Sends the message. |
| Shift + Enter | Inserts a newline. |
| Escape | Sends a cancel action. |
With submitMode="ctrlEnter":
| Key | Description |
|---|---|
| Ctrl/Cmd + Enter | Sends the message. |
| Enter | Inserts a newline. |
| Escape | Sends a cancel action. |
With submitMode="none":
| Key | Description |
|---|---|
| Enter | Inserts a newline (no keyboard submission). |
| Escape | Sends a cancel action. |
Touch-primary devices#
Pass unstable_insertNewlineOnTouchEnter to make plain Enter insert a newline on phones and tablets without a hardware keyboard, detected via the (pointer: coarse) and (not (any-pointer: fine)) media query. Messages then dispatch only via the explicit Send button, matching the chat-input convention used by WhatsApp, Slack, Discord, iMessage, ChatGPT, and Claude.ai.
<ComposerPrimitive.Input
placeholder="Ask anything..."
unstable_insertNewlineOnTouchEnter
/>
Only takes effect when submitMode resolves to "enter" (the default); "ctrlEnter" and "none" are unchanged, so a tablet paired with a hardware keyboard can still submit via Cmd/Ctrl+Enter.
{/* api-manual.Input */}
Send#
{ComposerPrimitiveDocs.Send?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Send.deprecated}
)}
{ComposerPrimitiveDocs.Send?.description}
{ComposerPrimitiveDocs.Send?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Send?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveSendProps} />
Cancel#
{ComposerPrimitiveDocs.Cancel?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Cancel.deprecated}
)}
{ComposerPrimitiveDocs.Cancel?.description}
{ComposerPrimitiveDocs.Cancel?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Cancel?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveCancelProps} />
AddAttachment#
{ComposerPrimitiveDocs.AddAttachment?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.AddAttachment.deprecated}
)}
{ComposerPrimitiveDocs.AddAttachment?.description}
{ComposerPrimitiveDocs.AddAttachment?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.AddAttachment?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveAddAttachmentProps} />
Attachments#
{ComposerPrimitiveDocs.Attachments?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Attachments.deprecated}
)}
{ComposerPrimitiveDocs.Attachments?.description}
{ComposerPrimitiveDocs.Attachments?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Attachments?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveAttachmentsProps} />
AttachmentByIndex#
{ComposerPrimitiveDocs.AttachmentByIndex?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.AttachmentByIndex.deprecated}
)}
{ComposerPrimitiveDocs.AttachmentByIndex?.description}
{ComposerPrimitiveDocs.AttachmentByIndex?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.AttachmentByIndex?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveAttachmentByIndexProps} />
AttachmentDropzone#
{ComposerPrimitiveDocs.AttachmentDropzone?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.AttachmentDropzone.deprecated}
)}
{ComposerPrimitiveDocs.AttachmentDropzone?.description}
{ComposerPrimitiveDocs.AttachmentDropzone?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.AttachmentDropzone?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveAttachmentDropzoneProps} />
{/* api-manual.AttachmentDropzone */}
| Data attribute | Values |
|---|---|
[data-dragging] | Present while a file is being dragged over the dropzone. |
| {/* api-manual.AttachmentDropzone */} |
Dictate#
{ComposerPrimitiveDocs.Dictate?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Dictate.deprecated}
)}
{ComposerPrimitiveDocs.Dictate?.description}
{ComposerPrimitiveDocs.Dictate?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Dictate?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveDictateProps} />
StopDictation#
{ComposerPrimitiveDocs.StopDictation?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.StopDictation.deprecated}
)}
{ComposerPrimitiveDocs.StopDictation?.description}
{ComposerPrimitiveDocs.StopDictation?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.StopDictation?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveStopDictationProps} />
DictationTranscript#
{ComposerPrimitiveDocs.DictationTranscript?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.DictationTranscript.deprecated}
)}
{ComposerPrimitiveDocs.DictationTranscript?.description}
{ComposerPrimitiveDocs.DictationTranscript?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.DictationTranscript?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveDictationTranscriptProps} />
If#
{ComposerPrimitiveDocs.If?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.If.deprecated}
)}
{ComposerPrimitiveDocs.If?.description}
{ComposerPrimitiveDocs.If?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.If?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveIfProps} />
Quote#
{ComposerPrimitiveDocs.Quote?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Quote.deprecated}
)}
{ComposerPrimitiveDocs.Quote?.description}
{ComposerPrimitiveDocs.Quote?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Quote?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveQuoteProps} />
QuoteText#
{ComposerPrimitiveDocs.QuoteText?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.QuoteText.deprecated}
)}
{ComposerPrimitiveDocs.QuoteText?.description}
{ComposerPrimitiveDocs.QuoteText?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.QuoteText?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveQuoteTextProps} />
QuoteDismiss#
{ComposerPrimitiveDocs.QuoteDismiss?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.QuoteDismiss.deprecated}
)}
{ComposerPrimitiveDocs.QuoteDismiss?.description}
{ComposerPrimitiveDocs.QuoteDismiss?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.QuoteDismiss?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveQuoteDismissProps} />
Queue#
{ComposerPrimitiveDocs.Queue?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Queue.deprecated}
)}
{ComposerPrimitiveDocs.Queue?.description}
{ComposerPrimitiveDocs.Queue?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Queue?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveQueueProps} />
Unstable_TriggerPopover#
{ComposerPrimitiveDocs.Unstable_TriggerPopover?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopover.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopover?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopover?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopover?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverProps} />
{/* api-manual.Unstable_TriggerPopover */}
| Data attribute | Values |
|---|---|
[data-state] | "open" when the trigger popover is open. |
| {/* api-manual.Unstable_TriggerPopover */} |
Unstable_TriggerPopoverRoot#
{ComposerPrimitiveDocs.Unstable_TriggerPopoverRoot?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopoverRoot.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverRoot?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverRoot?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopoverRoot?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverRootProps} />
Unstable_TriggerPopoverCategories#
{ComposerPrimitiveDocs.Unstable_TriggerPopoverCategories?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopoverCategories.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverCategories?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverCategories?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopoverCategories?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverCategoriesProps} />
Unstable_TriggerPopoverCategoryItem#
{ComposerPrimitiveDocs.Unstable_TriggerPopoverCategoryItem?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopoverCategoryItem.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverCategoryItem?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverCategoryItem?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopoverCategoryItem?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverCategoryItemProps} />
{/* api-manual.Unstable_TriggerPopoverCategoryItem */}
| Data attribute | Values |
|---|---|
[data-highlighted] | Present when keyboard-highlighted. |
| {/* api-manual.Unstable_TriggerPopoverCategoryItem */} |
Unstable_TriggerPopoverItems#
{ComposerPrimitiveDocs.Unstable_TriggerPopoverItems?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopoverItems.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverItems?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverItems?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopoverItems?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverItemsProps} />
Unstable_TriggerPopoverItem#
{ComposerPrimitiveDocs.Unstable_TriggerPopoverItem?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopoverItem.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverItem?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverItem?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopoverItem?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverItemProps} />
{/* api-manual.Unstable_TriggerPopoverItem */}
| Data attribute | Values |
|---|---|
[data-highlighted] | Present when keyboard-highlighted. |
| {/* api-manual.Unstable_TriggerPopoverItem */} |
Unstable_TriggerPopoverBack#
{ComposerPrimitiveDocs.Unstable_TriggerPopoverBack?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_TriggerPopoverBack.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverBack?.description}
{ComposerPrimitiveDocs.Unstable_TriggerPopoverBack?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_TriggerPopoverBack?.element}>`} element unless asChild is set.
<ParametersTable {...ComposerPrimitiveUnstable_TriggerPopoverBackProps} />
Unstable_RegisteredTrigger#
{ComposerPrimitiveDocs.Unstable_RegisteredTrigger?.deprecated && (
Deprecated. {ComposerPrimitiveDocs.Unstable_RegisteredTrigger.deprecated}
)}
{ComposerPrimitiveDocs.Unstable_RegisteredTrigger?.description}
{ComposerPrimitiveDocs.Unstable_RegisteredTrigger?.element && (
This primitive renders a {`<${ComposerPrimitiveDocs.Unstable_RegisteredTrigger?.element}>`} element unless asChild is set.
{ComposerPrimitiveDocs.Unstable_RegisteredTrigger?.props && (
)}
{/* api-reference */}