A lightweight, headless React component library for building AI-powered chat interfaces. No CSS included—style it your way.
- 🎯 Headless components - Bring your own styles
- 🔄 Streaming support - Real-time AI responses via AsyncIterables
- ⚡ TypeScript first - Full type safety out of the box
- 📦 Tiny bundle - Zero styling overhead
- 🎨 Fully customizable - Complete control over appearance
- 🪝 React 18+ - Built for modern React
Using Bun (recommended)
bun add @contentagen/assistant-widget Using npm
npm install @contentagen/assistant-widget Using pnpm
pnpm add @contentagen/assistant-widget Using yarn
yarn add @contentagen/assistant-widget
import { ContentaChat } from '@contentagen/assistant-widget';
function App() { const handleSendMessage = async function* (message: string, agentId: string) { // Your streaming API implementation const response = await fetch(https://api.yourservice.com/chat/${agentId}, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message }) });
text const reader = response.body?.getReader(); const decoder = new TextDecoder();
while (true) { const { done, value } = await reader.read(); if (done) break; yield decoder.decode(value); }
};
return ( ); }
import { ContentaWidget } from '@contentagen/assistant-widget';
function App() { const handleSendMessage = async function* (message: string, agentId: string) { // Your streaming implementation // ... };
return ( ); }
text
Full-screen chat interface component.
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
agentId |
string |
✅ | - | Your AI agent identifier |
sendMessage |
(message: string, agentId: string) => AsyncIterable<string> |
✅ | - | Async generator function for streaming responses |
placeholder |
string |
❌ | "Digite sua mensagem..." |
Input placeholder text |
disabled |
boolean |
❌ | false |
Disable the input field |
autoFocus |
boolean |
❌ | false |
Auto-focus input on mount |
maxLength |
number |
❌ | 500 |
Maximum message length |
showTimestamps |
boolean |
❌ | false |
Show message timestamps |
showAvatars |
boolean |
❌ | false |
Show user/assistant avatars |
allowMultiline |
boolean |
❌ | true |
Allow multiline messages (Shift+Enter) |
className |
string |
❌ | "max-w-md" |
Additional CSS classes |
errorMessage |
string |
❌ | "Desculpe, ocorreu um erro..." |
Custom error message |
Chat widget with popover trigger button. Inherits all ContentaChat props.
This library is headless and does not include any CSS. You have complete control over styling using:
- Tailwind CSS classes via
classNameprop - CSS Modules
- Styled Components
- Emotion
- Plain CSS
The components use semantic HTML and follow accessibility best practices.
text
Full TypeScript definitions are included. Import types as needed:
import type { ContentaChatProps } from '@contentagen/assistant-widget';
const MyComponent: React.FC = (props) => { // Your component logic };
text
- React 18.0.0 or higher
- React DOM 18.0.0 or higher
Apache-2.0
Contributions are welcome! Please feel free to submit a Pull Request.
For issues and questions, please open an issue on GitHub.
Built with ❤️ using TypeScript, React, and Bun