chatx-ai 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -153
- package/dist/index.d.mts +0 -8
- package/dist/index.d.ts +0 -8
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://res.cloudinary.com/dyshj7mor/image/upload/v1768318108/ChatX_l93isn.png" alt="ChatX-AI.Logo" width="200" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
# ChatX-AI || AI ChatBot SDK
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/chatx-ai)
|
|
4
8
|
[](https://opensource.org/licenses/MIT)
|
|
5
9
|
|
|
6
|
-
|
|
10
|
+
ChatX AI is a flexible and reusable SDK designed for integrating advanced AI-powered chatbots into React applications. Powered by the Google Gemini API, it enables developers to quickly add conversational AI features with minimal setup and maximum customization.
|
|
11
|
+
|
|
12
|
+
- **Seamless React integration**
|
|
13
|
+
- **Powered by Google Gemini for state-of-the-art AI conversations**
|
|
14
|
+
- **Customizable and extensible for various chatbot use-cases**
|
|
15
|
+
- **Easy to set up and use in any modern React project**
|
|
7
16
|
|
|
8
|
-
|
|
17
|
+
Get started building intelligent chatbots for your apps today!
|
|
9
18
|
|
|
10
|
-
|
|
11
|
-
- ⚛️ **React 18+** - Built with modern React and TypeScript
|
|
12
|
-
- 🎨 **Pre-styled UI** - Beautiful, responsive design out of the box
|
|
13
|
-
- 🔧 **Flexible Configuration** - Props or environment variables
|
|
14
|
-
- 📦 **Universal Module** - ESM and CommonJS support
|
|
15
|
-
- 💾 **Chat History** - Automatic localStorage persistence
|
|
16
|
-
- 🤖 **Google Gemini AI** - Powered by cutting-edge AI
|
|
17
|
-
- 🎯 **TypeScript** - Full type safety and IntelliSense
|
|
18
|
-
- 📱 **Responsive** - Mobile and desktop optimized
|
|
19
|
-
- 🔐 **Secure** - API key fallback to environment variables
|
|
19
|
+
---
|
|
20
20
|
|
|
21
21
|
## 📦 Installation
|
|
22
22
|
|
|
23
|
+
Install the package using your preferred package manager:
|
|
24
|
+
|
|
23
25
|
```bash
|
|
24
26
|
npm install chatx-ai
|
|
25
27
|
# or
|
|
@@ -28,106 +30,100 @@ yarn add chatx-ai
|
|
|
28
30
|
pnpm add chatx-ai
|
|
29
31
|
```
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🚀 Integration Guide
|
|
32
36
|
|
|
33
37
|
### 1. Get Your Gemini API Key
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
To use this SDK, you need a Google Gemini API key. Follow these steps:
|
|
40
|
+
|
|
41
|
+
1. Visit the [Google AI Studio](https://makersuite.google.com/app/apikey).
|
|
42
|
+
2. Log in with your Google account.
|
|
43
|
+
3. Generate a new API key.
|
|
44
|
+
4. Copy the API key for use in your project.
|
|
45
|
+
|
|
46
|
+
---
|
|
36
47
|
|
|
37
48
|
### 2. Add Environment Variables
|
|
38
49
|
|
|
39
|
-
Create `.env.local` in your project
|
|
50
|
+
Create a `.env.local` file in the root of your project and add the following variables:
|
|
40
51
|
|
|
41
52
|
```env
|
|
42
53
|
NEXT_PUBLIC_GEMINI_API_KEY=your-api-key-here
|
|
43
54
|
NEXT_PUBLIC_AI_BOT_NAME=My Assistant
|
|
44
|
-
NEXT_PUBLIC_SYSTEM_INSTRUCTION=You are a
|
|
55
|
+
NEXT_PUBLIC_SYSTEM_INSTRUCTION= You are a customer support assistant for Acme Corp. Help users with their questions about our products and services.
|
|
56
|
+
|
|
45
57
|
```
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
> **Note:** Never expose sensitive data like API keys directly in your code. Always use environment variables.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
### 3. Integration in Next.js
|
|
64
|
+
|
|
65
|
+
To use the chatbot in a **Next.js** application, follow these steps:
|
|
66
|
+
|
|
67
|
+
#### Import and Use the Component
|
|
48
68
|
|
|
49
69
|
```tsx
|
|
70
|
+
// filepath: pages/index.tsx
|
|
50
71
|
import ChatBot from "chatx-ai";
|
|
51
72
|
|
|
52
|
-
export default function
|
|
73
|
+
export default function Home() {
|
|
53
74
|
return (
|
|
54
75
|
<div>
|
|
55
76
|
<h1>Welcome to My Site</h1>
|
|
56
|
-
<ChatBot
|
|
77
|
+
<ChatBot
|
|
78
|
+
apiKey={process.env.NEXT_PUBLIC_GEMINI_API_KEY}
|
|
79
|
+
botName={process.env.NEXT_PUBLIC_AI_BOT_NAME}
|
|
80
|
+
systemInstruction={process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION}
|
|
81
|
+
/>
|
|
57
82
|
</div>
|
|
58
83
|
);
|
|
59
84
|
}
|
|
60
85
|
```
|
|
61
86
|
|
|
62
|
-
|
|
87
|
+
---
|
|
63
88
|
|
|
64
|
-
|
|
89
|
+
### 4. Integration in React
|
|
65
90
|
|
|
66
|
-
|
|
91
|
+
To use the chatbot in a **React** application, follow these steps:
|
|
67
92
|
|
|
68
|
-
|
|
69
|
-
import ChatBot from "chatx-ai";
|
|
93
|
+
#### Add Environment Variables
|
|
70
94
|
|
|
71
|
-
|
|
72
|
-
return <ChatBot />;
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Advanced Usage (Props)
|
|
95
|
+
In React, environment variables must start with `REACT_APP_`. Update your `.env` file as follows:
|
|
77
96
|
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return (
|
|
83
|
-
<ChatBot
|
|
84
|
-
apiKey="your-gemini-api-key"
|
|
85
|
-
botName="Customer Support Bot"
|
|
86
|
-
systemInstruction="You are a customer support assistant for Acme Corp. Help users with their questions about our products and services."
|
|
87
|
-
/>
|
|
88
|
-
);
|
|
89
|
-
}
|
|
97
|
+
```env
|
|
98
|
+
REACT_APP_GEMINI_API_KEY=your-api-key-here
|
|
99
|
+
REACT_APP_AI_BOT_NAME=My Assistant
|
|
100
|
+
REACT_APP_SYSTEM_INSTRUCTION=You are a helpful assistant.
|
|
90
101
|
```
|
|
91
102
|
|
|
92
|
-
|
|
103
|
+
#### Import and Use the Component
|
|
93
104
|
|
|
94
105
|
```tsx
|
|
106
|
+
// filepath: src/App.tsx
|
|
95
107
|
import ChatBot from "chatx-ai";
|
|
96
108
|
|
|
97
|
-
|
|
109
|
+
function App() {
|
|
98
110
|
return (
|
|
99
111
|
<div>
|
|
100
|
-
<h1>Welcome
|
|
112
|
+
<h1>Welcome to My App</h1>
|
|
101
113
|
<ChatBot
|
|
102
|
-
apiKey={
|
|
103
|
-
botName={
|
|
104
|
-
systemInstruction={
|
|
114
|
+
apiKey={process.env.REACT_APP_GEMINI_API_KEY}
|
|
115
|
+
botName={process.env.REACT_APP_AI_BOT_NAME}
|
|
116
|
+
systemInstruction={process.env.REACT_APP_SYSTEM_INSTRUCTION}
|
|
105
117
|
/>
|
|
106
118
|
</div>
|
|
107
119
|
);
|
|
108
120
|
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## 🎛️ API Reference
|
|
112
121
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
| Prop | Type | Required | Default | Description |
|
|
116
|
-
| ------------------- | -------- | -------- | --------------------------------------------------------- | ----------------------------------- |
|
|
117
|
-
| `apiKey` | `string` | No | `process.env.NEXT_PUBLIC_GEMINI_API_KEY` | Google Gemini API key |
|
|
118
|
-
| `botName` | `string` | No | `process.env.NEXT_PUBLIC_AI_BOT_NAME` or `"AI Assistant"` | Display name for the bot |
|
|
119
|
-
| `systemInstruction` | `string` | No | `process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION` | System prompt to guide bot behavior |
|
|
120
|
-
|
|
121
|
-
### TypeScript Types
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
interface ChatBotProps {
|
|
125
|
-
apiKey?: string;
|
|
126
|
-
botName?: string;
|
|
127
|
-
systemInstruction?: string;
|
|
128
|
-
}
|
|
122
|
+
export default App;
|
|
129
123
|
```
|
|
130
124
|
|
|
125
|
+
---
|
|
126
|
+
|
|
131
127
|
## 🌍 Environment Variables
|
|
132
128
|
|
|
133
129
|
| Variable | Description | Required |
|
|
@@ -136,105 +132,38 @@ interface ChatBotProps {
|
|
|
136
132
|
| `NEXT_PUBLIC_AI_BOT_NAME` | The bot's display name | No |
|
|
137
133
|
| `NEXT_PUBLIC_SYSTEM_INSTRUCTION` | Instructions for the bot's behavior | No |
|
|
138
134
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
- **[Quick Start Guide](./QUICKSTART.md)** - Get up and running in 5 minutes
|
|
142
|
-
- **[Usage Examples](./USAGE.md)** - Detailed examples and use cases
|
|
143
|
-
- **[Integration Guide](./INTEGRATION_GUIDE.md)** - SaaS/PaaS integration patterns
|
|
144
|
-
|
|
145
|
-
## 💡 Use Cases
|
|
146
|
-
|
|
147
|
-
### Personal Portfolio
|
|
148
|
-
|
|
149
|
-
Add an AI assistant to answer questions about your work and experience.
|
|
150
|
-
|
|
151
|
-
### E-commerce Store
|
|
152
|
-
|
|
153
|
-
Help customers find products and answer common questions.
|
|
154
|
-
|
|
155
|
-
### Customer Support
|
|
156
|
-
|
|
157
|
-
Provide 24/7 automated support for your users.
|
|
158
|
-
|
|
159
|
-
### Documentation Sites
|
|
160
|
-
|
|
161
|
-
Help users navigate and understand your documentation.
|
|
162
|
-
|
|
163
|
-
### SaaS Platforms
|
|
135
|
+
For React, use the `REACT_APP_` prefix instead:
|
|
164
136
|
|
|
165
|
-
|
|
137
|
+
| Variable | Description | Required |
|
|
138
|
+
| ------------------------------ | ----------------------------------- | ----------------------------- |
|
|
139
|
+
| `REACT_APP_GEMINI_API_KEY` | Your Google Gemini API key | Yes (unless passed via props) |
|
|
140
|
+
| `REACT_APP_AI_BOT_NAME` | The bot's display name | No |
|
|
141
|
+
| `REACT_APP_SYSTEM_INSTRUCTION` | Instructions for the bot's behavior | No |
|
|
166
142
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
- **React** 18+ - UI library
|
|
170
|
-
- **TypeScript** - Type safety
|
|
171
|
-
- **Google Generative AI** - AI capabilities
|
|
172
|
-
- **tsup** - Bundler with style injection
|
|
173
|
-
- **Lucide React** - Icons
|
|
143
|
+
---
|
|
174
144
|
|
|
175
145
|
## 🔒 Security Best Practices
|
|
176
146
|
|
|
177
|
-
1. **Never expose API keys in client code
|
|
178
|
-
|
|
179
|
-
- Use environment variables
|
|
180
|
-
- Store sensitive data server-side for SaaS
|
|
181
|
-
|
|
182
|
-
2. **Implement rate limiting**
|
|
183
|
-
|
|
184
|
-
- Prevent API abuse
|
|
185
|
-
- Track usage per customer
|
|
147
|
+
1. **Never expose API keys in client code**:
|
|
186
148
|
|
|
187
|
-
|
|
188
|
-
-
|
|
189
|
-
- Implement content filtering if needed
|
|
149
|
+
- Use environment variables.
|
|
150
|
+
- Store sensitive data server-side for SaaS.
|
|
190
151
|
|
|
191
|
-
|
|
152
|
+
2. **Implement rate limiting**:
|
|
192
153
|
|
|
193
|
-
-
|
|
194
|
-
-
|
|
195
|
-
- Safari (latest)
|
|
196
|
-
- Edge (latest)
|
|
154
|
+
- Prevent API abuse.
|
|
155
|
+
- Track usage per customer.
|
|
197
156
|
|
|
198
|
-
|
|
157
|
+
3. **Validate inputs**:
|
|
158
|
+
- Sanitize user messages.
|
|
159
|
+
- Implement content filtering if needed.
|
|
199
160
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
1. Fork the repository
|
|
203
|
-
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
|
|
204
|
-
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
|
|
205
|
-
4. Push to the branch (`git push origin feature/AmazingFeature`)
|
|
206
|
-
5. Open a Pull Request
|
|
161
|
+
---
|
|
207
162
|
|
|
208
163
|
## 📝 License
|
|
209
164
|
|
|
210
165
|
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
|
211
166
|
|
|
212
|
-
## 👤 Author
|
|
213
|
-
|
|
214
|
-
**Sanchit Pandey**
|
|
215
|
-
|
|
216
|
-
- Website: [sanchit.pro](https://sanchit.pro)
|
|
217
|
-
- GitHub: [@sanchitpandeyyy](https://github.com/sanchitpandeyyy)
|
|
218
|
-
- LinkedIn: [@sanchitpandeyyy](https://linkedin.com/in/sanchitpandeyyy)
|
|
219
|
-
- Twitter: [@sanchitpandeyyy](https://twitter.com/sanchitpandeyyy)
|
|
220
|
-
|
|
221
|
-
## 🙏 Acknowledgments
|
|
222
|
-
|
|
223
|
-
- Google Gemini API for powering the AI
|
|
224
|
-
- React team for the amazing framework
|
|
225
|
-
- tsup for the excellent bundling experience
|
|
226
|
-
|
|
227
|
-
## 📞 Support
|
|
228
|
-
|
|
229
|
-
For issues and feature requests, please visit:
|
|
230
|
-
|
|
231
|
-
- [GitHub Issues](https://github.com/sanchitpandeyyy/ai-chatbot-sdk/issues)
|
|
232
|
-
- [Email](mailto:mail@sanchit.pro)
|
|
233
|
-
|
|
234
|
-
## ⭐ Show Your Support
|
|
235
|
-
|
|
236
|
-
If you found this project helpful, please give it a ⭐️ on [GitHub](https://github.com/sanchitpandeyyy/ai-chatbot-sdk)!
|
|
237
|
-
|
|
238
167
|
---
|
|
239
168
|
|
|
240
169
|
Made with ❤️ by [Sanchit Pandey](https://sanchit.pro)
|
package/dist/index.d.mts
CHANGED
|
@@ -21,14 +21,6 @@ interface Message {
|
|
|
21
21
|
* @example
|
|
22
22
|
* // Using environment variables
|
|
23
23
|
* <ChatBot />
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* // Using props
|
|
27
|
-
* <ChatBot
|
|
28
|
-
* apiKey="your-api-key"
|
|
29
|
-
* botName="My Assistant"
|
|
30
|
-
* systemInstruction="You are a helpful assistant..."
|
|
31
|
-
* />
|
|
32
24
|
*/
|
|
33
25
|
declare const ChatBot: React.FC<ChatBotProps>;
|
|
34
26
|
|
package/dist/index.d.ts
CHANGED
|
@@ -21,14 +21,6 @@ interface Message {
|
|
|
21
21
|
* @example
|
|
22
22
|
* // Using environment variables
|
|
23
23
|
* <ChatBot />
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* // Using props
|
|
27
|
-
* <ChatBot
|
|
28
|
-
* apiKey="your-api-key"
|
|
29
|
-
* botName="My Assistant"
|
|
30
|
-
* systemInstruction="You are a helpful assistant..."
|
|
31
|
-
* />
|
|
32
24
|
*/
|
|
33
25
|
declare const ChatBot: React.FC<ChatBotProps>;
|
|
34
26
|
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
"use strict";var w=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var j=(t,r)=>{for(var a in r)w(t,a,{get:r[a],enumerable:!0})},
|
|
2
|
+
"use strict";var w=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var j=(t,r)=>{for(var a in r)w(t,a,{get:r[a],enumerable:!0})},A=(t,r,a,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of _(r))!T.call(t,i)&&i!==a&&w(t,i,{get:()=>r[i],enumerable:!(e=P(r,i))||e.enumerable});return t};var B=t=>A(w({},"__esModule",{value:!0}),t);var F={};j(F,{default:()=>$});module.exports=B(F);var M=require("react"),z=require("lucide-react");var N=require("react"),c=require("lucide-react");var h=require("react"),k=require("@google/generative-ai"),d=require("react/jsx-runtime"),U=({apiKey:t,botName:r,systemInstruction:a})=>{let[e,i]=(0,h.useState)(""),[n,p]=(0,h.useState)(()=>{if(typeof window<"u"){let l=localStorage.getItem("chatMessages");return l?JSON.parse(l):[{sender:"ai",text:`Hello! I'm ${r}. How can I help you today?`}]}return[{sender:"ai",text:`Hello! I'm ${r}. How can I help you today?`}]});(0,h.useEffect)(()=>{typeof window<"u"&&localStorage.setItem("chatMessages",JSON.stringify(n))},[n]);let E=async l=>{if(l.preventDefault(),!e.trim())return;if(!t){console.error("API key is missing. Please provide a valid API key.");return}p(g=>[...g,{sender:"user",text:e}]);let u=e;i("");try{let f=new k.GoogleGenerativeAI(t).getGenerativeModel({model:"gemini-2.5-flash"}),m=`
|
|
3
3
|
${a}
|
|
4
4
|
|
|
5
5
|
Previous conversation history:
|
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
|
|
9
9
|
User asking: ${u}
|
|
10
10
|
`,y=(await(await f.generateContent(m)).response).text();if(!y)throw new Error("Empty response from AI");p(b=>[...b,{sender:"ai",text:y}])}catch(g){console.error("Chat Error:",g);let f="I'm sorry, I'm having trouble connecting right now. Please try again later.";p(m=>[...m,{sender:"ai",text:f}])}};return(0,d.jsxs)("section",{className:"h-full flex flex-col relative max-w-100 mx-auto",children:[(0,d.jsx)("div",{className:"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto",style:{maxHeight:"320px",scrollBehavior:"smooth"},children:n.map((l,u)=>(0,d.jsx)("div",{className:"flex w-full",children:(0,d.jsx)("div",{className:`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${l.sender==="ai"?"bg-gray-50 border-gray-100 text-gray-800":"bg-blue-600 text-white border-blue-700 ml-auto"}`,children:l.text})},u))}),(0,d.jsxs)("form",{onSubmit:E,className:"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full",children:[(0,d.jsx)("input",{id:"chat-input",type:"text",placeholder:"Type a message...",className:"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition",onChange:l=>i(l.target.value),value:e}),(0,d.jsx)("button",{type:"submit",className:"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition",children:"Send"})]})]})},C=U;var o=require("react/jsx-runtime"),R=({onClose:t,apiKey:r,botName:a,systemInstruction:e})=>{let[i,n]=(0,N.useState)(!1);return(0,o.jsxs)("div",{className:"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200",children:[(0,o.jsxs)("header",{className:"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl",children:[(0,o.jsxs)("div",{className:"flex items-center gap-3",children:[(0,o.jsx)("span",{className:"bg-blue-950 p-2 rounded-full shadow-sm",children:(0,o.jsx)(c.Bot,{className:"w-5 h-5 text-white"})}),(0,o.jsxs)("div",{children:[(0,o.jsx)("div",{className:"text-gray-900 font-semibold text-md tracking-wide",children:a}),(0,o.jsx)("div",{className:"text-gray-500 text-xs flex items-center",children:(0,o.jsx)("span",{children:"Online 24/7"})})]})]}),(0,o.jsxs)("div",{children:[(0,o.jsx)("button",{onClick:()=>n(!0),"aria-label":"Settings",className:"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer",children:(0,o.jsx)(c.Trash2,{className:"w-5 h-5"})}),(0,o.jsx)("button",{onClick:t,"aria-label":"Minimize chat",className:"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer",children:(0,o.jsx)(c.Minimize2,{className:"w-5 h-5"})})]})]}),(0,o.jsx)("main",{className:"h-full",children:(0,o.jsx)(C,{apiKey:r,botName:a,systemInstruction:e})}),i&&(0,o.jsx)("div",{className:"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center",children:(0,o.jsxs)("div",{className:"bg-white p-6 rounded-lg shadow-lg",children:[(0,o.jsx)("h2",{className:"text-lg font-semibold mb-4 text-gray-800",children:"Clear Conversation"}),(0,o.jsx)("p",{className:"text-sm text-gray-600 mb-6",children:"Are you sure you want to clear the conversation?"}),(0,o.jsxs)("div",{className:"flex justify-end gap-4",children:[(0,o.jsx)("button",{onClick:()=>n(!1),className:"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300",children:"Cancel"}),(0,o.jsx)("button",{onClick:()=>{typeof window<"u"&&(localStorage.removeItem("chatMessages"),window.location.reload())},className:"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700",children:"Clear"})]})]})})]})},I=R;var s=require("react/jsx-runtime"),L=({apiKey:t,botName:r,systemInstruction:a})=>{let[e,i]=(0,M.useState)(!1);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{onClick:()=>{i(!0)},children:(0,s.jsx)("div",{className:"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white",children:(0,s.jsx)(z.Bot,{className:"w-10 h-10"})})}),(0,s.jsx)("div",{className:`transition-opacity duration-100 ease-linear ${e?"opacity-100":"opacity-0 pointer-events-none"}`,children:e&&(0,s.jsx)(I,{onClose:()=>{i(!1)},apiKey:t,botName:r,systemInstruction:a})})]})},S=L;function x(t,{insertAt:r}={}){if(!t||typeof document>"u")return;let a=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",r==="top"&&a.firstChild?a.insertBefore(e,a.firstChild):a.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}x(`/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\[80\\%\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: "*"; inherits: false;}@property --tw-tracking{syntax: "*"; inherits: false;}@property --tw-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: "*"; inherits: false;}@property --tw-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: "*"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: "*"; inherits: false;}@property --tw-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: "*"; inherits: false;}@property --tw-inset-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: "*"; inherits: false;}@property --tw-ring-offset-width{syntax: "<length>"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: "*"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: "*"; inherits: false;}@property --tw-ease{syntax: "*"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}
|
|
11
|
-
`);var v=require("react/jsx-runtime"),O=({apiKey:t,botName:r,systemInstruction:a})=>{let e=t||(typeof process<"u"&&process.env?.NEXT_PUBLIC_GEMINI_API_KEY?process.env.NEXT_PUBLIC_GEMINI_API_KEY:""),i=r||(typeof process<"u"&&process.env?.NEXT_PUBLIC_AI_BOT_NAME?process.env.NEXT_PUBLIC_AI_BOT_NAME:"AI Assistant"),n=a||(typeof process<"u"&&process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION?process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION:"You are a helpful AI assistant.");return e||console.warn("ChatBot: API key is missing. Please provide it via
|
|
11
|
+
`);var v=require("react/jsx-runtime"),O=({apiKey:t,botName:r,systemInstruction:a})=>{let e=t||(typeof process<"u"&&process.env?.NEXT_PUBLIC_GEMINI_API_KEY?process.env.NEXT_PUBLIC_GEMINI_API_KEY:""),i=r||(typeof process<"u"&&process.env?.NEXT_PUBLIC_AI_BOT_NAME?process.env.NEXT_PUBLIC_AI_BOT_NAME:"AI Assistant"),n=a||(typeof process<"u"&&process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION?process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION:"You are a helpful AI assistant.");return e||console.warn("ChatBot: API key is missing. Please provide it via environment variable NEXT_PUBLIC_GEMINI_API_KEY"),(0,v.jsx)("div",{className:"chatbot-container",children:(0,v.jsx)(S,{apiKey:e,botName:i,systemInstruction:n})})},$=O;
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/components/ChatIcon.tsx","../src/components/ChatModal.tsx","../src/components/ChatContainer.tsx","#style-inject:#style-inject","../src/styles/chatbot.css"],"sourcesContent":["import React from \"react\";\r\nimport ChatIcon from \"./components/ChatIcon\";\r\nimport { ChatBotProps } from \"./types\";\r\nimport \"./styles/chatbot.css\";\r\n\r\n/**\r\n * ChatBot Component - A reusable AI chatbot powered by Google Gemini\r\n *\r\n * @param {ChatBotProps} props - Configuration props for the chatbot\r\n * @param {string} [props.apiKey] - Google Gemini API key (falls back to NEXT_PUBLIC_GEMINI_API_KEY)\r\n * @param {string} [props.botName] - Name of the bot (falls back to NEXT_PUBLIC_AI_BOT_NAME or \"AI Assistant\")\r\n * @param {string} [props.systemInstruction] - System instruction for the bot (falls back to NEXT_PUBLIC_SYSTEM_INSTRUCTION)\r\n *\r\n * @example\r\n * // Using environment variables\r\n * <ChatBot />\r\n *\r\n * @example\r\n * // Using props\r\n * <ChatBot\r\n * apiKey=\"your-api-key\"\r\n * botName=\"My Assistant\"\r\n * systemInstruction=\"You are a helpful assistant...\"\r\n * />\r\n */\r\nconst ChatBot: React.FC<ChatBotProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n // Fallback to environment variables if props are not provided\r\n const resolvedApiKey =\r\n apiKey ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_GEMINI_API_KEY\r\n ? process.env.NEXT_PUBLIC_GEMINI_API_KEY\r\n : \"\");\r\n\r\n const resolvedBotName =\r\n botName ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_AI_BOT_NAME\r\n ? process.env.NEXT_PUBLIC_AI_BOT_NAME\r\n : \"AI Assistant\");\r\n\r\n const resolvedSystemInstruction =\r\n systemInstruction ||\r\n (typeof process !== \"undefined\" &&\r\n process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n ? process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n : \"You are a helpful AI assistant.\");\r\n\r\n // Warn if API key is missing\r\n if (!resolvedApiKey) {\r\n console.warn(\r\n \"ChatBot: API key is missing. Please provide it via props or environment variable NEXT_PUBLIC_GEMINI_API_KEY\"\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"chatbot-container\">\r\n <ChatIcon\r\n apiKey={resolvedApiKey}\r\n botName={resolvedBotName}\r\n systemInstruction={resolvedSystemInstruction}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatBot;\r\nexport type { ChatBotProps, Message } from \"./types\";\r\n","import { useState } from \"react\";\r\nimport { Bot } from \"lucide-react\";\r\nimport ChatModal from \"./ChatModal\";\r\nimport { ChatIconProps } from \"../types\";\r\n\r\nconst ChatIcon: React.FC<ChatIconProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n\r\n const openModal = () => {\r\n setIsModalOpen(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setIsModalOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <button onClick={openModal}>\r\n <div className=\"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white\">\r\n <Bot className=\"w-10 h-10\" />\r\n </div>\r\n </button>\r\n <div\r\n className={`transition-opacity duration-100 ease-linear ${\r\n isModalOpen ? \"opacity-100\" : \"opacity-0 pointer-events-none\"\r\n }`}\r\n >\r\n {isModalOpen && (\r\n <ChatModal\r\n onClose={closeModal}\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n )}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ChatIcon;\r\n","import { useState } from \"react\";\r\nimport { Minimize2, Bot, Trash2 } from \"lucide-react\";\r\nimport ChatContainer from \"./ChatContainer\";\r\nimport { ChatModalProps } from \"../types\";\r\n\r\nconst ChatModal: React.FC<ChatModalProps> = ({\r\n onClose,\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [showClearModal, setShowClearModal] = useState(false);\r\n\r\n const clearChat = () => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.removeItem(\"chatMessages\");\r\n window.location.reload();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200\">\r\n <header className=\"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"bg-blue-950 p-2 rounded-full shadow-sm\">\r\n <Bot className=\"w-5 h-5 text-white\" />\r\n </span>\r\n <div>\r\n <div className=\"text-gray-900 font-semibold text-md tracking-wide\">\r\n {botName}\r\n </div>\r\n <div className=\"text-gray-500 text-xs flex items-center\">\r\n <span>Online 24/7</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <button\r\n onClick={() => setShowClearModal(true)}\r\n aria-label=\"Settings\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer\"\r\n >\r\n <Trash2 className=\"w-5 h-5\" />\r\n </button>\r\n <button\r\n onClick={onClose}\r\n aria-label=\"Minimize chat\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer\"\r\n >\r\n <Minimize2 className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </header>\r\n <main className=\"h-full\">\r\n <ChatContainer\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n </main>\r\n\r\n {showClearModal && (\r\n <div className=\"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center\">\r\n <div className=\"bg-white p-6 rounded-lg shadow-lg\">\r\n <h2 className=\"text-lg font-semibold mb-4 text-gray-800\">\r\n Clear Conversation\r\n </h2>\r\n <p className=\"text-sm text-gray-600 mb-6\">\r\n Are you sure you want to clear the conversation?\r\n </p>\r\n <div className=\"flex justify-end gap-4\">\r\n <button\r\n onClick={() => setShowClearModal(false)}\r\n className=\"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={clearChat}\r\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatModal;\r\n","import { useState, useEffect } from \"react\";\r\nimport { GoogleGenerativeAI } from \"@google/generative-ai\";\r\nimport { ChatContainerProps, Message } from \"../types\";\r\n\r\nconst ChatContainer: React.FC<ChatContainerProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [message, setMessage] = useState(\"\");\r\n const [messages, setMessages] = useState<Message[]>(() => {\r\n if (typeof window !== \"undefined\") {\r\n const storedMessages = localStorage.getItem(\"chatMessages\");\r\n return storedMessages\r\n ? JSON.parse(storedMessages)\r\n : [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.setItem(\"chatMessages\", JSON.stringify(messages));\r\n }\r\n }, [messages]);\r\n\r\n const handleSend = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!message.trim()) return;\r\n\r\n if (!apiKey) {\r\n console.error(\"API key is missing. Please provide a valid API key.\");\r\n return;\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"user\", text: message },\r\n ]);\r\n const currentMessage = message;\r\n setMessage(\"\");\r\n\r\n try {\r\n const ai = new GoogleGenerativeAI(apiKey);\r\n const model = ai.getGenerativeModel({\r\n model: \"gemini-2.5-flash\",\r\n });\r\n\r\n const promptWithContext = `\r\n ${systemInstruction}\r\n \r\n Previous conversation history:\r\n ${messages\r\n .slice(1)\r\n .map((m: Message) => `${m.sender}: ${m.text}`)\r\n .join(\"\\n\")}\r\n \r\n User asking: ${currentMessage}\r\n `;\r\n\r\n const result = await model.generateContent(promptWithContext);\r\n const response = await result.response;\r\n const aiText = response.text();\r\n\r\n if (!aiText) {\r\n throw new Error(\"Empty response from AI\");\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: aiText },\r\n ]);\r\n } catch (err) {\r\n console.error(\"Chat Error:\", err);\r\n const fallbackResponse =\r\n \"I'm sorry, I'm having trouble connecting right now. Please try again later.\";\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: fallbackResponse },\r\n ]);\r\n }\r\n };\r\n\r\n return (\r\n <section className=\"h-full flex flex-col relative max-w-100 mx-auto\">\r\n <div\r\n className=\"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto\"\r\n style={{ maxHeight: \"320px\", scrollBehavior: \"smooth\" }}\r\n >\r\n {messages.map((msg: Message, idx: number) => (\r\n <div key={idx} className=\"flex w-full\">\r\n <div\r\n className={`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${\r\n msg.sender === \"ai\"\r\n ? \"bg-gray-50 border-gray-100 text-gray-800\"\r\n : \"bg-blue-600 text-white border-blue-700 ml-auto\"\r\n }`}\r\n >\r\n {msg.text}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n <form\r\n onSubmit={handleSend}\r\n className=\"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full\"\r\n >\r\n <input\r\n id=\"chat-input\"\r\n type=\"text\"\r\n placeholder=\"Type a message...\"\r\n className=\"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition\"\r\n onChange={(e) => setMessage(e.target.value)}\r\n value={message}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition\"\r\n >\r\n Send\r\n </button>\r\n </form>\r\n </section>\r\n );\r\n};\r\n\r\nexport default ChatContainer;\r\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\\\[80\\\\%\\\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}\\n\")"],"mappings":"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","names":["index_exports","__export","index_default","__toCommonJS","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_generative_ai","import_jsx_runtime","ChatContainer","apiKey","botName","systemInstruction","message","setMessage","messages","setMessages","storedMessages","handleSend","e","prev","currentMessage","model","promptWithContext","m","aiText","err","fallbackResponse","msg","idx","ChatContainer_default","import_jsx_runtime","ChatModal","onClose","apiKey","botName","systemInstruction","showClearModal","setShowClearModal","ChatContainer_default","ChatModal_default","import_jsx_runtime","ChatIcon","apiKey","botName","systemInstruction","isModalOpen","setIsModalOpen","ChatModal_default","ChatIcon_default","styleInject","css","insertAt","head","style","styleInject","import_jsx_runtime","ChatBot","apiKey","botName","systemInstruction","resolvedApiKey","resolvedBotName","resolvedSystemInstruction","ChatIcon_default","index_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/components/ChatIcon.tsx","../src/components/ChatModal.tsx","../src/components/ChatContainer.tsx","#style-inject:#style-inject","../src/styles/chatbot.css"],"sourcesContent":["import React from \"react\";\r\nimport ChatIcon from \"./components/ChatIcon\";\r\nimport { ChatBotProps } from \"./types\";\r\nimport \"./styles/chatbot.css\";\r\n\r\n/**\r\n * ChatBot Component - A reusable AI chatbot powered by Google Gemini\r\n *\r\n * @param {ChatBotProps} props - Configuration props for the chatbot\r\n * @param {string} [props.apiKey] - Google Gemini API key (falls back to NEXT_PUBLIC_GEMINI_API_KEY)\r\n * @param {string} [props.botName] - Name of the bot (falls back to NEXT_PUBLIC_AI_BOT_NAME or \"AI Assistant\")\r\n * @param {string} [props.systemInstruction] - System instruction for the bot (falls back to NEXT_PUBLIC_SYSTEM_INSTRUCTION)\r\n *\r\n * @example\r\n * // Using environment variables\r\n * <ChatBot />\r\n */\r\nconst ChatBot: React.FC<ChatBotProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n // Fallback to environment variables if props are not provided\r\n const resolvedApiKey =\r\n apiKey ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_GEMINI_API_KEY\r\n ? process.env.NEXT_PUBLIC_GEMINI_API_KEY\r\n : \"\");\r\n\r\n const resolvedBotName =\r\n botName ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_AI_BOT_NAME\r\n ? process.env.NEXT_PUBLIC_AI_BOT_NAME\r\n : \"AI Assistant\");\r\n\r\n const resolvedSystemInstruction =\r\n systemInstruction ||\r\n (typeof process !== \"undefined\" &&\r\n process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n ? process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n : \"You are a helpful AI assistant.\");\r\n\r\n // Warn if API key is missing\r\n if (!resolvedApiKey) {\r\n console.warn(\r\n \"ChatBot: API key is missing. Please provide it via environment variable NEXT_PUBLIC_GEMINI_API_KEY\"\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"chatbot-container\">\r\n <ChatIcon\r\n apiKey={resolvedApiKey} // The API key used to authenticate with Google Gemini\r\n botName={resolvedBotName} // The name of the bot displayed to users\r\n systemInstruction={resolvedSystemInstruction} // The context or behavior instruction for the bot\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatBot;\r\nexport type { ChatBotProps, Message } from \"./types\";\r\n","import { useState } from \"react\";\r\nimport { Bot } from \"lucide-react\";\r\nimport ChatModal from \"./ChatModal\";\r\nimport { ChatIconProps } from \"../types\";\r\n\r\nconst ChatIcon: React.FC<ChatIconProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n\r\n const openModal = () => {\r\n setIsModalOpen(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setIsModalOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <button onClick={openModal}>\r\n <div className=\"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white\">\r\n <Bot className=\"w-10 h-10\" />\r\n </div>\r\n </button>\r\n <div\r\n className={`transition-opacity duration-100 ease-linear ${\r\n isModalOpen ? \"opacity-100\" : \"opacity-0 pointer-events-none\"\r\n }`}\r\n >\r\n {isModalOpen && (\r\n <ChatModal\r\n onClose={closeModal}\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n )}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ChatIcon;\r\n","import { useState } from \"react\";\r\nimport { Minimize2, Bot, Trash2 } from \"lucide-react\";\r\nimport ChatContainer from \"./ChatContainer\";\r\nimport { ChatModalProps } from \"../types\";\r\n\r\nconst ChatModal: React.FC<ChatModalProps> = ({\r\n onClose,\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [showClearModal, setShowClearModal] = useState(false);\r\n\r\n const clearChat = () => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.removeItem(\"chatMessages\");\r\n window.location.reload();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200\">\r\n <header className=\"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"bg-blue-950 p-2 rounded-full shadow-sm\">\r\n <Bot className=\"w-5 h-5 text-white\" />\r\n </span>\r\n <div>\r\n <div className=\"text-gray-900 font-semibold text-md tracking-wide\">\r\n {botName}\r\n </div>\r\n <div className=\"text-gray-500 text-xs flex items-center\">\r\n <span>Online 24/7</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <button\r\n onClick={() => setShowClearModal(true)}\r\n aria-label=\"Settings\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer\"\r\n >\r\n <Trash2 className=\"w-5 h-5\" />\r\n </button>\r\n <button\r\n onClick={onClose}\r\n aria-label=\"Minimize chat\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer\"\r\n >\r\n <Minimize2 className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </header>\r\n <main className=\"h-full\">\r\n <ChatContainer\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n </main>\r\n\r\n {showClearModal && (\r\n <div className=\"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center\">\r\n <div className=\"bg-white p-6 rounded-lg shadow-lg\">\r\n <h2 className=\"text-lg font-semibold mb-4 text-gray-800\">\r\n Clear Conversation\r\n </h2>\r\n <p className=\"text-sm text-gray-600 mb-6\">\r\n Are you sure you want to clear the conversation?\r\n </p>\r\n <div className=\"flex justify-end gap-4\">\r\n <button\r\n onClick={() => setShowClearModal(false)}\r\n className=\"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={clearChat}\r\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatModal;\r\n","import { useState, useEffect } from \"react\";\r\nimport { GoogleGenerativeAI } from \"@google/generative-ai\";\r\nimport { ChatContainerProps, Message } from \"../types\";\r\n\r\nconst ChatContainer: React.FC<ChatContainerProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [message, setMessage] = useState(\"\");\r\n const [messages, setMessages] = useState<Message[]>(() => {\r\n if (typeof window !== \"undefined\") {\r\n const storedMessages = localStorage.getItem(\"chatMessages\");\r\n return storedMessages\r\n ? JSON.parse(storedMessages)\r\n : [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.setItem(\"chatMessages\", JSON.stringify(messages));\r\n }\r\n }, [messages]);\r\n\r\n const handleSend = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!message.trim()) return;\r\n\r\n if (!apiKey) {\r\n console.error(\"API key is missing. Please provide a valid API key.\");\r\n return;\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"user\", text: message },\r\n ]);\r\n const currentMessage = message;\r\n setMessage(\"\");\r\n\r\n try {\r\n const ai = new GoogleGenerativeAI(apiKey);\r\n const model = ai.getGenerativeModel({\r\n model: \"gemini-2.5-flash\",\r\n });\r\n\r\n const promptWithContext = `\r\n ${systemInstruction}\r\n \r\n Previous conversation history:\r\n ${messages\r\n .slice(1)\r\n .map((m: Message) => `${m.sender}: ${m.text}`)\r\n .join(\"\\n\")}\r\n \r\n User asking: ${currentMessage}\r\n `;\r\n\r\n const result = await model.generateContent(promptWithContext);\r\n const response = await result.response;\r\n const aiText = response.text();\r\n\r\n if (!aiText) {\r\n throw new Error(\"Empty response from AI\");\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: aiText },\r\n ]);\r\n } catch (err) {\r\n console.error(\"Chat Error:\", err);\r\n const fallbackResponse =\r\n \"I'm sorry, I'm having trouble connecting right now. Please try again later.\";\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: fallbackResponse },\r\n ]);\r\n }\r\n };\r\n\r\n return (\r\n <section className=\"h-full flex flex-col relative max-w-100 mx-auto\">\r\n <div\r\n className=\"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto\"\r\n style={{ maxHeight: \"320px\", scrollBehavior: \"smooth\" }}\r\n >\r\n {messages.map((msg: Message, idx: number) => (\r\n <div key={idx} className=\"flex w-full\">\r\n <div\r\n className={`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${\r\n msg.sender === \"ai\"\r\n ? \"bg-gray-50 border-gray-100 text-gray-800\"\r\n : \"bg-blue-600 text-white border-blue-700 ml-auto\"\r\n }`}\r\n >\r\n {msg.text}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n <form\r\n onSubmit={handleSend}\r\n className=\"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full\"\r\n >\r\n <input\r\n id=\"chat-input\"\r\n type=\"text\"\r\n placeholder=\"Type a message...\"\r\n className=\"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition\"\r\n onChange={(e) => setMessage(e.target.value)}\r\n value={message}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition\"\r\n >\r\n Send\r\n </button>\r\n </form>\r\n </section>\r\n );\r\n};\r\n\r\nexport default ChatContainer;\r\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\\\[80\\\\%\\\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}\\n\")"],"mappings":"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","names":["index_exports","__export","index_default","__toCommonJS","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_generative_ai","import_jsx_runtime","ChatContainer","apiKey","botName","systemInstruction","message","setMessage","messages","setMessages","storedMessages","handleSend","e","prev","currentMessage","model","promptWithContext","m","aiText","err","fallbackResponse","msg","idx","ChatContainer_default","import_jsx_runtime","ChatModal","onClose","apiKey","botName","systemInstruction","showClearModal","setShowClearModal","ChatContainer_default","ChatModal_default","import_jsx_runtime","ChatIcon","apiKey","botName","systemInstruction","isModalOpen","setIsModalOpen","ChatModal_default","ChatIcon_default","styleInject","css","insertAt","head","style","styleInject","import_jsx_runtime","ChatBot","apiKey","botName","systemInstruction","resolvedApiKey","resolvedBotName","resolvedSystemInstruction","ChatIcon_default","index_default"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import{useState as
|
|
2
|
+
import{useState as A}from"react";import{Bot as B}from"lucide-react";import{useState as E}from"react";import{Minimize2 as P,Bot as _,Trash2 as T}from"lucide-react";import{useState as x,useEffect as M}from"react";import{GoogleGenerativeAI as z}from"@google/generative-ai";import{jsx as c,jsxs as v}from"react/jsx-runtime";var S=({apiKey:r,botName:a,systemInstruction:t})=>{let[o,n]=x(""),[i,d]=x(()=>{if(typeof window<"u"){let s=localStorage.getItem("chatMessages");return s?JSON.parse(s):[{sender:"ai",text:`Hello! I'm ${a}. How can I help you today?`}]}return[{sender:"ai",text:`Hello! I'm ${a}. How can I help you today?`}]});M(()=>{typeof window<"u"&&localStorage.setItem("chatMessages",JSON.stringify(i))},[i]);let I=async s=>{if(s.preventDefault(),!o.trim())return;if(!r){console.error("API key is missing. Please provide a valid API key.");return}d(h=>[...h,{sender:"user",text:o}]);let b=o;n("");try{let u=new z(r).getGenerativeModel({model:"gemini-2.5-flash"}),f=`
|
|
3
3
|
${t}
|
|
4
4
|
|
|
5
5
|
Previous conversation history:
|
|
@@ -7,6 +7,6 @@ import{useState as B}from"react";import{Bot as A}from"lucide-react";import{useSt
|
|
|
7
7
|
`)}
|
|
8
8
|
|
|
9
9
|
User asking: ${b}
|
|
10
|
-
`,w=(await(await u.generateContent(f)).response).text();if(!w)throw new Error("Empty response from AI");d(g=>[...g,{sender:"ai",text:w}])}catch(h){console.error("Chat Error:",h);let u="I'm sorry, I'm having trouble connecting right now. Please try again later.";d(f=>[...f,{sender:"ai",text:u}])}};return v("section",{className:"h-full flex flex-col relative max-w-100 mx-auto",children:[c("div",{className:"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto",style:{maxHeight:"320px",scrollBehavior:"smooth"},children:i.map((s,b)=>c("div",{className:"flex w-full",children:c("div",{className:`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${s.sender==="ai"?"bg-gray-50 border-gray-100 text-gray-800":"bg-blue-600 text-white border-blue-700 ml-auto"}`,children:s.text})},b))}),v("form",{onSubmit:I,className:"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full",children:[c("input",{id:"chat-input",type:"text",placeholder:"Type a message...",className:"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition",onChange:s=>n(s.target.value),value:o}),c("button",{type:"submit",className:"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition",children:"Send"})]})]})},y=S;import{jsx as e,jsxs as l}from"react/jsx-runtime";var j=({onClose:r,apiKey:a,botName:t,systemInstruction:o})=>{let[n,i]=E(!1);return l("div",{className:"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200",children:[l("header",{className:"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl",children:[l("div",{className:"flex items-center gap-3",children:[e("span",{className:"bg-blue-950 p-2 rounded-full shadow-sm",children:e(_,{className:"w-5 h-5 text-white"})}),l("div",{children:[e("div",{className:"text-gray-900 font-semibold text-md tracking-wide",children:t}),e("div",{className:"text-gray-500 text-xs flex items-center",children:e("span",{children:"Online 24/7"})})]})]}),l("div",{children:[e("button",{onClick:()=>i(!0),"aria-label":"Settings",className:"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer",children:e(T,{className:"w-5 h-5"})}),e("button",{onClick:r,"aria-label":"Minimize chat",className:"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer",children:e(P,{className:"w-5 h-5"})})]})]}),e("main",{className:"h-full",children:e(y,{apiKey:a,botName:t,systemInstruction:o})}),n&&e("div",{className:"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center",children:l("div",{className:"bg-white p-6 rounded-lg shadow-lg",children:[e("h2",{className:"text-lg font-semibold mb-4 text-gray-800",children:"Clear Conversation"}),e("p",{className:"text-sm text-gray-600 mb-6",children:"Are you sure you want to clear the conversation?"}),l("div",{className:"flex justify-end gap-4",children:[e("button",{onClick:()=>i(!1),className:"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300",children:"Cancel"}),e("button",{onClick:()=>{typeof window<"u"&&(localStorage.removeItem("chatMessages"),window.location.reload())},className:"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700",children:"Clear"})]})]})})]})},k=j;import{Fragment as R,jsx as p,jsxs as L}from"react/jsx-runtime";var U=({apiKey:r,botName:a,systemInstruction:t})=>{let[o,n]=B(!1);return L(R,{children:[p("button",{onClick:()=>{n(!0)},children:p("div",{className:"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white",children:p(A,{className:"w-10 h-10"})})}),p("div",{className:`transition-opacity duration-100 ease-linear ${o?"opacity-100":"opacity-0 pointer-events-none"}`,children:o&&p(k,{onClose:()=>{n(!1)},apiKey:r,botName:a,systemInstruction:t})})]})},C=U;function m(r,{insertAt:a}={}){if(!r||typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",a==="top"&&t.firstChild?t.insertBefore(o,t.firstChild):t.appendChild(o),o.styleSheet?o.styleSheet.cssText=r:o.appendChild(document.createTextNode(r))}m(`/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\[80\\%\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: "*"; inherits: false;}@property --tw-tracking{syntax: "*"; inherits: false;}@property --tw-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: "*"; inherits: false;}@property --tw-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: "*"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: "*"; inherits: false;}@property --tw-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: "*"; inherits: false;}@property --tw-inset-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: "*"; inherits: false;}@property --tw-ring-offset-width{syntax: "<length>"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: "*"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: "*"; inherits: false;}@property --tw-ease{syntax: "*"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}
|
|
11
|
-
`);import{jsx as N}from"react/jsx-runtime";var O=({apiKey:r,botName:a,systemInstruction:t})=>{let o=r||(typeof process<"u"&&process.env?.NEXT_PUBLIC_GEMINI_API_KEY?process.env.NEXT_PUBLIC_GEMINI_API_KEY:""),n=a||(typeof process<"u"&&process.env?.NEXT_PUBLIC_AI_BOT_NAME?process.env.NEXT_PUBLIC_AI_BOT_NAME:"AI Assistant"),i=t||(typeof process<"u"&&process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION?process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION:"You are a helpful AI assistant.");return o||console.warn("ChatBot: API key is missing. Please provide it via
|
|
10
|
+
`,w=(await(await u.generateContent(f)).response).text();if(!w)throw new Error("Empty response from AI");d(g=>[...g,{sender:"ai",text:w}])}catch(h){console.error("Chat Error:",h);let u="I'm sorry, I'm having trouble connecting right now. Please try again later.";d(f=>[...f,{sender:"ai",text:u}])}};return v("section",{className:"h-full flex flex-col relative max-w-100 mx-auto",children:[c("div",{className:"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto",style:{maxHeight:"320px",scrollBehavior:"smooth"},children:i.map((s,b)=>c("div",{className:"flex w-full",children:c("div",{className:`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${s.sender==="ai"?"bg-gray-50 border-gray-100 text-gray-800":"bg-blue-600 text-white border-blue-700 ml-auto"}`,children:s.text})},b))}),v("form",{onSubmit:I,className:"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full",children:[c("input",{id:"chat-input",type:"text",placeholder:"Type a message...",className:"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition",onChange:s=>n(s.target.value),value:o}),c("button",{type:"submit",className:"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition",children:"Send"})]})]})},y=S;import{jsx as e,jsxs as l}from"react/jsx-runtime";var j=({onClose:r,apiKey:a,botName:t,systemInstruction:o})=>{let[n,i]=E(!1);return l("div",{className:"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200",children:[l("header",{className:"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl",children:[l("div",{className:"flex items-center gap-3",children:[e("span",{className:"bg-blue-950 p-2 rounded-full shadow-sm",children:e(_,{className:"w-5 h-5 text-white"})}),l("div",{children:[e("div",{className:"text-gray-900 font-semibold text-md tracking-wide",children:t}),e("div",{className:"text-gray-500 text-xs flex items-center",children:e("span",{children:"Online 24/7"})})]})]}),l("div",{children:[e("button",{onClick:()=>i(!0),"aria-label":"Settings",className:"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer",children:e(T,{className:"w-5 h-5"})}),e("button",{onClick:r,"aria-label":"Minimize chat",className:"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer",children:e(P,{className:"w-5 h-5"})})]})]}),e("main",{className:"h-full",children:e(y,{apiKey:a,botName:t,systemInstruction:o})}),n&&e("div",{className:"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center",children:l("div",{className:"bg-white p-6 rounded-lg shadow-lg",children:[e("h2",{className:"text-lg font-semibold mb-4 text-gray-800",children:"Clear Conversation"}),e("p",{className:"text-sm text-gray-600 mb-6",children:"Are you sure you want to clear the conversation?"}),l("div",{className:"flex justify-end gap-4",children:[e("button",{onClick:()=>i(!1),className:"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300",children:"Cancel"}),e("button",{onClick:()=>{typeof window<"u"&&(localStorage.removeItem("chatMessages"),window.location.reload())},className:"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700",children:"Clear"})]})]})})]})},k=j;import{Fragment as R,jsx as p,jsxs as L}from"react/jsx-runtime";var U=({apiKey:r,botName:a,systemInstruction:t})=>{let[o,n]=A(!1);return L(R,{children:[p("button",{onClick:()=>{n(!0)},children:p("div",{className:"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white",children:p(B,{className:"w-10 h-10"})})}),p("div",{className:`transition-opacity duration-100 ease-linear ${o?"opacity-100":"opacity-0 pointer-events-none"}`,children:o&&p(k,{onClose:()=>{n(!1)},apiKey:r,botName:a,systemInstruction:t})})]})},C=U;function m(r,{insertAt:a}={}){if(!r||typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",a==="top"&&t.firstChild?t.insertBefore(o,t.firstChild):t.appendChild(o),o.styleSheet?o.styleSheet.cssText=r:o.appendChild(document.createTextNode(r))}m(`/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\[80\\%\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: "*"; inherits: false;}@property --tw-tracking{syntax: "*"; inherits: false;}@property --tw-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: "*"; inherits: false;}@property --tw-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: "*"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: "*"; inherits: false;}@property --tw-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: "*"; inherits: false;}@property --tw-inset-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: "*"; inherits: false;}@property --tw-ring-offset-width{syntax: "<length>"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: "*"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: "*"; inherits: false;}@property --tw-ease{syntax: "*"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}
|
|
11
|
+
`);import{jsx as N}from"react/jsx-runtime";var O=({apiKey:r,botName:a,systemInstruction:t})=>{let o=r||(typeof process<"u"&&process.env?.NEXT_PUBLIC_GEMINI_API_KEY?process.env.NEXT_PUBLIC_GEMINI_API_KEY:""),n=a||(typeof process<"u"&&process.env?.NEXT_PUBLIC_AI_BOT_NAME?process.env.NEXT_PUBLIC_AI_BOT_NAME:"AI Assistant"),i=t||(typeof process<"u"&&process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION?process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION:"You are a helpful AI assistant.");return o||console.warn("ChatBot: API key is missing. Please provide it via environment variable NEXT_PUBLIC_GEMINI_API_KEY"),N("div",{className:"chatbot-container",children:N(C,{apiKey:o,botName:n,systemInstruction:i})})},no=O;export{no as default};
|
|
12
12
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ChatIcon.tsx","../src/components/ChatModal.tsx","../src/components/ChatContainer.tsx","#style-inject:#style-inject","../src/styles/chatbot.css","../src/index.tsx"],"sourcesContent":["import { useState } from \"react\";\r\nimport { Bot } from \"lucide-react\";\r\nimport ChatModal from \"./ChatModal\";\r\nimport { ChatIconProps } from \"../types\";\r\n\r\nconst ChatIcon: React.FC<ChatIconProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n\r\n const openModal = () => {\r\n setIsModalOpen(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setIsModalOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <button onClick={openModal}>\r\n <div className=\"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white\">\r\n <Bot className=\"w-10 h-10\" />\r\n </div>\r\n </button>\r\n <div\r\n className={`transition-opacity duration-100 ease-linear ${\r\n isModalOpen ? \"opacity-100\" : \"opacity-0 pointer-events-none\"\r\n }`}\r\n >\r\n {isModalOpen && (\r\n <ChatModal\r\n onClose={closeModal}\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n )}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ChatIcon;\r\n","import { useState } from \"react\";\r\nimport { Minimize2, Bot, Trash2 } from \"lucide-react\";\r\nimport ChatContainer from \"./ChatContainer\";\r\nimport { ChatModalProps } from \"../types\";\r\n\r\nconst ChatModal: React.FC<ChatModalProps> = ({\r\n onClose,\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [showClearModal, setShowClearModal] = useState(false);\r\n\r\n const clearChat = () => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.removeItem(\"chatMessages\");\r\n window.location.reload();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200\">\r\n <header className=\"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"bg-blue-950 p-2 rounded-full shadow-sm\">\r\n <Bot className=\"w-5 h-5 text-white\" />\r\n </span>\r\n <div>\r\n <div className=\"text-gray-900 font-semibold text-md tracking-wide\">\r\n {botName}\r\n </div>\r\n <div className=\"text-gray-500 text-xs flex items-center\">\r\n <span>Online 24/7</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <button\r\n onClick={() => setShowClearModal(true)}\r\n aria-label=\"Settings\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer\"\r\n >\r\n <Trash2 className=\"w-5 h-5\" />\r\n </button>\r\n <button\r\n onClick={onClose}\r\n aria-label=\"Minimize chat\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer\"\r\n >\r\n <Minimize2 className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </header>\r\n <main className=\"h-full\">\r\n <ChatContainer\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n </main>\r\n\r\n {showClearModal && (\r\n <div className=\"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center\">\r\n <div className=\"bg-white p-6 rounded-lg shadow-lg\">\r\n <h2 className=\"text-lg font-semibold mb-4 text-gray-800\">\r\n Clear Conversation\r\n </h2>\r\n <p className=\"text-sm text-gray-600 mb-6\">\r\n Are you sure you want to clear the conversation?\r\n </p>\r\n <div className=\"flex justify-end gap-4\">\r\n <button\r\n onClick={() => setShowClearModal(false)}\r\n className=\"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={clearChat}\r\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatModal;\r\n","import { useState, useEffect } from \"react\";\r\nimport { GoogleGenerativeAI } from \"@google/generative-ai\";\r\nimport { ChatContainerProps, Message } from \"../types\";\r\n\r\nconst ChatContainer: React.FC<ChatContainerProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [message, setMessage] = useState(\"\");\r\n const [messages, setMessages] = useState<Message[]>(() => {\r\n if (typeof window !== \"undefined\") {\r\n const storedMessages = localStorage.getItem(\"chatMessages\");\r\n return storedMessages\r\n ? JSON.parse(storedMessages)\r\n : [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.setItem(\"chatMessages\", JSON.stringify(messages));\r\n }\r\n }, [messages]);\r\n\r\n const handleSend = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!message.trim()) return;\r\n\r\n if (!apiKey) {\r\n console.error(\"API key is missing. Please provide a valid API key.\");\r\n return;\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"user\", text: message },\r\n ]);\r\n const currentMessage = message;\r\n setMessage(\"\");\r\n\r\n try {\r\n const ai = new GoogleGenerativeAI(apiKey);\r\n const model = ai.getGenerativeModel({\r\n model: \"gemini-2.5-flash\",\r\n });\r\n\r\n const promptWithContext = `\r\n ${systemInstruction}\r\n \r\n Previous conversation history:\r\n ${messages\r\n .slice(1)\r\n .map((m: Message) => `${m.sender}: ${m.text}`)\r\n .join(\"\\n\")}\r\n \r\n User asking: ${currentMessage}\r\n `;\r\n\r\n const result = await model.generateContent(promptWithContext);\r\n const response = await result.response;\r\n const aiText = response.text();\r\n\r\n if (!aiText) {\r\n throw new Error(\"Empty response from AI\");\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: aiText },\r\n ]);\r\n } catch (err) {\r\n console.error(\"Chat Error:\", err);\r\n const fallbackResponse =\r\n \"I'm sorry, I'm having trouble connecting right now. Please try again later.\";\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: fallbackResponse },\r\n ]);\r\n }\r\n };\r\n\r\n return (\r\n <section className=\"h-full flex flex-col relative max-w-100 mx-auto\">\r\n <div\r\n className=\"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto\"\r\n style={{ maxHeight: \"320px\", scrollBehavior: \"smooth\" }}\r\n >\r\n {messages.map((msg: Message, idx: number) => (\r\n <div key={idx} className=\"flex w-full\">\r\n <div\r\n className={`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${\r\n msg.sender === \"ai\"\r\n ? \"bg-gray-50 border-gray-100 text-gray-800\"\r\n : \"bg-blue-600 text-white border-blue-700 ml-auto\"\r\n }`}\r\n >\r\n {msg.text}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n <form\r\n onSubmit={handleSend}\r\n className=\"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full\"\r\n >\r\n <input\r\n id=\"chat-input\"\r\n type=\"text\"\r\n placeholder=\"Type a message...\"\r\n className=\"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition\"\r\n onChange={(e) => setMessage(e.target.value)}\r\n value={message}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition\"\r\n >\r\n Send\r\n </button>\r\n </form>\r\n </section>\r\n );\r\n};\r\n\r\nexport default ChatContainer;\r\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\\\[80\\\\%\\\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}\\n\")","import React from \"react\";\r\nimport ChatIcon from \"./components/ChatIcon\";\r\nimport { ChatBotProps } from \"./types\";\r\nimport \"./styles/chatbot.css\";\r\n\r\n/**\r\n * ChatBot Component - A reusable AI chatbot powered by Google Gemini\r\n *\r\n * @param {ChatBotProps} props - Configuration props for the chatbot\r\n * @param {string} [props.apiKey] - Google Gemini API key (falls back to NEXT_PUBLIC_GEMINI_API_KEY)\r\n * @param {string} [props.botName] - Name of the bot (falls back to NEXT_PUBLIC_AI_BOT_NAME or \"AI Assistant\")\r\n * @param {string} [props.systemInstruction] - System instruction for the bot (falls back to NEXT_PUBLIC_SYSTEM_INSTRUCTION)\r\n *\r\n * @example\r\n * // Using environment variables\r\n * <ChatBot />\r\n *\r\n * @example\r\n * // Using props\r\n * <ChatBot\r\n * apiKey=\"your-api-key\"\r\n * botName=\"My Assistant\"\r\n * systemInstruction=\"You are a helpful assistant...\"\r\n * />\r\n */\r\nconst ChatBot: React.FC<ChatBotProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n // Fallback to environment variables if props are not provided\r\n const resolvedApiKey =\r\n apiKey ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_GEMINI_API_KEY\r\n ? process.env.NEXT_PUBLIC_GEMINI_API_KEY\r\n : \"\");\r\n\r\n const resolvedBotName =\r\n botName ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_AI_BOT_NAME\r\n ? process.env.NEXT_PUBLIC_AI_BOT_NAME\r\n : \"AI Assistant\");\r\n\r\n const resolvedSystemInstruction =\r\n systemInstruction ||\r\n (typeof process !== \"undefined\" &&\r\n process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n ? process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n : \"You are a helpful AI assistant.\");\r\n\r\n // Warn if API key is missing\r\n if (!resolvedApiKey) {\r\n console.warn(\r\n \"ChatBot: API key is missing. Please provide it via props or environment variable NEXT_PUBLIC_GEMINI_API_KEY\"\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"chatbot-container\">\r\n <ChatIcon\r\n apiKey={resolvedApiKey}\r\n botName={resolvedBotName}\r\n systemInstruction={resolvedSystemInstruction}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatBot;\r\nexport type { ChatBotProps, Message } from \"./types\";\r\n"],"mappings":"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","names":["useState","Bot","useState","Minimize2","Bot","Trash2","useState","useEffect","GoogleGenerativeAI","jsx","jsxs","ChatContainer","apiKey","botName","systemInstruction","message","setMessage","messages","setMessages","storedMessages","handleSend","e","prev","currentMessage","model","promptWithContext","m","aiText","err","fallbackResponse","msg","idx","ChatContainer_default","jsx","jsxs","ChatModal","onClose","apiKey","botName","systemInstruction","showClearModal","setShowClearModal","useState","Bot","Trash2","Minimize2","ChatContainer_default","ChatModal_default","Fragment","jsx","jsxs","ChatIcon","apiKey","botName","systemInstruction","isModalOpen","setIsModalOpen","useState","Bot","ChatModal_default","ChatIcon_default","styleInject","css","insertAt","head","style","styleInject","jsx","ChatBot","apiKey","botName","systemInstruction","resolvedApiKey","resolvedBotName","resolvedSystemInstruction","ChatIcon_default","index_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ChatIcon.tsx","../src/components/ChatModal.tsx","../src/components/ChatContainer.tsx","#style-inject:#style-inject","../src/styles/chatbot.css","../src/index.tsx"],"sourcesContent":["import { useState } from \"react\";\r\nimport { Bot } from \"lucide-react\";\r\nimport ChatModal from \"./ChatModal\";\r\nimport { ChatIconProps } from \"../types\";\r\n\r\nconst ChatIcon: React.FC<ChatIconProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n\r\n const openModal = () => {\r\n setIsModalOpen(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setIsModalOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <button onClick={openModal}>\r\n <div className=\"bg-amber-50 p-4 rounded-full shadow-md fixed bottom-10 right-10 w-16 h-16 flex items-center justify-center cursor-pointer hover:bg-blue-950 transition transform-fill ring:b-amber-500 focus:bg-amber-900 duration-300 border-gray-300 dark:border-white border-2 text-black hover:text-white\">\r\n <Bot className=\"w-10 h-10\" />\r\n </div>\r\n </button>\r\n <div\r\n className={`transition-opacity duration-100 ease-linear ${\r\n isModalOpen ? \"opacity-100\" : \"opacity-0 pointer-events-none\"\r\n }`}\r\n >\r\n {isModalOpen && (\r\n <ChatModal\r\n onClose={closeModal}\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n )}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default ChatIcon;\r\n","import { useState } from \"react\";\r\nimport { Minimize2, Bot, Trash2 } from \"lucide-react\";\r\nimport ChatContainer from \"./ChatContainer\";\r\nimport { ChatModalProps } from \"../types\";\r\n\r\nconst ChatModal: React.FC<ChatModalProps> = ({\r\n onClose,\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [showClearModal, setShowClearModal] = useState(false);\r\n\r\n const clearChat = () => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.removeItem(\"chatMessages\");\r\n window.location.reload();\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"fixed bottom-14 right-8 w-80 h-72 md:w-96 md:h-105 rounded-2xl shadow-lg bg-white font-mono border border-gray-200\">\r\n <header className=\"flex items-center justify-between px-6 py-4 bg-white border-b shadow border-gray-100 rounded-t-2xl\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"bg-blue-950 p-2 rounded-full shadow-sm\">\r\n <Bot className=\"w-5 h-5 text-white\" />\r\n </span>\r\n <div>\r\n <div className=\"text-gray-900 font-semibold text-md tracking-wide\">\r\n {botName}\r\n </div>\r\n <div className=\"text-gray-500 text-xs flex items-center\">\r\n <span>Online 24/7</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <button\r\n onClick={() => setShowClearModal(true)}\r\n aria-label=\"Settings\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 mr-2 cursor-pointer\"\r\n >\r\n <Trash2 className=\"w-5 h-5\" />\r\n </button>\r\n <button\r\n onClick={onClose}\r\n aria-label=\"Minimize chat\"\r\n className=\"text-gray-400 hover:text-gray-700 bg-transparent p-2 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-blue-200 hover:bg-gray-100 cursor-pointer\"\r\n >\r\n <Minimize2 className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </header>\r\n <main className=\"h-full\">\r\n <ChatContainer\r\n apiKey={apiKey}\r\n botName={botName}\r\n systemInstruction={systemInstruction}\r\n />\r\n </main>\r\n\r\n {showClearModal && (\r\n <div className=\"fixed inset-0 border shadow bg-opacity-50 flex items-center justify-center\">\r\n <div className=\"bg-white p-6 rounded-lg shadow-lg\">\r\n <h2 className=\"text-lg font-semibold mb-4 text-gray-800\">\r\n Clear Conversation\r\n </h2>\r\n <p className=\"text-sm text-gray-600 mb-6\">\r\n Are you sure you want to clear the conversation?\r\n </p>\r\n <div className=\"flex justify-end gap-4\">\r\n <button\r\n onClick={() => setShowClearModal(false)}\r\n className=\"px-4 py-2 bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={clearChat}\r\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatModal;\r\n","import { useState, useEffect } from \"react\";\r\nimport { GoogleGenerativeAI } from \"@google/generative-ai\";\r\nimport { ChatContainerProps, Message } from \"../types\";\r\n\r\nconst ChatContainer: React.FC<ChatContainerProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n const [message, setMessage] = useState(\"\");\r\n const [messages, setMessages] = useState<Message[]>(() => {\r\n if (typeof window !== \"undefined\") {\r\n const storedMessages = localStorage.getItem(\"chatMessages\");\r\n return storedMessages\r\n ? JSON.parse(storedMessages)\r\n : [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n sender: \"ai\",\r\n text: `Hello! I'm ${botName}. How can I help you today?`,\r\n },\r\n ];\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window !== \"undefined\") {\r\n localStorage.setItem(\"chatMessages\", JSON.stringify(messages));\r\n }\r\n }, [messages]);\r\n\r\n const handleSend = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!message.trim()) return;\r\n\r\n if (!apiKey) {\r\n console.error(\"API key is missing. Please provide a valid API key.\");\r\n return;\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"user\", text: message },\r\n ]);\r\n const currentMessage = message;\r\n setMessage(\"\");\r\n\r\n try {\r\n const ai = new GoogleGenerativeAI(apiKey);\r\n const model = ai.getGenerativeModel({\r\n model: \"gemini-2.5-flash\",\r\n });\r\n\r\n const promptWithContext = `\r\n ${systemInstruction}\r\n \r\n Previous conversation history:\r\n ${messages\r\n .slice(1)\r\n .map((m: Message) => `${m.sender}: ${m.text}`)\r\n .join(\"\\n\")}\r\n \r\n User asking: ${currentMessage}\r\n `;\r\n\r\n const result = await model.generateContent(promptWithContext);\r\n const response = await result.response;\r\n const aiText = response.text();\r\n\r\n if (!aiText) {\r\n throw new Error(\"Empty response from AI\");\r\n }\r\n\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: aiText },\r\n ]);\r\n } catch (err) {\r\n console.error(\"Chat Error:\", err);\r\n const fallbackResponse =\r\n \"I'm sorry, I'm having trouble connecting right now. Please try again later.\";\r\n setMessages((prev: Message[]) => [\r\n ...prev,\r\n { sender: \"ai\", text: fallbackResponse },\r\n ]);\r\n }\r\n };\r\n\r\n return (\r\n <section className=\"h-full flex flex-col relative max-w-100 mx-auto\">\r\n <div\r\n className=\"flex-1 px-4 py-3 space-y-3 bg-white overflow-y-auto\"\r\n style={{ maxHeight: \"320px\", scrollBehavior: \"smooth\" }}\r\n >\r\n {messages.map((msg: Message, idx: number) => (\r\n <div key={idx} className=\"flex w-full\">\r\n <div\r\n className={`px-3 py-2 rounded-xl shadow-sm border text-sm max-w-[80%] ${\r\n msg.sender === \"ai\"\r\n ? \"bg-gray-50 border-gray-100 text-gray-800\"\r\n : \"bg-blue-600 text-white border-blue-700 ml-auto\"\r\n }`}\r\n >\r\n {msg.text}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n <form\r\n onSubmit={handleSend}\r\n className=\"shrink-0 flex gap-2 border-t border-gray-100 px-4 py-3 bg-white rounded-b-2xl w-full\"\r\n >\r\n <input\r\n id=\"chat-input\"\r\n type=\"text\"\r\n placeholder=\"Type a message...\"\r\n className=\"flex-1 bg-gray-50 outline-none text-sm text-gray-800 placeholder:text-gray-400 px-2 py-1 rounded-lg border border-gray-200 focus:border-blue-300 transition\"\r\n onChange={(e) => setMessage(e.target.value)}\r\n value={message}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"bg-blue-600 text-white px-4 py-1 rounded-lg text-sm shadow-sm font-medium hover:bg-blue-700 transition\"\r\n >\r\n Send\r\n </button>\r\n </form>\r\n </section>\r\n );\r\n};\r\n\r\nexport default ChatContainer;\r\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-900: oklch(41.4% .112 45.904);--color-blue-200: oklch(88.2% .059 254.128);--color-blue-300: oklch(80.9% .105 251.813);--color-blue-600: oklch(54.6% .245 262.881);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-950: oklch(28.2% .091 267.935);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-100: oklch(96.7% .003 264.542);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::-moz-placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}::placeholder{color:currentcolor;@supports (color: color-mix(in lab,red,red)){color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.right-8{right:calc(var(--spacing) * 8)}.right-10{right:calc(var(--spacing) * 10)}.bottom-10{bottom:calc(var(--spacing) * 10)}.bottom-14{bottom:calc(var(--spacing) * 14)}.mx-auto{margin-inline:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.flex{display:flex}.h-5{height:calc(var(--spacing) * 5)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-72{height:calc(var(--spacing) * 72)}.h-full{height:100%}.w-5{width:calc(var(--spacing) * 5)}.w-10{width:calc(var(--spacing) * 10)}.w-16{width:calc(var(--spacing) * 16)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-100{max-width:calc(var(--spacing) * 100)}.max-w-\\\\[80\\\\%\\\\]{max-width:80%}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-3{:where(&>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.opacity-0{opacity:0%}.opacity-100{opacity:100%}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.outline-none{--tw-outline-style: none;outline-style:none}.transform-fill{transform-box:fill-box}.placeholder\\\\:text-gray-400{&::-moz-placeholder{color:var(--color-gray-400)}&::placeholder{color:var(--color-gray-400)}}.hover\\\\:bg-blue-700{&:hover{@media(hover:hover){background-color:var(--color-blue-700)}}}.hover\\\\:bg-blue-950{&:hover{@media(hover:hover){background-color:var(--color-blue-950)}}}.hover\\\\:bg-gray-100{&:hover{@media(hover:hover){background-color:var(--color-gray-100)}}}.hover\\\\:bg-gray-300{&:hover{@media(hover:hover){background-color:var(--color-gray-300)}}}.hover\\\\:bg-red-700{&:hover{@media(hover:hover){background-color:var(--color-red-700)}}}.hover\\\\:text-gray-700{&:hover{@media(hover:hover){color:var(--color-gray-700)}}}.hover\\\\:text-white{&:hover{@media(hover:hover){color:var(--color-white)}}}.focus\\\\:border-blue-300{&:focus{border-color:var(--color-blue-300)}}.focus\\\\:bg-amber-900{&:focus{background-color:var(--color-amber-900)}}.focus\\\\:ring-2{&:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\\\\:ring-blue-200{&:focus{--tw-ring-color: var(--color-blue-200)}}.focus\\\\:outline-none{&:focus{--tw-outline-style: none;outline-style:none}}.md\\\\:h-105{@media(width>=48rem){height:calc(var(--spacing) * 105)}}.md\\\\:w-96{@media(width>=48rem){width:calc(var(--spacing) * 96)}}.dark\\\\:border-white{@media(prefers-color-scheme:dark){border-color:var(--color-white)}}}*{margin:0;padding:0;box-sizing:border-box}.chatbot-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.chatbot-icon-button{position:fixed;bottom:40px;right:40px;width:64px;height:64px;border-radius:50%;background-color:#fffbeb;border:2px solid #d1d5db;box-shadow:0 4px 6px #0000001a;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s ease;z-index:9999}.chatbot-icon-button:hover{background-color:#1e3a8a;color:#fff}.chatbot-icon-button svg{width:40px;height:40px}.chatbot-modal{position:fixed;bottom:72px;right:32px;width:320px;height:288px;border-radius:16px;box-shadow:0 10px 15px #0000001a;background-color:#fff;font-family:monospace;border:1px solid #e5e7eb;transition:opacity .1s linear;z-index:9998}@media(min-width:768px){.chatbot-modal{width:384px;height:420px}}.chatbot-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background-color:#fff;border-bottom:1px solid #f3f4f6;box-shadow:0 1px 2px #0000000d;border-top-left-radius:16px;border-top-right-radius:16px}.chatbot-modal-header-left{display:flex;align-items:center;gap:12px}.chatbot-modal-bot-icon{background-color:#172554;padding:8px;border-radius:50%;box-shadow:0 1px 2px #0000000d}.chatbot-modal-bot-icon svg{width:20px;height:20px;color:#fff}.chatbot-modal-title{color:#111827;font-weight:600;font-size:16px;letter-spacing:.025em}.chatbot-modal-status{color:#6b7280;font-size:12px;display:flex;align-items:center}.chatbot-modal-header-right{display:flex}.chatbot-modal-header-button{color:#9ca3af;background:transparent;padding:8px;border-radius:6px;transition:all .2s;border:none;cursor:pointer;margin-left:8px}.chatbot-modal-header-button:hover{color:#374151;background-color:#f3f4f6}.chatbot-modal-header-button:focus{outline:none;box-shadow:0 0 0 2px #dbeafe}.chatbot-modal-header-button svg{width:20px;height:20px}.chatbot-modal-main{height:100%}.chatbot-container-section{height:100%;display:flex;flex-direction:column;position:relative;max-width:400px;margin:0 auto}.chatbot-messages{flex:1;padding:12px 16px;display:flex;flex-direction:column;gap:12px;background-color:#fff;overflow-y:auto;max-height:320px;scroll-behavior:smooth}.chatbot-message-wrapper{display:flex;width:100%}.chatbot-message{padding:12px;border-radius:12px;box-shadow:0 1px 2px #0000000d;border:1px solid;font-size:14px;max-width:80%;word-wrap:break-word}.chatbot-message.ai{background-color:#f9fafb;border-color:#f3f4f6;color:#1f2937}.chatbot-message.user{background-color:#2563eb;color:#fff;border-color:#1d4ed8;margin-left:auto}.chatbot-form{flex-shrink:0;display:flex;gap:8px;border-top:1px solid #f3f4f6;padding:12px 16px;background-color:#fff;border-bottom-left-radius:16px;border-bottom-right-radius:16px;width:100%}.chatbot-input{flex:1;background-color:#f9fafb;outline:none;font-size:14px;color:#1f2937;padding:8px;border-radius:8px;border:1px solid #e5e7eb;transition:border-color .2s}.chatbot-input::-moz-placeholder{color:#9ca3af}.chatbot-input::placeholder{color:#9ca3af}.chatbot-input:focus{border-color:#93c5fd}.chatbot-send-button{background-color:#2563eb;color:#fff;padding:8px 16px;border-radius:8px;font-size:14px;box-shadow:0 1px 2px #0000000d;font-weight:500;border:none;cursor:pointer;transition:background-color .2s}.chatbot-send-button:hover{background-color:#1d4ed8}.chatbot-clear-modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.chatbot-clear-modal{background-color:#fff;padding:24px;border-radius:8px;box-shadow:0 10px 15px #0000001a}.chatbot-clear-modal-title{font-size:18px;font-weight:600;margin-bottom:16px;color:#1f2937}.chatbot-clear-modal-text{font-size:14px;color:#6b7280;margin-bottom:24px}.chatbot-clear-modal-buttons{display:flex;justify-content:flex-end;gap:16px}.chatbot-clear-modal-button{padding:8px 16px;border-radius:6px;cursor:pointer;border:none;transition:background-color .2s}.chatbot-clear-modal-button.cancel{background-color:#e5e7eb;color:#374151}.chatbot-clear-modal-button.cancel:hover{background-color:#d1d5db}.chatbot-clear-modal-button.clear{background-color:#dc2626;color:#fff}.chatbot-clear-modal-button.clear:hover{background-color:#b91c1c}.chatbot-modal-fade{opacity:0;pointer-events:none}.chatbot-modal-show{opacity:1}@property --tw-space-y-reverse{syntax: \\\"*\\\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \\\"*\\\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \\\"*\\\"; inherits: false;}@property --tw-tracking{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \\\"<percentage>\\\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \\\"*\\\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \\\"*\\\"; inherits: false;}@property --tw-ring-offset-width{syntax: \\\"<length>\\\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \\\"*\\\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \\\"*\\\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-duration{syntax: \\\"*\\\"; inherits: false;}@property --tw-ease{syntax: \\\"*\\\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-duration: initial;--tw-ease: initial}}}\\n\")","import React from \"react\";\r\nimport ChatIcon from \"./components/ChatIcon\";\r\nimport { ChatBotProps } from \"./types\";\r\nimport \"./styles/chatbot.css\";\r\n\r\n/**\r\n * ChatBot Component - A reusable AI chatbot powered by Google Gemini\r\n *\r\n * @param {ChatBotProps} props - Configuration props for the chatbot\r\n * @param {string} [props.apiKey] - Google Gemini API key (falls back to NEXT_PUBLIC_GEMINI_API_KEY)\r\n * @param {string} [props.botName] - Name of the bot (falls back to NEXT_PUBLIC_AI_BOT_NAME or \"AI Assistant\")\r\n * @param {string} [props.systemInstruction] - System instruction for the bot (falls back to NEXT_PUBLIC_SYSTEM_INSTRUCTION)\r\n *\r\n * @example\r\n * // Using environment variables\r\n * <ChatBot />\r\n */\r\nconst ChatBot: React.FC<ChatBotProps> = ({\r\n apiKey,\r\n botName,\r\n systemInstruction,\r\n}) => {\r\n // Fallback to environment variables if props are not provided\r\n const resolvedApiKey =\r\n apiKey ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_GEMINI_API_KEY\r\n ? process.env.NEXT_PUBLIC_GEMINI_API_KEY\r\n : \"\");\r\n\r\n const resolvedBotName =\r\n botName ||\r\n (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_AI_BOT_NAME\r\n ? process.env.NEXT_PUBLIC_AI_BOT_NAME\r\n : \"AI Assistant\");\r\n\r\n const resolvedSystemInstruction =\r\n systemInstruction ||\r\n (typeof process !== \"undefined\" &&\r\n process.env?.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n ? process.env.NEXT_PUBLIC_SYSTEM_INSTRUCTION\r\n : \"You are a helpful AI assistant.\");\r\n\r\n // Warn if API key is missing\r\n if (!resolvedApiKey) {\r\n console.warn(\r\n \"ChatBot: API key is missing. Please provide it via environment variable NEXT_PUBLIC_GEMINI_API_KEY\"\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"chatbot-container\">\r\n <ChatIcon\r\n apiKey={resolvedApiKey} // The API key used to authenticate with Google Gemini\r\n botName={resolvedBotName} // The name of the bot displayed to users\r\n systemInstruction={resolvedSystemInstruction} // The context or behavior instruction for the bot\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatBot;\r\nexport type { ChatBotProps, Message } from \"./types\";\r\n"],"mappings":"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","names":["useState","Bot","useState","Minimize2","Bot","Trash2","useState","useEffect","GoogleGenerativeAI","jsx","jsxs","ChatContainer","apiKey","botName","systemInstruction","message","setMessage","messages","setMessages","storedMessages","handleSend","e","prev","currentMessage","model","promptWithContext","m","aiText","err","fallbackResponse","msg","idx","ChatContainer_default","jsx","jsxs","ChatModal","onClose","apiKey","botName","systemInstruction","showClearModal","setShowClearModal","useState","Bot","Trash2","Minimize2","ChatContainer_default","ChatModal_default","Fragment","jsx","jsxs","ChatIcon","apiKey","botName","systemInstruction","isModalOpen","setIsModalOpen","useState","Bot","ChatModal_default","ChatIcon_default","styleInject","css","insertAt","head","style","styleInject","jsx","ChatBot","apiKey","botName","systemInstruction","resolvedApiKey","resolvedBotName","resolvedSystemInstruction","ChatIcon_default","index_default"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chatx-ai",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"description": "A flexible and reusable SDK for building AI-powered chatbots in React applications, leveraging the Google Gemini API for advanced conversational capabilities.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|