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 +242 -79
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +242 -79
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +242 -79
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +242 -79
- package/dist/react/index.mjs.map +1 -1
- package/dist/vanilla/index.js +242 -79
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vanilla/index.mjs +242 -79
- package/dist/vanilla/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
195
|
+
justify-content: flex-end;
|
|
117
196
|
border-radius: 16px;
|
|
197
|
+
border: 1px solid #e0e0e0;
|
|
118
198
|
background: #ffffff;
|
|
119
|
-
margin: 8px 16px
|
|
120
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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)(
|
|
193
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
194
|
-
|
|
195
|
-
"
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
{
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
230
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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"]}
|