peppermint-chatbot-sdk 0.1.10 → 0.1.13

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/dist/index.js CHANGED
@@ -41,31 +41,77 @@ var import_react = require("react");
41
41
  // src/react/PeppermintChatbot/index.styles.ts
42
42
  var import_styled_components = __toESM(require("styled-components"));
43
43
  var Container = import_styled_components.default.div`
44
+ position: fixed;
45
+ bottom: 32px;
46
+ right: 32px;
47
+ width: fit-content;
48
+ height: fit-content;
49
+ display: flex;
50
+ flex-direction: column;
51
+ `;
52
+ var WidgetButton = import_styled_components.default.button`
53
+ width: 60px;
54
+ height: 60px;
55
+ border: none;
56
+ border-radius: 50%;
57
+ cursor: pointer;
58
+ padding: 0;
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ color: #ffffff;
63
+ background: #1a1a1a;
64
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
65
+
66
+ transition: all 0.2s ease-in-out;
67
+
68
+ &:hover {
69
+ transform: scale(1.05);
70
+ }
71
+ `;
72
+ var ChatbotContainer = import_styled_components.default.div`
73
+ position: absolute;
74
+ bottom: calc(100% + 16px);
75
+ right: 0;
44
76
  box-sizing: border-box;
45
77
  background: #ffffff;
46
78
  width: 450px;
47
79
  height: 500px;
48
80
  min-height: 320px;
49
81
  max-height: 520px;
50
- border-radius: 24px;
82
+ border-radius: 20px 20px 24px 24px;
51
83
  border: 1px solid #e0e0e0;
52
84
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
53
85
  overflow: hidden;
54
-
86
+
55
87
  display: flex;
56
88
  flex-direction: column;
57
89
 
58
90
  font-family: system-ui, -apple-system, sans-serif;
59
91
  font-size: 14px;
60
92
  color: #1a1a1a;
93
+
94
+ opacity: ${(p) => p.$visible ? 1 : 0};
95
+ filter: ${(p) => p.$visible ? "blur(0)" : "blur(8px)"};
96
+ transition: opacity 0.3s ease-out, filter 0.3s ease-out;
97
+ pointer-events: ${(p) => p.$visible ? "auto" : "none"};
61
98
  `;
62
99
  var Header = import_styled_components.default.div`
100
+ position: relative;
63
101
  height: 44px;
64
102
  display: flex;
65
103
  justify-content: space-between;
66
104
  align-items: center;
67
105
  padding: 0 8px 0 16px;
68
106
  `;
107
+ var HeaderMarginBottom = import_styled_components.default.div`
108
+ position: absolute;
109
+ top: 100%;
110
+ left: 0;
111
+ right: 0;
112
+ height: 8px;
113
+ background: linear-gradient(to top, transparent, #ffffff);
114
+ `;
69
115
  var ChatbotName = import_styled_components.default.div`
70
116
  font-size: 14px;
71
117
  color: #1a1a1a;
@@ -90,11 +136,31 @@ var IconButton = import_styled_components.default.button`
90
136
  var MessageList = import_styled_components.default.div`
91
137
  flex: 1;
92
138
  overflow-y: auto;
139
+ overflow-x: hidden;
93
140
 
94
141
  display: flex;
95
142
  flex-direction: column;
96
143
  gap: 0.75rem;
97
144
  padding: 16px;
145
+
146
+ /* Firefox */
147
+ scrollbar-width: thin;
148
+ scrollbar-color: rgba(0, 0, 0, 0.25) transparent;
149
+
150
+ /* WebKit (Chrome, Safari, Edge) */
151
+ &::-webkit-scrollbar {
152
+ width: 8px;
153
+ }
154
+ &::-webkit-scrollbar-track {
155
+ background: transparent;
156
+ }
157
+ &::-webkit-scrollbar-thumb {
158
+ background: rgba(0, 0, 0, 0.25);
159
+ border-radius: 4px;
160
+ }
161
+ &::-webkit-scrollbar-thumb:hover {
162
+ background: rgba(0, 0, 0, 0.35);
163
+ }
98
164
  `;
99
165
  var MessageBubble = import_styled_components.default.div`
100
166
  max-width: 85%;
@@ -109,28 +175,40 @@ var MessageBubble = import_styled_components.default.div`
109
175
  background: ${(p) => p.$role === "user" ? "#2d2d2d" : "#f0f0f0"};
110
176
  color: ${(p) => p.$role === "user" ? "#ffffff" : "#1a1a1a"};
111
177
  `;
178
+ var Footer = import_styled_components.default.div`
179
+ background-color: transparent;
180
+ position: relative;
181
+ `;
182
+ var InputContainerMarginTop = import_styled_components.default.div`
183
+ position: absolute;
184
+ top: -8px;
185
+ left: 0;
186
+ right: 0;
187
+ height: 8px;
188
+ background: linear-gradient(to bottom, transparent, #ffffff);
189
+ `;
112
190
  var InputContainer = import_styled_components.default.div`
191
+ position: relative;
113
192
  height: 90px;
114
193
  display: flex;
115
194
  flex-direction: column;
116
- border: 1px solid #e0e0e0;
195
+ justify-content: flex-end;
117
196
  border-radius: 16px;
197
+ border: 1px solid #e0e0e0;
118
198
  background: #ffffff;
119
- margin: 8px 16px 16px 16px;
120
- padding: 4px 4px 4px 16px;
121
-
199
+ margin: 8px 16px 0px 16px;
200
+
122
201
  &:focus-within {
123
202
  border-color: rgba(0, 0, 0, 0.3);
124
203
  }
125
204
  `;
126
205
  var Textarea = import_styled_components.default.textarea`
127
206
  flex: 1;
128
- min-width: 0;
129
- padding: 10px 0;
207
+ background-color: transparent;
208
+ margin: 8px 8px 8px 16px;
130
209
  border: none;
131
210
  font-size: 14px;
132
211
  outline: none;
133
- background: transparent;
134
212
  resize: none;
135
213
  min-height: 24px;
136
214
  max-height: 120px;
@@ -140,14 +218,42 @@ var Textarea = import_styled_components.default.textarea`
140
218
  &::placeholder {
141
219
  color: #888;
142
220
  }
221
+
222
+ /* Firefox */
223
+ scrollbar-width: thin;
224
+ scrollbar-color: rgba(0, 0, 0, 0.25) transparent;
225
+
226
+ /* WebKit (Chrome, Safari, Edge) */
227
+ &::-webkit-scrollbar {
228
+ width: 8px;
229
+ }
230
+ &::-webkit-scrollbar-track {
231
+ background: transparent;
232
+ }
233
+ &::-webkit-scrollbar-thumb {
234
+ background: rgba(0, 0, 0, 0.25);
235
+ border-radius: 4px;
236
+ }
237
+ &::-webkit-scrollbar-thumb:hover {
238
+ background: rgba(0, 0, 0, 0.35);
239
+ }
240
+ `;
241
+ var InputContainerFooter = import_styled_components.default.div`
242
+ position: absolute;
243
+ bottom: 0;
244
+ right: 0;
245
+ height: 36px;
246
+ display: flex;
247
+ justify-content: flex-end;
248
+ align-items: center;
249
+ padding-left: 4px;
250
+ padding-right: 4px;
251
+ background-color: transparent;
143
252
  `;
144
253
  var SendButton = import_styled_components.default.button`
145
- flex-shrink: 0;
146
- align-self: flex-end;
147
254
  width: 28px;
148
255
  height: 28px;
149
256
  padding: 0;
150
- margin: 0 4px 4px 0;
151
257
  display: flex;
152
258
  align-items: center;
153
259
  justify-content: center;
@@ -166,13 +272,52 @@ var SendButton = import_styled_components.default.button`
166
272
  cursor: not-allowed;
167
273
  }
168
274
  `;
275
+ var PoweredBy = import_styled_components.default.a`
276
+ display: block;
277
+ font-size: 8px;
278
+ color: #888;
279
+ text-decoration: none;
280
+ padding: 4px 16px 4px 16px;
281
+ text-align: center;
282
+ cursor: pointer;
283
+
284
+ &:hover {
285
+ color: #1a1a1a;
286
+ }
287
+ `;
288
+
289
+ // src/assets/logo-transparent.png
290
+ var logo_transparent_default = "data:image/png;base64,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";
169
291
 
170
292
  // src/react/PeppermintChatbot/index.tsx
171
293
  var import_jsx_runtime = require("react/jsx-runtime");
294
+ var BLUR_FADE_MS = 200;
172
295
  function PeppermintChatbot() {
296
+ const [isOpen, setIsOpen] = (0, import_react.useState)(false);
297
+ const [isVisible, setIsVisible] = (0, import_react.useState)(false);
298
+ const [isTransitioningOpen, setIsTransitioningOpen] = (0, import_react.useState)(false);
173
299
  const [input, setInput] = (0, import_react.useState)("");
174
300
  const [messageList, setMessageList] = (0, import_react.useState)([]);
175
301
  const messagesEndRef = (0, import_react.useRef)(null);
302
+ (0, import_react.useEffect)(() => {
303
+ if (isOpen) {
304
+ setIsVisible(true);
305
+ let cancelled = false;
306
+ const id = requestAnimationFrame(() => {
307
+ requestAnimationFrame(() => {
308
+ if (!cancelled) setIsTransitioningOpen(true);
309
+ });
310
+ });
311
+ return () => {
312
+ cancelled = true;
313
+ cancelAnimationFrame(id);
314
+ };
315
+ } else {
316
+ setIsTransitioningOpen(false);
317
+ const id = window.setTimeout(() => setIsVisible(false), BLUR_FADE_MS);
318
+ return () => clearTimeout(id);
319
+ }
320
+ }, [isOpen]);
176
321
  (0, import_react.useEffect)(() => {
177
322
  messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
178
323
  }, [messageList]);
@@ -188,76 +333,94 @@ function PeppermintChatbot() {
188
333
  setMessageList((prev) => [...prev, userMessage]);
189
334
  setInput("");
190
335
  };
191
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Container, { children: [
192
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Header, { children: [
193
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChatbotName, { children: "Peppermint Chatbot" }),
194
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconButton, { type: "button", "aria-label": "Minimize", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
195
- "svg",
196
- {
197
- width: "20",
198
- height: "20",
199
- viewBox: "0 0 24 24",
200
- fill: "none",
201
- stroke: "currentColor",
202
- strokeWidth: "2",
203
- strokeLinecap: "round",
204
- strokeLinejoin: "round",
205
- "aria-hidden": true,
206
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12h14" })
207
- }
208
- ) })
209
- ] }),
210
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(MessageList, { children: [
211
- messageList.map((msg) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageBubble, { $role: msg.role, children: msg.content }, msg.id)),
212
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: messagesEndRef })
213
- ] }),
214
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(InputContainer, { children: [
215
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
216
- Textarea,
217
- {
218
- placeholder: "Type a message...",
219
- value: input,
220
- onChange: (e) => setInput(e.target.value),
221
- onKeyDown: (e) => {
222
- if (e.key === "Enter" && !e.nativeEvent.isComposing) {
223
- if (!e.shiftKey) {
224
- e.preventDefault();
225
- handleSend();
226
- }
336
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Container, { id: "peppermint-chatbot-container", children: [
337
+ isVisible && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(ChatbotContainer, { $visible: isOpen && isTransitioningOpen, children: [
338
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Header, { children: [
339
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChatbotName, { children: "Peppermint Chatbot" }),
340
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconButton, { type: "button", "aria-label": "Minimize", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
341
+ "svg",
342
+ {
343
+ width: "20",
344
+ height: "20",
345
+ viewBox: "0 0 24 24",
346
+ fill: "none",
347
+ stroke: "currentColor",
348
+ strokeWidth: "2",
349
+ strokeLinecap: "round",
350
+ strokeLinejoin: "round",
351
+ "aria-hidden": true,
352
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12h14" })
353
+ }
354
+ ) }),
355
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HeaderMarginBottom, {})
356
+ ] }),
357
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(MessageList, { children: [
358
+ messageList.map((msg) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageBubble, { $role: msg.role, children: msg.content }, msg.id)),
359
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: messagesEndRef })
360
+ ] }),
361
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Footer, { children: [
362
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InputContainerMarginTop, {}),
363
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(InputContainer, { children: [
364
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
365
+ Textarea,
366
+ {
367
+ id: "peppermint-chatbot-textarea",
368
+ placeholder: "Type a message...",
369
+ value: input,
370
+ onChange: (e) => setInput(e.target.value),
371
+ onKeyDown: (e) => {
372
+ if (e.key === "Enter" && !e.nativeEvent.isComposing) {
373
+ if (!e.shiftKey) {
374
+ e.preventDefault();
375
+ handleSend();
376
+ }
377
+ }
378
+ },
379
+ rows: 1,
380
+ "aria-label": "Message"
227
381
  }
228
- },
229
- rows: 1,
230
- "aria-label": "Message"
231
- }
232
- ),
233
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
234
- SendButton,
235
- {
236
- type: "button",
237
- onClick: handleSend,
238
- disabled: !input.trim(),
239
- "aria-label": "Send",
240
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
241
- "svg",
382
+ ),
383
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InputContainerFooter, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
384
+ SendButton,
242
385
  {
243
- width: "16",
244
- height: "16",
245
- viewBox: "0 0 24 24",
246
- fill: "none",
247
- stroke: "currentColor",
248
- strokeWidth: "2.5",
249
- strokeLinecap: "round",
250
- strokeLinejoin: "round",
251
- "aria-hidden": true,
252
- children: [
253
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 19V5" }),
254
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12l7-7 7 7" })
255
- ]
386
+ type: "button",
387
+ onClick: handleSend,
388
+ disabled: !input.trim(),
389
+ "aria-label": "Send",
390
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
391
+ "svg",
392
+ {
393
+ width: "16",
394
+ height: "16",
395
+ viewBox: "0 0 24 24",
396
+ fill: "none",
397
+ stroke: "currentColor",
398
+ strokeWidth: "2.5",
399
+ strokeLinecap: "round",
400
+ strokeLinejoin: "round",
401
+ "aria-hidden": true,
402
+ children: [
403
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 19V5" }),
404
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12l7-7 7 7" })
405
+ ]
406
+ }
407
+ )
256
408
  }
257
- )
258
- }
259
- )
260
- ] })
409
+ ) })
410
+ ] }),
411
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PoweredBy, { href: "", target: "_blank", rel: "noopener noreferrer", children: "Powered by Peppermint Chatbot" })
412
+ ] })
413
+ ] }),
414
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(WidgetButton, { onClick: () => setIsOpen((prev) => !prev), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
415
+ "img",
416
+ {
417
+ src: logo_transparent_default,
418
+ alt: "Peppermint Chatbot",
419
+ width: 60,
420
+ height: 60,
421
+ draggable: false
422
+ }
423
+ ) })
261
424
  ] });
262
425
  }
263
426
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/react/PeppermintChatbot/index.tsx","../src/react/PeppermintChatbot/index.styles.ts","../src/vanilla/index.ts"],"sourcesContent":["export { PeppermintChatbot } from \"./react\";\nexport { createChatbot } from \"./vanilla\";\n","import { useState, useRef, useEffect } from \"react\";\nimport {\n Container,\n MessageList,\n MessageBubble,\n InputContainer,\n Textarea,\n SendButton,\n Header,\n ChatbotName,\n IconButton,\n} from \"./index.styles\";\nimport type { Message } from \"./index.types\";\n\nfunction PeppermintChatbot() {\n const [input, setInput] = useState(\"\");\n const [messageList, setMessageList] = useState<Message[]>([]);\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messageList]);\n\n const handleSend = () => {\n const text = input.trim();\n\n if (!text) return;\n\n const userMessage: Message = {\n id: `u-${Date.now()}`,\n role: \"user\",\n content: text,\n timestamp: new Date().toISOString(),\n };\n\n setMessageList((prev) => [...prev, userMessage]);\n setInput(\"\");\n };\n\n return (\n <Container>\n <Header>\n <ChatbotName>Peppermint Chatbot</ChatbotName>\n <IconButton type=\"button\" aria-label=\"Minimize\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M5 12h14\" />\n </svg>\n </IconButton>\n </Header>\n\n <MessageList>\n {messageList.map((msg) => (\n <MessageBubble key={msg.id} $role={msg.role}>\n {msg.content}\n </MessageBubble>\n ))}\n\n <div ref={messagesEndRef} />\n </MessageList>\n\n <InputContainer>\n <Textarea\n placeholder=\"Type a message...\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.nativeEvent.isComposing) {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }\n }}\n rows={1}\n aria-label=\"Message\"\n />\n <SendButton\n type=\"button\"\n onClick={handleSend}\n disabled={!input.trim()}\n aria-label=\"Send\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M12 19V5\" />\n <path d=\"M5 12l7-7 7 7\" />\n </svg>\n </SendButton>\n </InputContainer>\n </Container>\n );\n}\n\nexport { PeppermintChatbot };\n","import styled from \"styled-components\";\nimport type { ComponentType } from \"react\";\nimport type { Role } from \"./index.types\";\n\nconst Container: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n box-sizing: border-box;\n background: #ffffff;\n width: 450px;\n height: 500px;\n min-height: 320px;\n max-height: 520px;\n border-radius: 24px;\n border: 1px solid #e0e0e0;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);\n overflow: hidden;\n \n display: flex;\n flex-direction: column;\n\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n color: #1a1a1a;\n`;\n\nconst Header: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n height: 44px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0 8px 0 16px;\n`;\n\nconst ChatbotName: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n font-size: 14px;\n color: #1a1a1a;\n`;\n\nconst IconButton: ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = styled.button`\n width: 32px;\n height: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #1a1a1a;\n background: transparent;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n\n &:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n`;\n\nconst MessageList: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n flex: 1;\n overflow-y: auto;\n\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 16px;\n`;\n\nconst MessageBubble: ComponentType<React.HTMLAttributes<HTMLDivElement> & { $role: Role }> = styled.div`\n max-width: 85%;\n border-radius: 12px;\n\n padding: 0.6rem 1rem;\n \n word-break: break-word;\n line-height: 1.45;\n\n align-self: ${(p) => (p.$role === \"user\" ? \"flex-end\" : \"flex-start\")};\n background: ${(p) => (p.$role === \"user\" ? \"#2d2d2d\" : \"#f0f0f0\")};\n color: ${(p) => (p.$role === \"user\" ? \"#ffffff\" : \"#1a1a1a\")};\n`;\n\nconst InputContainer: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n height: 90px;\n display: flex;\n flex-direction: column;\n border: 1px solid #e0e0e0;\n border-radius: 16px;\n background: #ffffff;\n margin: 8px 16px 16px 16px;\n padding: 4px 4px 4px 16px;\n\n &:focus-within {\n border-color: rgba(0, 0, 0, 0.3);\n }\n`;\n\nconst Textarea: ComponentType<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>\n> = styled.textarea`\n flex: 1;\n min-width: 0;\n padding: 10px 0;\n border: none;\n font-size: 14px;\n outline: none;\n background: transparent;\n resize: none;\n min-height: 24px;\n max-height: 120px;\n line-height: 1.4;\n font-family: inherit;\n\n &::placeholder {\n color: #888;\n }\n`;\n\nconst SendButton: ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = styled.button`\n flex-shrink: 0;\n align-self: flex-end;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0 4px 4px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n background: #1a1a1a;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n\n &:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nexport {\n Container,\n Header,\n ChatbotName,\n IconButton,\n MessageList,\n MessageBubble,\n InputContainer,\n Textarea,\n SendButton,\n};\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { PeppermintChatbot } from \"../react\";\n\n/**\n * Mount the chatbot into a container (vanilla JS, Vue, Svelte).\n * Requires react and react-dom to be available (e.g. via script or bundler).\n */\nexport function createChatbot(\n container: HTMLElement,\n props: {\n /** Layout: \"widget\" (bubble) or \"page\" (full card) */\n layout?: \"widget\" | \"page\";\n /** Chatbot display name */\n chatbotName?: string;\n /** Greeting message shown when chat is empty */\n greetingMessage?: string;\n /** Optional chatbot avatar URL */\n chatbotProfileImage?: string;\n /** Optional user avatar URL */\n userProfileImage?: string;\n /** Background color (hex) */\n backgroundColor?: string;\n /** Font color (hex) */\n fontColor?: string;\n /** Chatbot bubble color (hex) */\n chatbotBubbleColor?: string;\n /** User bubble color (hex) */\n userBubbleColor?: string;\n /** Initial messages (e.g. from API) */\n initialMessages?: {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n timestamp?: string;\n }[];\n /** Callback when user sends a message */\n onSendMessage?: (content: string) => void;\n /** Optional class name for the root container */\n className?: string;\n } = {}\n): { unmount: () => void } {\n const root = createRoot(container);\n root.render(React.createElement(PeppermintChatbot, props));\n return {\n unmount: () => root.unmount(),\n };\n}\n\n"],"mappings":"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","names":["styled","import_react","React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/react/PeppermintChatbot/index.tsx","../src/react/PeppermintChatbot/index.styles.ts","../src/vanilla/index.ts"],"sourcesContent":["export { PeppermintChatbot } from \"./react\";\nexport { createChatbot } from \"./vanilla\";\n","import { useState, useRef, useEffect } from \"react\";\nimport {\n ChatbotContainer,\n MessageList,\n MessageBubble,\n InputContainer,\n Textarea,\n SendButton,\n Header,\n ChatbotName,\n IconButton,\n PoweredBy,\n Footer,\n InputContainerFooter,\n InputContainerMarginTop,\n HeaderMarginBottom,\n WidgetButton,\n Container,\n} from \"./index.styles\";\nimport type { Message } from \"./index.types\";\nimport LogoTransparent from \"../../assets/logo-transparent.png\";\n\nconst BLUR_FADE_MS = 200;\n\nfunction PeppermintChatbot() {\n const [isOpen, setIsOpen] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const [isTransitioningOpen, setIsTransitioningOpen] = useState(false);\n const [input, setInput] = useState(\"\");\n const [messageList, setMessageList] = useState<Message[]>([]);\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isOpen) {\n setIsVisible(true);\n let cancelled = false;\n const id = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (!cancelled) setIsTransitioningOpen(true);\n });\n });\n return () => {\n cancelled = true;\n cancelAnimationFrame(id);\n };\n } else {\n setIsTransitioningOpen(false);\n const id = window.setTimeout(() => setIsVisible(false), BLUR_FADE_MS);\n return () => clearTimeout(id);\n }\n }, [isOpen]);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messageList]);\n\n const handleSend = () => {\n const text = input.trim();\n\n if (!text) return;\n\n const userMessage: Message = {\n id: `u-${Date.now()}`,\n role: \"user\",\n content: text,\n timestamp: new Date().toISOString(),\n };\n\n setMessageList((prev) => [...prev, userMessage]);\n setInput(\"\");\n };\n\n return (\n <Container id=\"peppermint-chatbot-container\">\n {isVisible && (\n <ChatbotContainer $visible={isOpen && isTransitioningOpen}>\n <Header>\n <ChatbotName>Peppermint Chatbot</ChatbotName>\n <IconButton type=\"button\" aria-label=\"Minimize\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M5 12h14\" />\n </svg>\n </IconButton>\n <HeaderMarginBottom />\n </Header>\n\n <MessageList>\n {messageList.map((msg) => (\n <MessageBubble key={msg.id} $role={msg.role}>\n {msg.content}\n </MessageBubble>\n ))}\n\n <div ref={messagesEndRef} />\n </MessageList>\n\n <Footer>\n <InputContainerMarginTop />\n <InputContainer>\n <Textarea\n id=\"peppermint-chatbot-textarea\"\n placeholder=\"Type a message...\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.nativeEvent.isComposing) {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }\n }}\n rows={1}\n aria-label=\"Message\"\n />\n\n <InputContainerFooter>\n <SendButton\n type=\"button\"\n onClick={handleSend}\n disabled={!input.trim()}\n aria-label=\"Send\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M12 19V5\" />\n <path d=\"M5 12l7-7 7 7\" />\n </svg>\n </SendButton>\n </InputContainerFooter>\n </InputContainer>\n\n <PoweredBy href=\"\" target=\"_blank\" rel=\"noopener noreferrer\">\n Powered by Peppermint Chatbot\n </PoweredBy>\n </Footer>\n </ChatbotContainer>\n )}\n\n <WidgetButton onClick={() => setIsOpen((prev) => !prev)}>\n <img\n src={LogoTransparent}\n alt=\"Peppermint Chatbot\"\n width={60}\n height={60}\n draggable={false}\n />\n </WidgetButton>\n </Container>\n );\n}\n\nexport { PeppermintChatbot };\n","import styled from \"styled-components\";\nimport type { ComponentType } from \"react\";\nimport type { Role } from \"./index.types\";\n\nconst Container: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n position: fixed;\n bottom: 32px;\n right: 32px;\n width: fit-content;\n height: fit-content;\n display: flex;\n flex-direction: column;\n`;\n\nconst WidgetButton: ComponentType<React.HTMLAttributes<HTMLButtonElement>> = styled.button`\n width: 60px;\n height: 60px;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ffffff;\n background: #1a1a1a;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);\n\n transition: all 0.2s ease-in-out;\n\n &:hover {\n transform: scale(1.05);\n }\n`;\n\nconst ChatbotContainer: ComponentType<\n React.HTMLAttributes<HTMLDivElement> & { $visible?: boolean }\n> = styled.div<{ $visible?: boolean }>`\n position: absolute;\n bottom: calc(100% + 16px);\n right: 0;\n box-sizing: border-box;\n background: #ffffff;\n width: 450px;\n height: 500px;\n min-height: 320px;\n max-height: 520px;\n border-radius: 20px 20px 24px 24px;\n border: 1px solid #e0e0e0;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);\n overflow: hidden;\n\n display: flex;\n flex-direction: column;\n\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n color: #1a1a1a;\n\n opacity: ${(p) => (p.$visible ? 1 : 0)};\n filter: ${(p) => (p.$visible ? \"blur(0)\" : \"blur(8px)\")};\n transition: opacity 0.3s ease-out, filter 0.3s ease-out;\n pointer-events: ${(p) => (p.$visible ? \"auto\" : \"none\")};\n`;\n\nconst Header: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n position: relative;\n height: 44px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0 8px 0 16px;\n`;\n\nconst HeaderMarginBottom: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: 8px;\n background: linear-gradient(to top, transparent, #ffffff);\n`;\n\nconst ChatbotName: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n font-size: 14px;\n color: #1a1a1a;\n`;\n\nconst IconButton: ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = styled.button`\n width: 32px;\n height: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #1a1a1a;\n background: transparent;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n\n &:hover {\n background: rgba(0, 0, 0, 0.06);\n }\n`;\n\nconst MessageList: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 16px;\n\n /* Firefox */\n scrollbar-width: thin;\n scrollbar-color: rgba(0, 0, 0, 0.25) transparent;\n\n /* WebKit (Chrome, Safari, Edge) */\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n &::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.25);\n border-radius: 4px;\n }\n &::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.35);\n }\n`;\n\nconst MessageBubble: ComponentType<React.HTMLAttributes<HTMLDivElement> & { $role: Role }> = styled.div`\n max-width: 85%;\n border-radius: 12px;\n\n padding: 0.6rem 1rem;\n \n word-break: break-word;\n line-height: 1.45;\n\n align-self: ${(p) => (p.$role === \"user\" ? \"flex-end\" : \"flex-start\")};\n background: ${(p) => (p.$role === \"user\" ? \"#2d2d2d\" : \"#f0f0f0\")};\n color: ${(p) => (p.$role === \"user\" ? \"#ffffff\" : \"#1a1a1a\")};\n`;\n\nconst Footer: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n background-color: transparent;\n position: relative;\n`;\n\nconst InputContainerMarginTop: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n position: absolute;\n top: -8px;\n left: 0;\n right: 0;\n height: 8px;\n background: linear-gradient(to bottom, transparent, #ffffff);\n`;\n\nconst InputContainer: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n position: relative;\n height: 90px;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n border-radius: 16px;\n border: 1px solid #e0e0e0;\n background: #ffffff;\n margin: 8px 16px 0px 16px;\n \n &:focus-within {\n border-color: rgba(0, 0, 0, 0.3);\n }\n`;\n\nconst Textarea: ComponentType<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>\n> = styled.textarea`\n flex: 1;\n background-color: transparent;\n margin: 8px 8px 8px 16px;\n border: none;\n font-size: 14px;\n outline: none;\n resize: none;\n min-height: 24px;\n max-height: 120px;\n line-height: 1.4;\n font-family: inherit;\n\n &::placeholder {\n color: #888;\n }\n\n /* Firefox */\n scrollbar-width: thin;\n scrollbar-color: rgba(0, 0, 0, 0.25) transparent;\n\n /* WebKit (Chrome, Safari, Edge) */\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n &::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.25);\n border-radius: 4px;\n }\n &::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.35);\n }\n`;\n\nconst InputContainerFooter: ComponentType<React.HTMLAttributes<HTMLDivElement>> = styled.div`\n position: absolute;\n bottom: 0;\n right: 0;\n height: 36px;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n padding-left: 4px;\n padding-right: 4px;\n background-color: transparent;\n`;\n\nconst SendButton: ComponentType<\n React.ButtonHTMLAttributes<HTMLButtonElement>\n> = styled.button`\n width: 28px;\n height: 28px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n background: #1a1a1a;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n\n &:hover:not(:disabled) {\n opacity: 0.9;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst PoweredBy: ComponentType<React.AnchorHTMLAttributes<HTMLAnchorElement>> = styled.a`\n display: block;\n font-size: 8px;\n color: #888;\n text-decoration: none;\n padding: 4px 16px 4px 16px;\n text-align: center;\n cursor: pointer;\n\n &:hover {\n color: #1a1a1a;\n }\n`;\n\nexport {\n Container,\n WidgetButton,\n ChatbotContainer,\n Header,\n HeaderMarginBottom,\n ChatbotName,\n IconButton,\n MessageList,\n MessageBubble,\n Footer,\n InputContainerMarginTop,\n InputContainer,\n Textarea,\n InputContainerFooter,\n SendButton,\n PoweredBy,\n};\n","import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { PeppermintChatbot } from \"../react\";\n\n/**\n * Mount the chatbot into a container (vanilla JS, Vue, Svelte).\n * Requires react and react-dom to be available (e.g. via script or bundler).\n */\nexport function createChatbot(\n container: HTMLElement,\n props: {\n /** Layout: \"widget\" (bubble) or \"page\" (full card) */\n layout?: \"widget\" | \"page\";\n /** Chatbot display name */\n chatbotName?: string;\n /** Greeting message shown when chat is empty */\n greetingMessage?: string;\n /** Optional chatbot avatar URL */\n chatbotProfileImage?: string;\n /** Optional user avatar URL */\n userProfileImage?: string;\n /** Background color (hex) */\n backgroundColor?: string;\n /** Font color (hex) */\n fontColor?: string;\n /** Chatbot bubble color (hex) */\n chatbotBubbleColor?: string;\n /** User bubble color (hex) */\n userBubbleColor?: string;\n /** Initial messages (e.g. from API) */\n initialMessages?: {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n timestamp?: string;\n }[];\n /** Callback when user sends a message */\n onSendMessage?: (content: string) => void;\n /** Optional class name for the root container */\n className?: string;\n } = {}\n): { unmount: () => void } {\n const root = createRoot(container);\n root.render(React.createElement(PeppermintChatbot, props));\n return {\n unmount: () => root.unmount(),\n };\n}\n\n"],"mappings":"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","names":["styled","import_react","React"]}