@aigentyc/chat-sdk 0.1.0

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.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/JsonRenderResult-Ftw4AKwb.d.cts +18 -0
  4. package/dist/JsonRenderResult-Ftw4AKwb.d.ts +18 -0
  5. package/dist/JsonRenderResult-GQOYPLVH.cjs +15 -0
  6. package/dist/JsonRenderResult-GQOYPLVH.cjs.map +1 -0
  7. package/dist/JsonRenderResult-ZFJ6VWMS.js +6 -0
  8. package/dist/JsonRenderResult-ZFJ6VWMS.js.map +1 -0
  9. package/dist/SlotsContext-CBtt36al.d.ts +148 -0
  10. package/dist/SlotsContext-CHvISDJT.d.cts +148 -0
  11. package/dist/VisualizationRenderer-FNFYNN66.js +5 -0
  12. package/dist/VisualizationRenderer-FNFYNN66.js.map +1 -0
  13. package/dist/VisualizationRenderer-VKMZXRUX.cjs +20 -0
  14. package/dist/VisualizationRenderer-VKMZXRUX.cjs.map +1 -0
  15. package/dist/ai-elements.cjs +4608 -0
  16. package/dist/ai-elements.cjs.map +1 -0
  17. package/dist/ai-elements.d.cts +897 -0
  18. package/dist/ai-elements.d.ts +897 -0
  19. package/dist/ai-elements.js +4363 -0
  20. package/dist/ai-elements.js.map +1 -0
  21. package/dist/chunk-3MP2EGEJ.cjs +270 -0
  22. package/dist/chunk-3MP2EGEJ.cjs.map +1 -0
  23. package/dist/chunk-3RW7O444.js +26 -0
  24. package/dist/chunk-3RW7O444.js.map +1 -0
  25. package/dist/chunk-42ARGQXE.js +51 -0
  26. package/dist/chunk-42ARGQXE.js.map +1 -0
  27. package/dist/chunk-4FBVV64J.js +257 -0
  28. package/dist/chunk-4FBVV64J.js.map +1 -0
  29. package/dist/chunk-4QT25AXI.js +21 -0
  30. package/dist/chunk-4QT25AXI.js.map +1 -0
  31. package/dist/chunk-525KS5HM.cjs +30 -0
  32. package/dist/chunk-525KS5HM.cjs.map +1 -0
  33. package/dist/chunk-5F3O3ZJH.js +299 -0
  34. package/dist/chunk-5F3O3ZJH.js.map +1 -0
  35. package/dist/chunk-5QSXB6UL.cjs +259 -0
  36. package/dist/chunk-5QSXB6UL.cjs.map +1 -0
  37. package/dist/chunk-5T4FJ2SR.js +664 -0
  38. package/dist/chunk-5T4FJ2SR.js.map +1 -0
  39. package/dist/chunk-7BNYTOTE.cjs +67 -0
  40. package/dist/chunk-7BNYTOTE.cjs.map +1 -0
  41. package/dist/chunk-AWAJOSFP.cjs +96 -0
  42. package/dist/chunk-AWAJOSFP.cjs.map +1 -0
  43. package/dist/chunk-BKDV2H6Z.js +224 -0
  44. package/dist/chunk-BKDV2H6Z.js.map +1 -0
  45. package/dist/chunk-FQN6OBGN.cjs +171 -0
  46. package/dist/chunk-FQN6OBGN.cjs.map +1 -0
  47. package/dist/chunk-FYPJSHCL.js +190 -0
  48. package/dist/chunk-FYPJSHCL.js.map +1 -0
  49. package/dist/chunk-J2H6MLQF.cjs +680 -0
  50. package/dist/chunk-J2H6MLQF.cjs.map +1 -0
  51. package/dist/chunk-J2K7EJYP.cjs +198 -0
  52. package/dist/chunk-J2K7EJYP.cjs.map +1 -0
  53. package/dist/chunk-JI5KCSOI.cjs +23 -0
  54. package/dist/chunk-JI5KCSOI.cjs.map +1 -0
  55. package/dist/chunk-JOO6C3XT.cjs +44 -0
  56. package/dist/chunk-JOO6C3XT.cjs.map +1 -0
  57. package/dist/chunk-KBGPBUTI.cjs +78 -0
  58. package/dist/chunk-KBGPBUTI.cjs.map +1 -0
  59. package/dist/chunk-MT2AMINB.js +75 -0
  60. package/dist/chunk-MT2AMINB.js.map +1 -0
  61. package/dist/chunk-MZQKGNWF.js +4 -0
  62. package/dist/chunk-MZQKGNWF.js.map +1 -0
  63. package/dist/chunk-NG7OTWXQ.cjs +226 -0
  64. package/dist/chunk-NG7OTWXQ.cjs.map +1 -0
  65. package/dist/chunk-NPJKLYLV.js +68 -0
  66. package/dist/chunk-NPJKLYLV.js.map +1 -0
  67. package/dist/chunk-NW2ESHRV.js +685 -0
  68. package/dist/chunk-NW2ESHRV.js.map +1 -0
  69. package/dist/chunk-NWF735F5.js +1631 -0
  70. package/dist/chunk-NWF735F5.js.map +1 -0
  71. package/dist/chunk-NYQSM3EB.cjs +305 -0
  72. package/dist/chunk-NYQSM3EB.cjs.map +1 -0
  73. package/dist/chunk-OU7OROOE.cjs +1643 -0
  74. package/dist/chunk-OU7OROOE.cjs.map +1 -0
  75. package/dist/chunk-PS3U7T37.js +42 -0
  76. package/dist/chunk-PS3U7T37.js.map +1 -0
  77. package/dist/chunk-Q7T3VAJV.cjs +687 -0
  78. package/dist/chunk-Q7T3VAJV.cjs.map +1 -0
  79. package/dist/chunk-QYCEHFAB.js +265 -0
  80. package/dist/chunk-QYCEHFAB.js.map +1 -0
  81. package/dist/chunk-RPDJXB3U.js +676 -0
  82. package/dist/chunk-RPDJXB3U.js.map +1 -0
  83. package/dist/chunk-UKEL7FWS.js +64 -0
  84. package/dist/chunk-UKEL7FWS.js.map +1 -0
  85. package/dist/chunk-VS3NZ7FX.js +164 -0
  86. package/dist/chunk-VS3NZ7FX.js.map +1 -0
  87. package/dist/chunk-WZLWAVSS.cjs +73 -0
  88. package/dist/chunk-WZLWAVSS.cjs.map +1 -0
  89. package/dist/chunk-X5YEOOPK.cjs +758 -0
  90. package/dist/chunk-X5YEOOPK.cjs.map +1 -0
  91. package/dist/chunk-X7R334SB.cjs +5 -0
  92. package/dist/chunk-X7R334SB.cjs.map +1 -0
  93. package/dist/chunk-XXNDL5SJ.cjs +432 -0
  94. package/dist/chunk-XXNDL5SJ.cjs.map +1 -0
  95. package/dist/chunk-YQELMJW5.js +429 -0
  96. package/dist/chunk-YQELMJW5.js.map +1 -0
  97. package/dist/components.cjs +551 -0
  98. package/dist/components.cjs.map +1 -0
  99. package/dist/components.d.cts +181 -0
  100. package/dist/components.d.ts +181 -0
  101. package/dist/components.js +483 -0
  102. package/dist/components.js.map +1 -0
  103. package/dist/core.cjs +283 -0
  104. package/dist/core.cjs.map +1 -0
  105. package/dist/core.d.cts +455 -0
  106. package/dist/core.d.ts +455 -0
  107. package/dist/core.js +241 -0
  108. package/dist/core.js.map +1 -0
  109. package/dist/hooks.cjs +324 -0
  110. package/dist/hooks.cjs.map +1 -0
  111. package/dist/hooks.d.cts +163 -0
  112. package/dist/hooks.d.ts +163 -0
  113. package/dist/hooks.js +277 -0
  114. package/dist/hooks.js.map +1 -0
  115. package/dist/i18n.cjs +26 -0
  116. package/dist/i18n.cjs.map +1 -0
  117. package/dist/i18n.d.cts +50 -0
  118. package/dist/i18n.d.ts +50 -0
  119. package/dist/i18n.js +5 -0
  120. package/dist/i18n.js.map +1 -0
  121. package/dist/index.cjs +466 -0
  122. package/dist/index.cjs.map +1 -0
  123. package/dist/index.d.cts +80 -0
  124. package/dist/index.d.ts +80 -0
  125. package/dist/index.js +438 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/interaction-tracker-D9P1Oq4j.d.cts +83 -0
  128. package/dist/interaction-tracker-D9P1Oq4j.d.ts +83 -0
  129. package/dist/json-render.cjs +23 -0
  130. package/dist/json-render.cjs.map +1 -0
  131. package/dist/json-render.d.cts +857 -0
  132. package/dist/json-render.d.ts +857 -0
  133. package/dist/json-render.js +6 -0
  134. package/dist/json-render.js.map +1 -0
  135. package/dist/live-chat-transport-4XLOIPOE.js +4 -0
  136. package/dist/live-chat-transport-4XLOIPOE.js.map +1 -0
  137. package/dist/live-chat-transport-ALVRGWX7.cjs +13 -0
  138. package/dist/live-chat-transport-ALVRGWX7.cjs.map +1 -0
  139. package/dist/select-B4l9yoyn.d.cts +99 -0
  140. package/dist/select-B4l9yoyn.d.ts +99 -0
  141. package/dist/styles.css +2 -0
  142. package/dist/theme.cjs +18 -0
  143. package/dist/theme.cjs.map +1 -0
  144. package/dist/theme.d.cts +55 -0
  145. package/dist/theme.d.ts +55 -0
  146. package/dist/theme.js +5 -0
  147. package/dist/theme.js.map +1 -0
  148. package/dist/tools.cjs +32 -0
  149. package/dist/tools.cjs.map +1 -0
  150. package/dist/tools.d.cts +117 -0
  151. package/dist/tools.d.ts +117 -0
  152. package/dist/tools.js +11 -0
  153. package/dist/tools.js.map +1 -0
  154. package/dist/types-DKJ_-nbG.d.cts +349 -0
  155. package/dist/types-DKJ_-nbG.d.ts +349 -0
  156. package/dist/ui.cjs +667 -0
  157. package/dist/ui.cjs.map +1 -0
  158. package/dist/ui.d.cts +95 -0
  159. package/dist/ui.d.ts +95 -0
  160. package/dist/ui.js +414 -0
  161. package/dist/ui.js.map +1 -0
  162. package/package.json +255 -0
@@ -0,0 +1,483 @@
1
+ "use client";
2
+ import { ChatInterface } from './chunk-NWF735F5.js';
3
+ export { CartDrawer, ChatFooter, ChatHeader, ChatInput, ChatInterface, FloatingButton, LiveChatPanel, PreviewEmbedPanel, QuickQuestions, WelcomePage } from './chunk-NWF735F5.js';
4
+ import './chunk-5F3O3ZJH.js';
5
+ import './chunk-UKEL7FWS.js';
6
+ import './chunk-VS3NZ7FX.js';
7
+ import './chunk-MZQKGNWF.js';
8
+ import { useI18n } from './chunk-QYCEHFAB.js';
9
+ import './chunk-YQELMJW5.js';
10
+ import './chunk-FYPJSHCL.js';
11
+ import './chunk-PS3U7T37.js';
12
+ import './chunk-42ARGQXE.js';
13
+ import './chunk-4QT25AXI.js';
14
+ import './chunk-NPJKLYLV.js';
15
+ import { cn } from './chunk-3RW7O444.js';
16
+ import * as React from 'react';
17
+ import { useState, useRef, useEffect } from 'react';
18
+ import { X, ImageIcon, Square, MessageCircle, ThumbsUp, ThumbsDown } from 'lucide-react';
19
+ import { jsx, jsxs } from 'react/jsx-runtime';
20
+ import * as SheetPrimitive from '@radix-ui/react-dialog';
21
+ import { cva } from 'class-variance-authority';
22
+ import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
23
+
24
+ function ChatInputWithAttachments({
25
+ value,
26
+ onChange,
27
+ onSubmit,
28
+ isProcessing = false,
29
+ placeholder = "Ask anything or upload an image..."
30
+ }) {
31
+ const [attachments, setAttachments] = useState([]);
32
+ const fileInputRef = useRef(null);
33
+ const handleKeyDown = (e) => {
34
+ if (e.key === "Enter" && (value.trim() || attachments.length > 0) && !isProcessing) {
35
+ e.preventDefault();
36
+ handleSubmit();
37
+ }
38
+ };
39
+ const handleSubmit = () => {
40
+ if (!value.trim() && attachments.length === 0 || isProcessing) return;
41
+ const fileParts = attachments.map(({ id: _id, ...rest }) => rest);
42
+ onSubmit(value, fileParts.length > 0 ? fileParts : void 0);
43
+ setAttachments([]);
44
+ };
45
+ const handleFileSelect = async (e) => {
46
+ const files = e.target.files;
47
+ if (!files) return;
48
+ const newAttachments = [];
49
+ for (const file of Array.from(files)) {
50
+ if (!file.type.startsWith("image/")) continue;
51
+ const dataUrl = await fileToDataUrl(file);
52
+ newAttachments.push({
53
+ id: `${Date.now()}-${Math.random().toString(36).slice(2)}`,
54
+ type: "file",
55
+ url: dataUrl,
56
+ mediaType: file.type,
57
+ filename: file.name
58
+ });
59
+ }
60
+ setAttachments((prev) => [...prev, ...newAttachments]);
61
+ e.target.value = "";
62
+ };
63
+ const removeAttachment = (id) => {
64
+ setAttachments((prev) => prev.filter((a) => a.id !== id));
65
+ };
66
+ const openFileDialog = () => {
67
+ fileInputRef.current?.click();
68
+ };
69
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
70
+ attachments.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2 px-4", children: attachments.map((attachment) => /* @__PURE__ */ jsxs(
71
+ "div",
72
+ {
73
+ className: "relative group rounded-lg overflow-hidden border bg-secondary",
74
+ children: [
75
+ /* @__PURE__ */ jsx(
76
+ "img",
77
+ {
78
+ src: attachment.url,
79
+ alt: attachment.filename || "Attachment",
80
+ className: "h-16 w-16 object-cover"
81
+ }
82
+ ),
83
+ /* @__PURE__ */ jsx(
84
+ "button",
85
+ {
86
+ type: "button",
87
+ onClick: () => removeAttachment(attachment.id),
88
+ className: "absolute top-1 right-1 w-5 h-5 rounded-full bg-black/60 text-white flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity",
89
+ children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
90
+ }
91
+ )
92
+ ]
93
+ },
94
+ attachment.id
95
+ )) }),
96
+ /* @__PURE__ */ jsxs(
97
+ "div",
98
+ {
99
+ className: "flex items-center gap-2 backdrop-blur-xl border shadow-xl rounded-full pl-3 md:pl-4 pr-1.5 md:pr-[6px]",
100
+ style: { backgroundColor: "var(--ac-background)", borderColor: "var(--ac-border)" },
101
+ children: [
102
+ /* @__PURE__ */ jsx(
103
+ "button",
104
+ {
105
+ type: "button",
106
+ onClick: openFileDialog,
107
+ disabled: isProcessing,
108
+ className: "flex items-center justify-center w-9 h-9 rounded-full text-muted-foreground hover:text-foreground hover:bg-secondary transition-colors disabled:opacity-50",
109
+ title: "Upload image",
110
+ children: /* @__PURE__ */ jsx(ImageIcon, { className: "w-5 h-5" })
111
+ }
112
+ ),
113
+ /* @__PURE__ */ jsx(
114
+ "input",
115
+ {
116
+ ref: fileInputRef,
117
+ type: "file",
118
+ accept: "image/*",
119
+ multiple: true,
120
+ onChange: handleFileSelect,
121
+ className: "hidden"
122
+ }
123
+ ),
124
+ /* @__PURE__ */ jsx(
125
+ "input",
126
+ {
127
+ type: "text",
128
+ value,
129
+ onChange: (e) => onChange(e.target.value),
130
+ onKeyDown: handleKeyDown,
131
+ disabled: isProcessing,
132
+ placeholder,
133
+ className: "flex-1 bg-transparent outline-none text-base min-h-[56px] md:min-h-[69px] disabled:opacity-50",
134
+ style: { color: "var(--ac-text)" }
135
+ }
136
+ ),
137
+ /* @__PURE__ */ jsx(
138
+ "button",
139
+ {
140
+ type: "button",
141
+ onClick: handleSubmit,
142
+ disabled: !value.trim() && attachments.length === 0 || isProcessing,
143
+ className: "flex items-center justify-center w-11 h-11 md:w-[55px] md:h-[55px] rounded-full disabled:opacity-50 disabled:cursor-not-allowed transition-colors shrink-0",
144
+ style: { backgroundColor: "var(--ac-primary)", color: "var(--ac-primary-foreground, #fff)" },
145
+ children: isProcessing ? /* @__PURE__ */ jsx(Square, { className: "w-5 h-5 fill-white" }) : /* @__PURE__ */ jsx("svg", { className: "w-6 h-6 md:w-7 md:h-7", viewBox: "0 0 28 28", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx("path", { d: "M2 15C1.44772 15 1 14.5523 1 14C1 13.4477 1.44772 13 2 13V14L2 15ZM26.7071 13.2929C27.0976 13.6834 27.0976 14.3166 26.7071 14.7071L20.3431 21.0711C19.9526 21.4616 19.3195 21.4616 18.9289 21.0711C18.5384 20.6805 18.5384 20.0474 18.9289 19.6569L24.5858 14L18.9289 8.34315C18.5384 7.95262 18.5384 7.31946 18.9289 6.92893C19.3195 6.53841 19.9526 6.53841 20.3431 6.92893L26.7071 13.2929ZM2 14V13L26 13V14V15L2 15L2 14Z", fill: "white" }) })
146
+ }
147
+ )
148
+ ]
149
+ }
150
+ )
151
+ ] });
152
+ }
153
+ async function fileToDataUrl(file) {
154
+ return new Promise((resolve, reject) => {
155
+ const reader = new FileReader();
156
+ reader.onload = () => resolve(reader.result);
157
+ reader.onerror = reject;
158
+ reader.readAsDataURL(file);
159
+ });
160
+ }
161
+ var Sheet = SheetPrimitive.Root;
162
+ var SheetTrigger = SheetPrimitive.Trigger;
163
+ var SheetPortal = SheetPrimitive.Portal;
164
+ var SheetOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
165
+ SheetPrimitive.Overlay,
166
+ {
167
+ className: cn(
168
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
169
+ className
170
+ ),
171
+ ...props,
172
+ ref
173
+ }
174
+ ));
175
+ SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
176
+ var sheetVariants = cva(
177
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
178
+ {
179
+ variants: {
180
+ side: {
181
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
182
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
183
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
184
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
185
+ }
186
+ },
187
+ defaultVariants: {
188
+ side: "right"
189
+ }
190
+ }
191
+ );
192
+ var SheetContent = React.forwardRef(({ side = "right", className, children, overlayVariant: _overlayVariant, ...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [
193
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
194
+ /* @__PURE__ */ jsxs(
195
+ SheetPrimitive.Content,
196
+ {
197
+ ref,
198
+ className: cn(sheetVariants({ side }), className),
199
+ ...props,
200
+ children: [
201
+ /* @__PURE__ */ jsxs(SheetPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
202
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
203
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
204
+ ] }),
205
+ children
206
+ ]
207
+ }
208
+ )
209
+ ] }));
210
+ SheetContent.displayName = SheetPrimitive.Content.displayName;
211
+ var SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
212
+ SheetPrimitive.Title,
213
+ {
214
+ ref,
215
+ className: cn("text-lg font-semibold text-foreground", className),
216
+ ...props
217
+ }
218
+ ));
219
+ SheetTitle.displayName = SheetPrimitive.Title.displayName;
220
+ var SheetDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
221
+ SheetPrimitive.Description,
222
+ {
223
+ ref,
224
+ className: cn("text-sm text-muted-foreground", className),
225
+ ...props
226
+ }
227
+ ));
228
+ SheetDescription.displayName = SheetPrimitive.Description.displayName;
229
+ function ChatDrawer({
230
+ defaultOpen = false,
231
+ open: controlledOpen,
232
+ onOpenChange,
233
+ trigger,
234
+ hideTrigger = false
235
+ }) {
236
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
237
+ const isControlled = controlledOpen !== void 0;
238
+ const isOpen = isControlled ? controlledOpen : internalOpen;
239
+ const handleOpenChange = (open) => {
240
+ if (!isControlled) setInternalOpen(open);
241
+ onOpenChange?.(open);
242
+ };
243
+ useEffect(() => {
244
+ if (typeof document === "undefined") return;
245
+ const handleCloseChat = () => handleOpenChange(false);
246
+ document.addEventListener("aigentyc:close-chat", handleCloseChat);
247
+ return () => document.removeEventListener("aigentyc:close-chat", handleCloseChat);
248
+ }, []);
249
+ return /* @__PURE__ */ jsxs(Sheet, { open: isOpen, onOpenChange: handleOpenChange, children: [
250
+ !hideTrigger && /* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: trigger || /* @__PURE__ */ jsx(
251
+ "button",
252
+ {
253
+ type: "button",
254
+ className: "fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full shadow-lg transition-transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-offset-2",
255
+ style: { backgroundColor: "var(--ac-primary)", color: "var(--ac-primary-foreground, #fff)" },
256
+ "aria-label": "Open chat",
257
+ children: /* @__PURE__ */ jsx(MessageCircle, { className: "h-6 w-6" })
258
+ }
259
+ ) }),
260
+ /* @__PURE__ */ jsxs(
261
+ SheetContent,
262
+ {
263
+ side: "right",
264
+ className: "w-full sm:w-[450px] sm:max-w-[450px] p-0 flex flex-col [&>button]:hidden",
265
+ children: [
266
+ /* @__PURE__ */ jsx(VisuallyHidden.Root, { children: /* @__PURE__ */ jsx(SheetTitle, { children: "Chat Assistant" }) }),
267
+ /* @__PURE__ */ jsx(ChatInterface, {})
268
+ ]
269
+ }
270
+ )
271
+ ] });
272
+ }
273
+ var TRANSLATIONS = {
274
+ operator_joined: "\u05D4\u05E0\u05E6\u05D9\u05D2 \u05D4\u05E6\u05D8\u05E8\u05E3 \u05DC\u05E9\u05D9\u05D7\u05D4",
275
+ chat_ended: "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4",
276
+ handed_to_ai: "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05D4\u05D5\u05E2\u05D1\u05E8\u05D4 \u05D7\u05D6\u05E8\u05D4 \u05DC\u05E2\u05D5\u05D6\u05E8 AI",
277
+ operator_disconnected: "\u05D4\u05E0\u05E6\u05D9\u05D2 \u05D4\u05EA\u05E0\u05EA\u05E7. \u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DE\u05D7\u05D3\u05E9...",
278
+ operator_offline: "\u05D4\u05E0\u05E6\u05D9\u05D2 \u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF \u05DB\u05E8\u05D2\u05E2",
279
+ operator_online: "\u05D4\u05E0\u05E6\u05D9\u05D2 \u05D7\u05D6\u05E8 \u05DC\u05E9\u05D9\u05D7\u05D4",
280
+ reassigned: "\u05D4\u05E9\u05D9\u05D7\u05D4 \u05D4\u05D5\u05E2\u05D1\u05E8\u05D4 \u05DC\u05E0\u05E6\u05D9\u05D2 \u05D0\u05D7\u05E8",
281
+ idle_warning: "\u05D4\u05E0\u05E6\u05D9\u05D2 \u05DC\u05D0 \u05E4\u05E2\u05D9\u05DC \u05DB\u05E8\u05D2\u05E2"
282
+ };
283
+ function translateMessage(message, type) {
284
+ if (type && TRANSLATIONS[type]) {
285
+ const nameMatch = message.match(/^([A-Za-z\u0590-\u05FF\s]+?) (joined|left|ended|disconnected)/);
286
+ if (nameMatch && type === "operator_joined") {
287
+ return `${nameMatch[1]} \u05D4\u05E6\u05D8\u05E8\u05E3/\u05D4 \u05DC\u05E9\u05D9\u05D7\u05D4`;
288
+ }
289
+ return TRANSLATIONS[type];
290
+ }
291
+ return message;
292
+ }
293
+ function SystemMessage({ message, type }) {
294
+ const displayMessage = translateMessage(message, type);
295
+ return /* @__PURE__ */ jsx("div", { className: "flex justify-center my-3", children: /* @__PURE__ */ jsx("span", { className: "text-[11px] text-gray-500 bg-gray-100 px-4 py-1.5 rounded-full border border-gray-200/50", children: displayMessage }) });
296
+ }
297
+ function VisitorIdentityForm({ onSubmit, onCancel }) {
298
+ const [name, setName] = useState("");
299
+ const [email, setEmail] = useState("");
300
+ const { t, direction } = useI18n();
301
+ const isRTL = direction === "rtl";
302
+ return /* @__PURE__ */ jsxs("div", { className: "border-t bg-blue-50/80 px-4 py-4", dir: isRTL ? "rtl" : "ltr", children: [
303
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-blue-800 font-medium mb-3", children: t("liveChatIdentityTitle") }),
304
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
305
+ /* @__PURE__ */ jsx(
306
+ "input",
307
+ {
308
+ type: "text",
309
+ value: name,
310
+ onChange: (e) => setName(e.target.value),
311
+ placeholder: t("liveChatIdentityName"),
312
+ className: "w-full text-sm p-2.5 border rounded-lg bg-white focus:outline-none focus:ring-2 focus:ring-blue-300",
313
+ autoFocus: true
314
+ }
315
+ ),
316
+ /* @__PURE__ */ jsx(
317
+ "input",
318
+ {
319
+ type: "email",
320
+ value: email,
321
+ onChange: (e) => setEmail(e.target.value),
322
+ placeholder: t("liveChatIdentityEmail"),
323
+ className: "w-full text-sm p-2.5 border rounded-lg bg-white focus:outline-none focus:ring-2 focus:ring-blue-300"
324
+ }
325
+ ),
326
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2 justify-end", children: [
327
+ /* @__PURE__ */ jsx(
328
+ "button",
329
+ {
330
+ type: "button",
331
+ onClick: onCancel,
332
+ className: "text-sm text-gray-500 hover:text-gray-700 px-4 py-2 rounded-lg",
333
+ children: t("liveChatCancel")
334
+ }
335
+ ),
336
+ /* @__PURE__ */ jsx(
337
+ "button",
338
+ {
339
+ type: "button",
340
+ onClick: () => onSubmit(name, email),
341
+ disabled: !name.trim() || !email.trim(),
342
+ className: "text-sm text-white px-5 py-2 rounded-lg disabled:opacity-40",
343
+ style: { backgroundColor: "var(--ac-primary, #2f80ed)" },
344
+ children: t("liveChatIdentityConnect")
345
+ }
346
+ )
347
+ ] })
348
+ ] })
349
+ ] });
350
+ }
351
+ function LiveChatHeader({ operatorName, onEndChat }) {
352
+ return /* @__PURE__ */ jsxs("div", { className: "bg-green-50 border-b border-green-200 px-4 py-2 flex items-center justify-between", children: [
353
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
354
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-green-500" }),
355
+ /* @__PURE__ */ jsxs("span", { className: "text-sm text-green-800 font-medium", children: [
356
+ "Chatting with ",
357
+ operatorName
358
+ ] })
359
+ ] }),
360
+ /* @__PURE__ */ jsx(
361
+ "button",
362
+ {
363
+ type: "button",
364
+ onClick: onEndChat,
365
+ className: "text-xs text-red-600 hover:text-red-800 bg-red-50 px-2 py-1 rounded",
366
+ children: "End Chat"
367
+ }
368
+ )
369
+ ] });
370
+ }
371
+ function LiveChatQueueBanner({ position, onCancel }) {
372
+ return /* @__PURE__ */ jsxs("div", { className: "bg-blue-50 border-b border-blue-200 px-4 py-3 flex items-center justify-between", children: [
373
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
374
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-blue-500 animate-pulse" }),
375
+ /* @__PURE__ */ jsxs("span", { className: "text-sm text-blue-800", children: [
376
+ "Connecting you with an operator...",
377
+ position > 0 && /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
378
+ " Position #",
379
+ position
380
+ ] })
381
+ ] })
382
+ ] }),
383
+ /* @__PURE__ */ jsx(
384
+ "button",
385
+ {
386
+ type: "button",
387
+ onClick: onCancel,
388
+ className: "text-xs text-blue-600 hover:text-blue-800 underline",
389
+ children: "Cancel"
390
+ }
391
+ )
392
+ ] });
393
+ }
394
+ function SatisfactionRating({ onSubmit, onSkip }) {
395
+ const [selected, setSelected] = useState(null);
396
+ const [comment, setComment] = useState("");
397
+ const [submitted, setSubmitted] = useState(false);
398
+ if (submitted) {
399
+ return /* @__PURE__ */ jsxs("div", { className: "bg-gray-50 border-t px-4 py-3 text-center", children: [
400
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600", children: "Thank you for your feedback!" }),
401
+ /* @__PURE__ */ jsx(
402
+ "button",
403
+ {
404
+ type: "button",
405
+ onClick: onSkip,
406
+ className: "text-xs text-blue-600 hover:underline mt-1",
407
+ children: "Back to AI Assistant"
408
+ }
409
+ )
410
+ ] });
411
+ }
412
+ return /* @__PURE__ */ jsxs("div", { className: "bg-gray-50 border-t px-4 py-3", children: [
413
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-700 text-center mb-2", children: "How was your experience?" }),
414
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-center gap-4 mb-2", children: [
415
+ /* @__PURE__ */ jsx(
416
+ "button",
417
+ {
418
+ type: "button",
419
+ onClick: () => setSelected("positive"),
420
+ className: `p-2 rounded-full transition-colors ${selected === "positive" ? "bg-green-100 text-green-600" : "hover:bg-gray-200 text-gray-400"}`,
421
+ children: /* @__PURE__ */ jsx(ThumbsUp, { className: "h-5 w-5" })
422
+ }
423
+ ),
424
+ /* @__PURE__ */ jsx(
425
+ "button",
426
+ {
427
+ type: "button",
428
+ onClick: () => setSelected("negative"),
429
+ className: `p-2 rounded-full transition-colors ${selected === "negative" ? "bg-red-100 text-red-600" : "hover:bg-gray-200 text-gray-400"}`,
430
+ children: /* @__PURE__ */ jsx(ThumbsDown, { className: "h-5 w-5" })
431
+ }
432
+ )
433
+ ] }),
434
+ selected && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
435
+ /* @__PURE__ */ jsx(
436
+ "textarea",
437
+ {
438
+ value: comment,
439
+ onChange: (e) => setComment(e.target.value),
440
+ placeholder: "Any additional feedback? (optional)",
441
+ className: "w-full text-xs p-2 border rounded resize-none h-16"
442
+ }
443
+ ),
444
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-center gap-2", children: [
445
+ /* @__PURE__ */ jsx(
446
+ "button",
447
+ {
448
+ type: "button",
449
+ onClick: () => {
450
+ onSubmit(selected, comment || void 0);
451
+ setSubmitted(true);
452
+ },
453
+ className: "text-xs text-white px-3 py-1 rounded",
454
+ style: { backgroundColor: "var(--ac-primary)" },
455
+ children: "Submit"
456
+ }
457
+ ),
458
+ /* @__PURE__ */ jsx(
459
+ "button",
460
+ {
461
+ type: "button",
462
+ onClick: onSkip,
463
+ className: "text-xs text-gray-500 hover:underline px-3 py-1",
464
+ children: "Skip"
465
+ }
466
+ )
467
+ ] })
468
+ ] }),
469
+ !selected && /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(
470
+ "button",
471
+ {
472
+ type: "button",
473
+ onClick: onSkip,
474
+ className: "text-xs text-gray-500 hover:underline",
475
+ children: "Skip"
476
+ }
477
+ ) })
478
+ ] });
479
+ }
480
+
481
+ export { ChatDrawer, ChatInputWithAttachments, LiveChatHeader, LiveChatQueueBanner, SatisfactionRating, SystemMessage, VisitorIdentityForm };
482
+ //# sourceMappingURL=components.js.map
483
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ChatInputWithAttachments.tsx","../src/ui/sheet.tsx","../src/components/ChatDrawer.tsx","../src/components/SystemMessage.tsx","../src/components/VisitorIdentityForm.tsx","../src/components/LiveChatHeader.tsx","../src/components/LiveChatQueueBanner.tsx","../src/components/SatisfactionRating.tsx"],"names":["jsx","jsxs","X","useState"],"mappings":"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","file":"components.js","sourcesContent":["\"use client\";\n\n/**\n * Chat Input with Image Attachments - Enhanced input for kitchen image analysis\n */\n\nimport { useRef, useState } from \"react\";\nimport { ImageIcon, Square, X } from \"lucide-react\";\n// TODO: `FileUIPart` imported from \"ai\" (Vercel AI SDK). Make sure `ai` is installed as peer dependency.\nimport type { FileUIPart } from \"ai\";\n\ninterface Attachment extends FileUIPart {\n\tid: string;\n}\n\ninterface ChatInputWithAttachmentsProps {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tonSubmit: (text: string, attachments?: FileUIPart[]) => void;\n\tisProcessing?: boolean;\n\tplaceholder?: string;\n}\n\nexport function ChatInputWithAttachments({\n\tvalue,\n\tonChange,\n\tonSubmit,\n\tisProcessing = false,\n\tplaceholder = \"Ask anything or upload an image...\",\n}: ChatInputWithAttachmentsProps) {\n\tconst [attachments, setAttachments] = useState<Attachment[]>([]);\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\n\tconst handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\tif (e.key === \"Enter\" && (value.trim() || attachments.length > 0) && !isProcessing) {\n\t\t\te.preventDefault();\n\t\t\thandleSubmit();\n\t\t}\n\t};\n\n\tconst handleSubmit = () => {\n\t\tif ((!value.trim() && attachments.length === 0) || isProcessing) return;\n\t\tconst fileParts: FileUIPart[] = attachments.map(({ id: _id, ...rest }) => rest);\n\t\tonSubmit(value, fileParts.length > 0 ? fileParts : undefined);\n\t\tsetAttachments([]);\n\t};\n\n\tconst handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst files = e.target.files;\n\t\tif (!files) return;\n\n\t\tconst newAttachments: Attachment[] = [];\n\n\t\tfor (const file of Array.from(files)) {\n\t\t\tif (!file.type.startsWith(\"image/\")) continue;\n\t\t\tconst dataUrl = await fileToDataUrl(file);\n\t\t\tnewAttachments.push({\n\t\t\t\tid: `${Date.now()}-${Math.random().toString(36).slice(2)}`,\n\t\t\t\ttype: \"file\",\n\t\t\t\turl: dataUrl,\n\t\t\t\tmediaType: file.type,\n\t\t\t\tfilename: file.name,\n\t\t\t});\n\t\t}\n\n\t\tsetAttachments((prev) => [...prev, ...newAttachments]);\n\t\te.target.value = \"\";\n\t};\n\n\tconst removeAttachment = (id: string) => {\n\t\tsetAttachments((prev) => prev.filter((a) => a.id !== id));\n\t};\n\n\tconst openFileDialog = () => {\n\t\tfileInputRef.current?.click();\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t{attachments.length > 0 && (\n\t\t\t\t<div className=\"flex flex-wrap gap-2 px-4\">\n\t\t\t\t\t{attachments.map((attachment) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={attachment.id}\n\t\t\t\t\t\t\tclassName=\"relative group rounded-lg overflow-hidden border bg-secondary\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={attachment.url}\n\t\t\t\t\t\t\t\talt={attachment.filename || \"Attachment\"}\n\t\t\t\t\t\t\t\tclassName=\"h-16 w-16 object-cover\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => removeAttachment(attachment.id)}\n\t\t\t\t\t\t\t\tclassName=\"absolute top-1 right-1 w-5 h-5 rounded-full bg-black/60 text-white flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tclassName=\"flex items-center gap-2 backdrop-blur-xl border shadow-xl rounded-full pl-3 md:pl-4 pr-1.5 md:pr-[6px]\"\n\t\t\t\tstyle={{ backgroundColor: \"var(--ac-background)\", borderColor: \"var(--ac-border)\" }}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={openFileDialog}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\tclassName=\"flex items-center justify-center w-9 h-9 rounded-full text-muted-foreground hover:text-foreground hover:bg-secondary transition-colors disabled:opacity-50\"\n\t\t\t\t\ttitle=\"Upload image\"\n\t\t\t\t>\n\t\t\t\t\t<ImageIcon className=\"w-5 h-5\" />\n\t\t\t\t</button>\n\n\t\t\t\t<input\n\t\t\t\t\tref={fileInputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\tmultiple\n\t\t\t\t\tonChange={handleFileSelect}\n\t\t\t\t\tclassName=\"hidden\"\n\t\t\t\t/>\n\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => onChange(e.target.value)}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tclassName=\"flex-1 bg-transparent outline-none text-base min-h-[56px] md:min-h-[69px] disabled:opacity-50\"\n\t\t\t\t\tstyle={{ color: \"var(--ac-text)\" }}\n\t\t\t\t/>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\tdisabled={(!value.trim() && attachments.length === 0) || isProcessing}\n\t\t\t\t\tclassName=\"flex items-center justify-center w-11 h-11 md:w-[55px] md:h-[55px] rounded-full disabled:opacity-50 disabled:cursor-not-allowed transition-colors shrink-0\"\n\t\t\t\t\tstyle={{ backgroundColor: \"var(--ac-primary)\", color: \"var(--ac-primary-foreground, #fff)\" }}\n\t\t\t\t>\n\t\t\t\t\t{isProcessing ? (\n\t\t\t\t\t\t<Square className=\"w-5 h-5 fill-white\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg className=\"w-6 h-6 md:w-7 md:h-7\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M2 15C1.44772 15 1 14.5523 1 14C1 13.4477 1.44772 13 2 13V14L2 15ZM26.7071 13.2929C27.0976 13.6834 27.0976 14.3166 26.7071 14.7071L20.3431 21.0711C19.9526 21.4616 19.3195 21.4616 18.9289 21.0711C18.5384 20.6805 18.5384 20.0474 18.9289 19.6569L24.5858 14L18.9289 8.34315C18.5384 7.95262 18.5384 7.31946 18.9289 6.92893C19.3195 6.53841 19.9526 6.53841 20.3431 6.92893L26.7071 13.2929ZM2 14V13L26 13V14V15L2 15L2 14Z\" fill=\"white\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nasync function fileToDataUrl(file: File): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(reader.result as string);\n\t\treader.onerror = reject;\n\t\treader.readAsDataURL(file);\n\t});\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../core/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n overlayVariant?: \"default\" | \"light\";\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, overlayVariant: _overlayVariant, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-start\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { Sheet, SheetContent, SheetTrigger, SheetTitle } from \"../ui/sheet\";\nimport { ChatInterface } from \"./ChatInterface\";\nimport { MessageCircle } from \"lucide-react\";\n// TODO: @radix-ui/react-visually-hidden — keep as peer dep.\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\n\ninterface ChatDrawerProps {\n\tdefaultOpen?: boolean;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\ttrigger?: React.ReactNode;\n\thideTrigger?: boolean;\n}\n\nexport function ChatDrawer({\n\tdefaultOpen = false,\n\topen: controlledOpen,\n\tonOpenChange,\n\ttrigger,\n\thideTrigger = false,\n}: ChatDrawerProps) {\n\tconst [internalOpen, setInternalOpen] = useState(defaultOpen);\n\n\tconst isControlled = controlledOpen !== undefined;\n\tconst isOpen = isControlled ? controlledOpen : internalOpen;\n\n\tconst handleOpenChange = (open: boolean) => {\n\t\tif (!isControlled) setInternalOpen(open);\n\t\tonOpenChange?.(open);\n\t};\n\n\tuseEffect(() => {\n\t\tif (typeof document === \"undefined\") return;\n\t\tconst handleCloseChat = () => handleOpenChange(false);\n\t\tdocument.addEventListener(\"aigentyc:close-chat\", handleCloseChat);\n\t\treturn () => document.removeEventListener(\"aigentyc:close-chat\", handleCloseChat);\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\treturn (\n\t\t<Sheet open={isOpen} onOpenChange={handleOpenChange}>\n\t\t\t{!hideTrigger && (\n\t\t\t\t<SheetTrigger asChild>\n\t\t\t\t\t{trigger || (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full shadow-lg transition-transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-offset-2\"\n\t\t\t\t\t\t\tstyle={{ backgroundColor: \"var(--ac-primary)\", color: \"var(--ac-primary-foreground, #fff)\" }}\n\t\t\t\t\t\t\taria-label=\"Open chat\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MessageCircle className=\"h-6 w-6\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</SheetTrigger>\n\t\t\t)}\n\t\t\t<SheetContent\n\t\t\t\tside=\"right\"\n\t\t\t\tclassName=\"w-full sm:w-[450px] sm:max-w-[450px] p-0 flex flex-col [&>button]:hidden\"\n\t\t\t>\n\t\t\t\t<VisuallyHidden.Root>\n\t\t\t\t\t<SheetTitle>Chat Assistant</SheetTitle>\n\t\t\t\t</VisuallyHidden.Root>\n\t\t\t\t<ChatInterface />\n\t\t\t</SheetContent>\n\t\t</Sheet>\n\t);\n}\n","\"use client\";\n\ninterface SystemMessageProps {\n\tmessage: string;\n\ttype?: string;\n}\n\nconst TRANSLATIONS: Record<string, string> = {\n\toperator_joined: \"הנציג הצטרף לשיחה\",\n\tchat_ended: \"השיחה הסתיימה\",\n\thanded_to_ai: \"השיחה הועברה חזרה לעוזר AI\",\n\toperator_disconnected: \"הנציג התנתק. ממתין לחיבור מחדש...\",\n\toperator_offline: \"הנציג לא זמין כרגע\",\n\toperator_online: \"הנציג חזר לשיחה\",\n\treassigned: \"השיחה הועברה לנציג אחר\",\n\tidle_warning: \"הנציג לא פעיל כרגע\",\n};\n\nfunction translateMessage(message: string, type?: string): string {\n\tif (type && TRANSLATIONS[type]) {\n\t\tconst nameMatch = message.match(/^([A-Za-z\\u0590-\\u05FF\\s]+?) (joined|left|ended|disconnected)/);\n\t\tif (nameMatch && type === \"operator_joined\") {\n\t\t\treturn `${nameMatch[1]} הצטרף/ה לשיחה`;\n\t\t}\n\t\treturn TRANSLATIONS[type];\n\t}\n\treturn message;\n}\n\nexport function SystemMessage({ message, type }: SystemMessageProps) {\n\tconst displayMessage = translateMessage(message, type);\n\n\treturn (\n\t\t<div className=\"flex justify-center my-3\">\n\t\t\t<span className=\"text-[11px] text-gray-500 bg-gray-100 px-4 py-1.5 rounded-full border border-gray-200/50\">\n\t\t\t\t{displayMessage}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useI18n } from \"../hooks/use-i18n\";\n\ninterface VisitorIdentityFormProps {\n\tonSubmit: (name: string, email: string) => void;\n\tonCancel: () => void;\n}\n\nexport function VisitorIdentityForm({ onSubmit, onCancel }: VisitorIdentityFormProps) {\n\tconst [name, setName] = useState(\"\");\n\tconst [email, setEmail] = useState(\"\");\n\tconst { t, direction } = useI18n();\n\tconst isRTL = direction === \"rtl\";\n\n\treturn (\n\t\t<div className=\"border-t bg-blue-50/80 px-4 py-4\" dir={isRTL ? \"rtl\" : \"ltr\"}>\n\t\t\t<p className=\"text-sm text-blue-800 font-medium mb-3\">{t(\"liveChatIdentityTitle\")}</p>\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={name}\n\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\tplaceholder={t(\"liveChatIdentityName\")}\n\t\t\t\t\tclassName=\"w-full text-sm p-2.5 border rounded-lg bg-white focus:outline-none focus:ring-2 focus:ring-blue-300\"\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={email}\n\t\t\t\t\tonChange={(e) => setEmail(e.target.value)}\n\t\t\t\t\tplaceholder={t(\"liveChatIdentityEmail\")}\n\t\t\t\t\tclassName=\"w-full text-sm p-2.5 border rounded-lg bg-white focus:outline-none focus:ring-2 focus:ring-blue-300\"\n\t\t\t\t/>\n\t\t\t\t<div className=\"flex gap-2 justify-end\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onCancel}\n\t\t\t\t\t\tclassName=\"text-sm text-gray-500 hover:text-gray-700 px-4 py-2 rounded-lg\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(\"liveChatCancel\")}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onSubmit(name, email)}\n\t\t\t\t\t\tdisabled={!name.trim() || !email.trim()}\n\t\t\t\t\t\tclassName=\"text-sm text-white px-5 py-2 rounded-lg disabled:opacity-40\"\n\t\t\t\t\t\tstyle={{ backgroundColor: \"var(--ac-primary, #2f80ed)\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(\"liveChatIdentityConnect\")}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\ninterface LiveChatHeaderProps {\n\toperatorName: string;\n\tonEndChat: () => void;\n}\n\nexport function LiveChatHeader({ operatorName, onEndChat }: LiveChatHeaderProps) {\n\treturn (\n\t\t<div className=\"bg-green-50 border-b border-green-200 px-4 py-2 flex items-center justify-between\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-green-500\" />\n\t\t\t\t<span className=\"text-sm text-green-800 font-medium\">Chatting with {operatorName}</span>\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onEndChat}\n\t\t\t\tclassName=\"text-xs text-red-600 hover:text-red-800 bg-red-50 px-2 py-1 rounded\"\n\t\t\t>\n\t\t\t\tEnd Chat\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\ninterface QueueBannerProps {\n\tposition: number;\n\tonCancel: () => void;\n}\n\nexport function LiveChatQueueBanner({ position, onCancel }: QueueBannerProps) {\n\treturn (\n\t\t<div className=\"bg-blue-50 border-b border-blue-200 px-4 py-3 flex items-center justify-between\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<div className=\"h-2 w-2 rounded-full bg-blue-500 animate-pulse\" />\n\t\t\t\t<span className=\"text-sm text-blue-800\">\n\t\t\t\t\tConnecting you with an operator...\n\t\t\t\t\t{position > 0 && <span className=\"font-medium\"> Position #{position}</span>}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onCancel}\n\t\t\t\tclassName=\"text-xs text-blue-600 hover:text-blue-800 underline\"\n\t\t\t>\n\t\t\t\tCancel\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { ThumbsUp, ThumbsDown } from \"lucide-react\";\n\ninterface SatisfactionRatingProps {\n\tonSubmit: (rating: \"positive\" | \"negative\", comment?: string) => void;\n\tonSkip: () => void;\n}\n\nexport function SatisfactionRating({ onSubmit, onSkip }: SatisfactionRatingProps) {\n\tconst [selected, setSelected] = useState<\"positive\" | \"negative\" | null>(null);\n\tconst [comment, setComment] = useState(\"\");\n\tconst [submitted, setSubmitted] = useState(false);\n\n\tif (submitted) {\n\t\treturn (\n\t\t\t<div className=\"bg-gray-50 border-t px-4 py-3 text-center\">\n\t\t\t\t<p className=\"text-sm text-gray-600\">Thank you for your feedback!</p>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onSkip}\n\t\t\t\t\tclassName=\"text-xs text-blue-600 hover:underline mt-1\"\n\t\t\t\t>\n\t\t\t\t\tBack to AI Assistant\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"bg-gray-50 border-t px-4 py-3\">\n\t\t\t<p className=\"text-sm text-gray-700 text-center mb-2\">How was your experience?</p>\n\t\t\t<div className=\"flex justify-center gap-4 mb-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => setSelected(\"positive\")}\n\t\t\t\t\tclassName={`p-2 rounded-full transition-colors ${\n\t\t\t\t\t\tselected === \"positive\" ? \"bg-green-100 text-green-600\" : \"hover:bg-gray-200 text-gray-400\"\n\t\t\t\t\t}`}\n\t\t\t\t>\n\t\t\t\t\t<ThumbsUp className=\"h-5 w-5\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => setSelected(\"negative\")}\n\t\t\t\t\tclassName={`p-2 rounded-full transition-colors ${\n\t\t\t\t\t\tselected === \"negative\" ? \"bg-red-100 text-red-600\" : \"hover:bg-gray-200 text-gray-400\"\n\t\t\t\t\t}`}\n\t\t\t\t>\n\t\t\t\t\t<ThumbsDown className=\"h-5 w-5\" />\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{selected && (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tvalue={comment}\n\t\t\t\t\t\tonChange={(e) => setComment(e.target.value)}\n\t\t\t\t\t\tplaceholder=\"Any additional feedback? (optional)\"\n\t\t\t\t\t\tclassName=\"w-full text-xs p-2 border rounded resize-none h-16\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex justify-center gap-2\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonSubmit(selected, comment || undefined);\n\t\t\t\t\t\t\t\tsetSubmitted(true);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"text-xs text-white px-3 py-1 rounded\"\n\t\t\t\t\t\t\tstyle={{ backgroundColor: \"var(--ac-primary)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSubmit\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onSkip}\n\t\t\t\t\t\t\tclassName=\"text-xs text-gray-500 hover:underline px-3 py-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSkip\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!selected && (\n\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onSkip}\n\t\t\t\t\t\tclassName=\"text-xs text-gray-500 hover:underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\tSkip\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"]}