A highly customizable, performant, and intelligent React chatbot component. Drop it into any project to add a powerful conversational AI interface, powered by Google Gemini, OpenAI, Anthropic (Claude), and Groq.
Here’s how beautiful and functional this chatbot can look in your React app:
🔗 Watch the full video on YouTube
This demo showcases:
- Seamless integration in React
- Clean modal and widget views
- Typing animation with customizable themes
- Usage with OpenAI/Gemini/Claude/Groq APIs
- 🤖 Multi-API Support: Integrates directly with Google Gemini, OpenAI, Anthropic (Claude), and Groq.
- 🧠 Custom Instructions: Provide a system prompt to define the bot's persona, role, and rules.
- 🚀 Model Selection: Choose the exact AI model you want to use from any supported provider (e.g.,
gemini-1.5-flash,gpt-4o-mini,claude-3-haiku,llama3-8b-8192). - 🎨 Deeply Customizable: Use a comprehensive
themeobject to control every color, font, border, and size. - 🎬 Typing Animation: Engage users with a smooth, character-by-character typing animation for bot responses.
- 🗣️ Speech-to-Text (optional) — Built-in voice input using the browser's Web Speech API for hands-free interaction.
- 📎 File Uploads (optional): Allow users to upload images and files for multi-modal conversations with compatible models (Gemini, GPT-4o, Claude 3).
- 🧩 Flexible Placement: Display as a classic corner widget or a large, focused modal.
- 💅 Markdown Rendering: Automatically renders lists, bold/italic text, headers, and more.
- 💪 Controlled & Uncontrolled Modes: Use it as a simple plug-and-play component or take full control over its state.
- ♿ Accessible: Designed with accessibility in mind, including focus management and ARIA attributes.
Install the package and its core peer dependencies from NPM.
npm install @gauravrathod674/super-customizable-chatbot @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons @fortawesome/fontawesome-svg-core framer-motion react-markdownYou also need to install the SDK for the specific AI provider you want to use. You only need to install the ones you plan to use.
# For Google Gemini
npm install @google/generative-ai
# For OpenAI
npm install openai
# For Anthropic (Claude)
npm install @anthropic-ai/sdk
# For Groq
npm install groq-sdkImport the component and its stylesheet, then render it with the appropriate API key.
import React from 'react';
import ChatBot from '@gauravrathod674/super-customizable-chatbot';
import '@gauravrathod674/super-customizable-chatbot/dist/style.css';
function App() {
const GEMINI_API_KEY = "YOUR_GEMINI_API_KEY";
return (
<ChatBot
botName="Gemini Bot"
geminiApiKey={GEMINI_API_KEY}
geminiModelName="gemini-1.5-flash"
welcomeMessage="I am powered by Gemini. How can I help?"
/>
);
}import React from 'react';
import ChatBot from '@gauravrathod674/super-customizable-chatbot';
import '@gauravrathod674/super-customizable-chatbot/dist/style.css';
function App() {
const OPENAI_API_KEY = "YOUR_OPENAI_API_KEY";
return (
<ChatBot
botName="OpenAI Bot"
openaiApiKey={OPENAI_API_KEY}
openaiModelName="gpt-4o-mini"
welcomeMessage="I am powered by OpenAI. How can I help?"
/>
);
}import React from 'react';
import ChatBot from '@gauravrathod674/super-customizable-chatbot';
import '@gauravrathod674/super-customizable-chatbot/dist/style.css';
function App() {
const ANTHROPIC_API_KEY = "YOUR_ANTHROPIC_API_KEY";
return (
<ChatBot
botName="Claude Bot"
anthropicApiKey={ANTHROPIC_API_KEY}
anthropicModelName="claude-3-haiku-20240307"
welcomeMessage="I am powered by Claude. How can I help?"
/>
);
}import React from 'react';
import ChatBot from '@gauravrathod674/super-customizable-chatbot';
import '@gauravrathod674/super-customizable-chatbot/dist/style.css';
function App() {
const GROQ_API_KEY = "YOUR_GROQ_API_KEY";
return (
<ChatBot
botName="Groq Bot"
grokApiKey={GROQ_API_KEY}
grokModelName="llama3-8b-8192"
welcomeMessage="I am powered by Groq. I am very fast. How can I help?"
/>
);
}import React from 'react';
import ChatBot from '@gauravrathod674/super-customizable-chatbot';
import '@gauravrathod674/super-customizable-chatbot/dist/style.css';
function App() {
const GEMINI_API_KEY = "YOUR_GEMINI_API_KEY";
return (
<ChatBot
botName="Gemini Bot"
geminiApiKey={GEMINI_API_KEY}
geminiModelName="gemini-1.5-flash"
enableMicrophone="enabled"
enableFileUpload={true}
fileUploadAccept="image/*,.pdf,.doc,.docx"
welcomeMessage="I am powered by Gemini. How can I help?"
/>
);
}Define a persona or set of rules for the AI using the customInstruction prop. The chatbot will adhere to this instruction throughout the conversation.
<ChatBot
botName="Pirate Bot"
openaiApiKey="YOUR_OPENAI_API_KEY"
customInstruction="You are a helpful assistant who speaks like a pirate. Keep your answers brief and witty."
welcomeMessage="Ahoy there, matey! What be yer question?"
/>The component's biggest strength is its customizability. You can override any default style by passing a theme object.
This example creates a large, centered chatbot with a blurred backdrop, a unique color scheme, and the new typing animation.
import React from 'react';
import ChatBot from '@gauravrathod674/super-customizable-chatbot';
import '@gauravrathod674/super-customizable-chatbot/dist/style.css';
function ChatPage() {
const corporateTheme = {
header: { backgroundColor: '#1e3a8a' },
messages: {
userBackgroundColor: '#2563eb',
botBackgroundColor: '#eef2ff',
botTextColor: '#1e3a8a',
animation: 'typing', // <-- Enable the typing animation
},
window: {
placement: 'center',
backdrop: true,
backdropBlur: '3px',
},
input: { focusRingColor: '#2563eb' },
launcher: { backgroundColor: '#1e3a8a' },
};
return (
<ChatBot
botName="CorpBot"
openaiApiKey="YOUR_OPENAI_API_KEY"
theme={corporateTheme}
/>
);
}The component can be customized through two main avenues: direct props for behavior and a theme object for appearance.
These props control the chatbot's functionality, identity, and AI integration.
| Prop | Type | Default | Description |
|---|---|---|---|
geminiApiKey |
string |
undefined |
Your Google Gemini API key. |
openaiApiKey |
string |
undefined |
Your OpenAI API key. |
anthropicApiKey |
string |
undefined |
Your Anthropic (Claude) API key. |
grokApiKey |
string |
undefined |
Your Groq API key. |
geminiModelName |
string |
'gemini-1.5-flash' |
The Gemini model to use. |
openaiModelName |
string |
'gpt-4o-mini' |
The OpenAI model to use. |
anthropicModelName |
string |
'claude-3-haiku-20240307' |
The Anthropic model to use. |
grokModelName |
string |
'llama3-8b-8192' |
The Groq model to use. |
customInstruction |
string |
'' |
A system prompt to define the bot's persona or behavior. |
enableMicrophone |
string |
undefined |
Any truthy string to enable the Speech-to-Text microphone. Does not require actual credentials. |
enableFileUpload |
boolean |
false |
Enables the file attachment button. |
fileUploadAccept |
string |
* |
A string of accepted file types for the upload dialog (e.g., "image/*, .pdf"). |
onFileUpload |
(file: File) => void |
() => {} |
**Callback that fires when a user selects a file. |
botName |
string |
'ChatBot' |
The name displayed in the header. |
welcomeMessage |
string |
'Hello! How can I help?' |
The initial message displayed by the bot. |
placeholderText |
string |
'Type a message...' |
The placeholder text in the input field. |
botAvatar |
React.ReactNode |
<DefaultBotIcon /> |
An icon or image URL for the bot's avatar. |
userAvatar |
React.ReactNode |
<DefaultUserIcon /> |
An icon or image URL for the user's avatar. |
isOpen |
boolean |
false |
Controls whether the chat window is open initially. |
disabled |
boolean |
false |
Disables the input field and send button. |
onSend |
(message: string) => void |
() => {} |
Callback when a user sends a message. |
theme |
object |
{} |
A theme object to customize the UI. See table below. |
messages |
Array<{id, text, sender}> |
undefined |
Advanced: A controlled array of message objects. |
isTyping |
boolean |
false |
Advanced: Manually controls the bot's typing indicator. |
Pass a theme object to customize the chatbot's appearance. Any property you don't provide will fall back to its default value.
| Path | Type | Default | Description |
|---|---|---|---|
launcher.backgroundColor |
string |
'#4f46e5' |
Background color of the launcher button. |
launcher.iconColor |
string |
'#ffffff' |
Color of the icon inside the launcher. |
launcher.size |
string |
'3.5rem' |
The width and height of the launcher button. |
| Path | Type | Default | Description |
|---|---|---|---|
window.placement |
string |
'bottom-right' |
Position on screen. Options: 'bottom-right', 'bottom-left', 'center'. |
window.width |
string |
'22rem' |
Width of the chat window. (Defaults to '80vw' if placement is 'center'). |
window.height |
string |
'30rem' |
Height of the chat window. (Defaults to '80vh' if placement is 'center'). |
window.backgroundColor |
string |
'#ffffff' |
Background color of the main chat window. |
window.borderColor |
string |
'#e5e7eb' |
Border color of the main chat window. |
window.borderRadius |
string |
'0.75rem' |
Border radius of the main chat window. |
window.backdrop |
boolean |
false |
Show blurred backdrop (only for 'center' placement). |
window.backdropColor |
string |
'rgba(0,0,0,0.4)' |
Color of the backdrop overlay. |
window.backdropBlur |
string |
'4px' |
CSS blur value for the backdrop. |
window.scrollbarThumbColor |
string |
'#a1a1aa' |
Color of the message list's scrollbar thumb. |
window.scrollbarTrackColor |
string |
'#f1f5f9' |
Color of the message list's scrollbar track. |
| Path | Type | Default | Description |
|---|---|---|---|
header.backgroundColor |
string |
'#4f46e5' |
Background color of the header. |
header.textColor |
string |
'#ffffff' |
Text color for the bot's name in the header. |
header.fontFamily |
string |
'inherit' |
Font family for the header text. |
header.fontWeight |
string |
'600' |
Font weight for the header text. |
| Path | Type | Default | Description |
|---|---|---|---|
messages.userBackgroundColor |
string |
'#4f46e5' |
Background color for user message bubbles. |
messages.userTextColor |
string |
'#ffffff' |
Text color for user messages. |
messages.botBackgroundColor |
string |
'#f3f4f6' |
Background color for bot message bubbles. |
messages.botTextColor |
string |
'#1f2937' |
Text color for bot messages. |
messages.fontFamily |
string |
'inherit' |
Font family for all message text. |
messages.fontSize |
string |
'0.9rem' |
Font size for all message text. |
messages.showAvatars |
boolean |
true |
Whether to display avatars next to messages. |
messages.bubbleShape |
string |
'rounded' |
Shape of bubbles. Options: 'rounded', 'square'. |
messages.bubblePointer |
boolean |
true |
Show a small pointer on the message bubbles. |
messages.animation |
string |
'fade-in' |
Bot response animation. Options: 'fade-in', 'typing', 'slide-up', 'zoom-in', 'flip', 'none'. |
| Path | Type | Default | Description |
|---|---|---|---|
markdownStyles.boldColor |
string |
inherit |
Color for **bold** text. |
markdownStyles.italicColor |
string |
inherit |
Color for *italic* text. |
markdownStyles.linkColor |
string |
'#3b82f6' |
Color for [links](...). |
markdownStyles.codeColor |
string |
inherit |
Text color for inline code. |
markdownStyles.codeBackgroundColor |
string |
rgba(0,0,0,0.1) |
Background color for inline code. |
| Path | Type | Default | Description |
|---|---|---|---|
input.backgroundColor |
string |
'#ffffff' |
Background color for the input footer area. |
input.textColor |
string |
'#1f2937' |
Text color for the user's typed input. |
input.placeholderTextColor |
string |
'#9ca3af' |
Color of the placeholder text. |
input.borderColor |
string |
'#e5e7eb' |
Border color for the text input field. |
input.focusRingColor |
string |
'#4f46e5' |
Color of the focus ring when the input is selected. |
This project is licensed under the MIT License.
