examples/v2/docs/reference/copilot-chat-suggestion-view.mdx
CopilotChatSuggestionView is the default component used by CopilotChat to render clickable suggestion chips. These chips provide quick actions that users can click to send predefined messages.
The CopilotChatSuggestionView component:
CopilotChatSuggestionView provides slots for customizing the container and individual chips:
graph LR
SV[CopilotChatSuggestionView] --> container
SV --> suggestion
| Slot | Description |
|---|---|
container | The outer container that holds all suggestion chips |
suggestion | Individual suggestion chip (pill button) |
Customize suggestions through the suggestionView prop on CopilotChat:
<CopilotChat
suggestionView={{
container: "gap-4",
suggestion: "bg-blue-100 hover:bg-blue-200 text-blue-800",
}}
/>
Suggestions are managed through the useSuggestions hook, which:
You don't need to manage suggestions manually - CopilotChat handles this automatically.
CopilotChatSuggestionView uses the slot system. Each slot accepts four types of values:
Style the suggestions container:
<CopilotChat
suggestionView={{
container: "flex-wrap gap-2 justify-center",
}}
/>
Style individual suggestion chips:
<CopilotChat
suggestionView={{
suggestion:
"bg-gradient-to-r from-blue-500 to-purple-500 text-white px-4 py-2 rounded-full",
}}
/>
Or with a props object:
<CopilotChat
suggestionView={{
suggestion: {
className: "bg-indigo-100 text-indigo-800 font-medium",
},
}}
/>
To completely replace the suggestion view with your own component:
import { CopilotChatSuggestionView } from "@copilotkit/react-core";
function CustomSuggestionView({ suggestions, onSelectSuggestion, ...props }) {
return (
<div className="custom-suggestions-wrapper">
<CopilotChatSuggestionView
suggestions={suggestions}
onSelectSuggestion={onSelectSuggestion}
container="gap-3"
suggestion="bg-white shadow-md hover:shadow-lg rounded-xl px-4 py-2"
{...props}
/>
</div>
);
}
<CopilotChat suggestionView={CustomSuggestionView} />;
For full layout control, use the children render function:
function CustomSuggestionView(props) {
return (
<CopilotChatSuggestionView {...props}>
{({ suggestions, onSelectSuggestion }) => (
<div className="grid grid-cols-2 gap-2 p-4">
{suggestions.map((suggestion, index) => (
<button
key={index}
onClick={() => onSelectSuggestion(suggestion, index)}
className="p-3 bg-white border rounded-lg hover:bg-gray-50 text-left"
>
{suggestion.title}
</button>
))}
</div>
)}
</CopilotChatSuggestionView>
);
}
<CopilotChat suggestionView={CustomSuggestionView} />;
The render function receives:
| Property | Type | Description |
|---|---|---|
container | ReactElement | The bound container element |
suggestion | ReactElement | A sample bound suggestion chip |
suggestions | Suggestion[] | Array of suggestion objects |
onSelectSuggestion | (suggestion, index) => void | Callback when suggestion is clicked |
loadingIndexes | ReadonlyArray<number> | Indexes of suggestions currently loading |
Individual suggestions can show loading states when clicked:
// Suggestions automatically show loading states when:
// 1. The suggestion is clicked and processing
// 2. The suggestion has isLoading: true in its data
The loading state is indicated by a spinner or visual feedback on the chip.
<CopilotChat
suggestionView={{
container: "flex flex-wrap gap-2",
suggestion:
"rounded-full bg-gray-100 hover:bg-gray-200 px-4 py-1.5 text-sm",
}}
/>
<CopilotChat
suggestionView={{
container: "grid grid-cols-2 gap-3",
suggestion:
"bg-white shadow-sm border rounded-xl p-3 hover:shadow-md text-left",
}}
/>
<CopilotChat
suggestionView={{
suggestion:
"bg-gradient-to-r from-pink-500 to-orange-500 text-white hover:from-pink-600 hover:to-orange-600",
}}
/>
<CopilotChat
suggestionView={{
container: "gap-1",
suggestion:
"text-blue-600 hover:text-blue-800 underline underline-offset-2 bg-transparent",
}}
/>
<CopilotChat
suggestionView={{
container: "flex justify-center flex-wrap gap-2",
suggestion:
"bg-blue-50 text-blue-700 hover:bg-blue-100 rounded-lg px-3 py-1.5",
}}
/>