@agentcrafta/chat-next 0.0.5 → 0.0.6

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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import React from 'react';
2
2
  import { WebChatLib, StyleOptions } from '@agentcrafta/core';
3
3
 
4
4
  declare global {
@@ -6,22 +6,31 @@ declare global {
6
6
  WebChat: WebChatLib;
7
7
  }
8
8
  }
9
+ type Position = "bottom-right" | "bottom-left" | "top-right" | "top-left";
10
+ type ChatButtonProps = {
11
+ isVisible: boolean;
12
+ toggle: () => void;
13
+ };
9
14
  type ChatProps = {
10
15
  show?: boolean;
11
16
  botName?: string;
12
17
  logoUrl?: string;
18
+ chatButton?: (props: ChatButtonProps) => React.ReactNode;
13
19
  styleOptions?: Partial<StyleOptions>;
14
20
  entryPoint: string;
21
+ position?: Position;
15
22
  };
16
23
  /**
17
24
  * @description Componente de chat para interactuar con un agente virtual utilizando Bot Framework Web Chat. Permite iniciar y reiniciar conversaciones, y se adapta a la configuración de estilo definida en el hook useChat.
18
25
  * @param botName Nombre del bot a mostrar en el encabezado del chat
19
26
  * @param logoUrl URL del logo a mostrar junto al nombre del bot (opcional)
27
+ * @param chatButton Elemento de botón personalizado para abrir el chat (opcional)
20
28
  * @param show Indica si el chat debe mostrarse o no (por defecto es true)
21
29
  * @param styleOptions: StyleOptions Opciones de estilo personalizadas para el chat (opcional)
22
30
  * @param entryPoint Punto de entrada para la conversación (opcional)
31
+ * @param position Posición del chat en la pantalla (por defecto es "bottom-right")
23
32
  * @returns
24
33
  */
25
- declare const Chat: ({ botName, show, logoUrl, styleOptions, entryPoint, }: ChatProps) => react_jsx_runtime.JSX.Element | null;
34
+ declare const Chat: ({ botName, show, logoUrl, chatButton, styleOptions, entryPoint, position, }: ChatProps) => React.ReactPortal | null;
26
35
 
27
36
  export { Chat };
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import {
7
7
 
8
8
  // src/client/chat.tsx
9
9
  import React2 from "react";
10
+ import { createPortal } from "react-dom";
10
11
 
11
12
  // src/client/use-chat.ts
12
13
  import React from "react";
@@ -138,13 +139,50 @@ var useChat = (styleOptionsProps, entryPoint) => {
138
139
 
139
140
  // src/client/chat.tsx
140
141
  import "@agentcrafta/core";
141
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
142
+
143
+ // src/client/chat-button-default.tsx
144
+ import { jsx } from "react/jsx-runtime";
145
+ var ChatButtonDefault = ({ toggle, isVisible }) => {
146
+ return /* @__PURE__ */ jsx(
147
+ "button",
148
+ {
149
+ onClick: toggle,
150
+ className: `flex h-16 w-16 items-center justify-center rounded-full bg-primary shadow-lg transition-all duration-300 hover:-translate-y-1 hover:shadow-xl ${isVisible ? "pointer-events-none translate-y-2 scale-95 opacity-0" : "scale-100 opacity-100"}`,
151
+ "aria-label": "Open Chat Assistant",
152
+ children: /* @__PURE__ */ jsx(
153
+ "svg",
154
+ {
155
+ className: "h-7 w-7 text-white transition-transform",
156
+ viewBox: "0 0 24 24",
157
+ fill: "none",
158
+ stroke: "currentColor",
159
+ strokeWidth: "2",
160
+ strokeLinecap: "round",
161
+ strokeLinejoin: "round",
162
+ "aria-hidden": "true",
163
+ children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
164
+ }
165
+ )
166
+ }
167
+ );
168
+ };
169
+
170
+ // src/client/chat.tsx
171
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
172
+ var positionClasses = {
173
+ "bottom-right": "bottom-8 right-8",
174
+ "bottom-left": "bottom-8 left-8",
175
+ "top-right": "top-8 right-8",
176
+ "top-left": "top-8 left-8"
177
+ };
142
178
  var Chat = ({
143
179
  botName = "Agent",
144
180
  show = true,
145
181
  logoUrl,
182
+ chatButton,
146
183
  styleOptions,
147
- entryPoint
184
+ entryPoint,
185
+ position = "bottom-right"
148
186
  }) => {
149
187
  const {
150
188
  isVisible,
@@ -158,6 +196,8 @@ var Chat = ({
158
196
  handleChangeVisibility
159
197
  } = useChat(styleOptions, entryPoint);
160
198
  const scriptLoadedRef = React2.useRef(false);
199
+ const toggle = () => handleChangeVisibility(!isVisible);
200
+ const button = chatButton ? chatButton({ isVisible, toggle }) : /* @__PURE__ */ jsx2(ChatButtonDefault, { isVisible, toggle });
161
201
  React2.useEffect(() => {
162
202
  if (!show) return;
163
203
  const existingScript = document.querySelector(
@@ -186,157 +226,143 @@ var Chat = ({
186
226
  };
187
227
  }, [chatKey]);
188
228
  if (!show) return null;
189
- return /* @__PURE__ */ jsxs(Fragment, { children: [
229
+ return createPortal(
190
230
  /* @__PURE__ */ jsxs(
191
231
  "div",
192
232
  {
193
- className: `fixed bottom-8 right-8 z-[999] h-[520px] w-[450px] origin-bottom-right overflow-hidden rounded-2xl bg-white shadow-2xl transition-all duration-300 ease-in-out ${isVisible ? "block scale-100 opacity-100" : "hidden scale-95 opacity-0"}`,
194
- role: "complementary",
195
- "aria-label": `Chat ${botName}`,
233
+ className: `fixed ${positionClasses[position]} z-[999]`,
234
+ "aria-live": "polite",
196
235
  children: [
197
236
  /* @__PURE__ */ jsxs(
198
237
  "div",
199
238
  {
200
- className: "flex h-14 items-center justify-between bg-primary px-5 py-4 text-white",
201
- style: { color: styleOptionsMerged.suggestedActionTextColor },
239
+ className: `mb-4 h-[520px] w-[450px] origin-bottom-right overflow-hidden rounded-2xl bg-white shadow-2xl transition-all duration-300 ease-in-out ${isVisible ? "scale-100 opacity-100" : "pointer-events-none scale-95 opacity-0"}`,
240
+ role: "complementary",
241
+ "aria-label": `Chat ${botName}`,
202
242
  children: [
203
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-base font-medium", children: [
204
- logoUrl && /* @__PURE__ */ jsx(
205
- "img",
206
- {
207
- src: logoUrl,
208
- alt: "Logo",
209
- width: 24,
210
- height: 24,
211
- className: "h-7 w-7 rounded-sm"
212
- }
213
- ),
214
- /* @__PURE__ */ jsx("span", { children: botName })
215
- ] }),
216
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
217
- /* @__PURE__ */ jsx(
218
- "button",
243
+ /* @__PURE__ */ jsxs(
244
+ "div",
245
+ {
246
+ className: "flex h-14 items-center justify-between bg-primary px-5 text-white",
247
+ style: { color: styleOptionsMerged.suggestedActionTextColor },
248
+ children: [
249
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-base font-medium", children: [
250
+ logoUrl && /* @__PURE__ */ jsx2(
251
+ "img",
252
+ {
253
+ src: logoUrl,
254
+ alt: "Logo",
255
+ width: 24,
256
+ height: 24,
257
+ className: "h-7 w-7 rounded-sm"
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsx2("span", { children: botName })
261
+ ] }),
262
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
263
+ /* @__PURE__ */ jsx2(
264
+ "button",
265
+ {
266
+ onClick: restartConversation,
267
+ disabled: isRestarting,
268
+ className: "rounded-lg p-2 transition hover:bg-white/10",
269
+ style: { color: styleOptionsMerged.suggestedActionTextColor },
270
+ children: isRestarting ? /* @__PURE__ */ jsx2(
271
+ "svg",
272
+ {
273
+ width: "20",
274
+ height: "20",
275
+ viewBox: "0 0 24 24",
276
+ fill: "none",
277
+ stroke: "currentColor",
278
+ strokeWidth: "2",
279
+ strokeLinecap: "round",
280
+ strokeLinejoin: "round",
281
+ "aria-hidden": "true",
282
+ className: "animate-spin",
283
+ children: /* @__PURE__ */ jsx2("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
284
+ }
285
+ ) : /* @__PURE__ */ jsxs(
286
+ "svg",
287
+ {
288
+ width: "20",
289
+ height: "20",
290
+ viewBox: "0 0 24 24",
291
+ fill: "none",
292
+ stroke: "currentColor",
293
+ strokeWidth: "2",
294
+ strokeLinecap: "round",
295
+ strokeLinejoin: "round",
296
+ "aria-hidden": "true",
297
+ children: [
298
+ /* @__PURE__ */ jsx2("path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
299
+ /* @__PURE__ */ jsx2("path", { d: "M3 3v5h5" })
300
+ ]
301
+ }
302
+ )
303
+ }
304
+ ),
305
+ /* @__PURE__ */ jsx2(
306
+ "button",
307
+ {
308
+ onClick: () => handleChangeVisibility(false),
309
+ className: "rounded-lg p-2 transition hover:bg-white/10",
310
+ style: { color: styleOptionsMerged.suggestedActionTextColor },
311
+ children: /* @__PURE__ */ jsxs(
312
+ "svg",
313
+ {
314
+ width: "20",
315
+ height: "20",
316
+ viewBox: "0 0 24 24",
317
+ fill: "none",
318
+ stroke: "currentColor",
319
+ strokeWidth: "2",
320
+ strokeLinecap: "round",
321
+ strokeLinejoin: "round",
322
+ "aria-hidden": "true",
323
+ children: [
324
+ /* @__PURE__ */ jsx2("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
325
+ /* @__PURE__ */ jsx2("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
326
+ ]
327
+ }
328
+ )
329
+ }
330
+ )
331
+ ] })
332
+ ]
333
+ }
334
+ ),
335
+ /* @__PURE__ */ jsx2(
336
+ "div",
337
+ {
338
+ ref: webChatRef,
339
+ className: "relative h-[calc(100%-56px)] w-full bg-gray-50"
340
+ },
341
+ chatKey
342
+ ),
343
+ isRestarting && /* @__PURE__ */ jsx2("div", { className: "absolute inset-0 z-10 flex items-center justify-center bg-gray-50/80", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 text-gray-600", children: [
344
+ /* @__PURE__ */ jsx2(
345
+ "svg",
219
346
  {
220
- className: `flex cursor-pointer items-center justify-center rounded-lg border-none bg-transparent p-2 transition-all duration-200 hover:bg-white/10 focus:outline focus:outline-2 focus:outline-offset-2 focus:outline-white/50 ${isRestarting ? "cursor-not-allowed opacity-50" : ""}`,
221
- onClick: restartConversation,
222
- disabled: isRestarting,
223
- "aria-label": isRestarting ? "Restarting Conversation..." : "Restart Conversation",
224
- style: { color: styleOptionsMerged.suggestedActionTextColor },
225
- children: isRestarting ? /* @__PURE__ */ jsx(
226
- "svg",
227
- {
228
- width: "20",
229
- height: "20",
230
- viewBox: "0 0 24 24",
231
- fill: "none",
232
- stroke: "currentColor",
233
- strokeWidth: "2",
234
- strokeLinecap: "round",
235
- strokeLinejoin: "round",
236
- "aria-hidden": "true",
237
- className: "animate-spin",
238
- children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
239
- }
240
- ) : /* @__PURE__ */ jsxs(
241
- "svg",
242
- {
243
- width: "20",
244
- height: "20",
245
- viewBox: "0 0 24 24",
246
- fill: "none",
247
- stroke: "currentColor",
248
- strokeWidth: "2",
249
- strokeLinecap: "round",
250
- strokeLinejoin: "round",
251
- "aria-hidden": "true",
252
- children: [
253
- /* @__PURE__ */ jsx("path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
254
- /* @__PURE__ */ jsx("path", { d: "M3 3v5h5" })
255
- ]
256
- }
257
- )
347
+ className: "h-8 w-8 animate-spin",
348
+ viewBox: "0 0 24 24",
349
+ fill: "none",
350
+ stroke: "currentColor",
351
+ strokeWidth: "2",
352
+ children: /* @__PURE__ */ jsx2("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
258
353
  }
259
354
  ),
260
- /* @__PURE__ */ jsx(
261
- "button",
262
- {
263
- className: "flex cursor-pointer items-center justify-center rounded-lg border-none bg-transparent p-2 transition-all duration-200 hover:bg-white/10 focus:outline focus:outline-2 focus:outline-offset-2 focus:outline-white/50",
264
- onClick: () => handleChangeVisibility(false),
265
- "aria-label": "Close Chat",
266
- style: { color: styleOptionsMerged.suggestedActionTextColor },
267
- children: /* @__PURE__ */ jsxs(
268
- "svg",
269
- {
270
- width: "20",
271
- height: "20",
272
- viewBox: "0 0 24 24",
273
- fill: "none",
274
- stroke: "currentColor",
275
- strokeWidth: "2",
276
- strokeLinecap: "round",
277
- strokeLinejoin: "round",
278
- "aria-hidden": "true",
279
- children: [
280
- /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
281
- /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
282
- ]
283
- }
284
- )
285
- }
286
- )
287
- ] })
355
+ /* @__PURE__ */ jsx2("span", { className: "text-sm font-medium", children: "Reiniciando conversaci\xF3n..." })
356
+ ] }) })
288
357
  ]
289
358
  }
290
359
  ),
291
- /* @__PURE__ */ jsx(
292
- "div",
293
- {
294
- className: "relative h-[calc(100%-56px)] bg-gray-50",
295
- role: "main",
296
- ref: webChatRef,
297
- children: isRestarting && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-10 flex items-center justify-center bg-gray-50/80", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 text-gray-600", children: [
298
- /* @__PURE__ */ jsx(
299
- "svg",
300
- {
301
- className: "h-8 w-8 animate-spin",
302
- viewBox: "0 0 24 24",
303
- fill: "none",
304
- stroke: "currentColor",
305
- strokeWidth: "2",
306
- children: /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
307
- }
308
- ),
309
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: "Reiniciando conversaci\xF3n..." })
310
- ] }) })
311
- },
312
- chatKey
313
- )
360
+ button
314
361
  ]
315
362
  }
316
363
  ),
317
- /* @__PURE__ */ jsx(
318
- "button",
319
- {
320
- className: `focus:outline-3 fixed bottom-24 right-8 z-[998] flex h-16 w-16 cursor-pointer items-center justify-center rounded-full border-none bg-primary shadow-lg transition-all duration-300 ease-in-out hover:-translate-y-1 hover:shadow-xl focus:outline focus:outline-offset-2 focus:outline-indigo-500/50 ${isVisible ? "pointer-events-none translate-y-2 scale-95 opacity-0" : "scale-100 opacity-100"}`,
321
- onClick: () => handleChangeVisibility(true),
322
- "aria-label": "Open Chat Assistant",
323
- children: /* @__PURE__ */ jsx(
324
- "svg",
325
- {
326
- className: "h-7 w-7 text-white transition-transform",
327
- viewBox: "0 0 24 24",
328
- fill: "none",
329
- stroke: "currentColor",
330
- strokeWidth: "2",
331
- strokeLinecap: "round",
332
- strokeLinejoin: "round",
333
- "aria-hidden": "true",
334
- children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })
335
- }
336
- )
337
- }
338
- )
339
- ] });
364
+ document.body
365
+ );
340
366
  };
341
367
  export {
342
368
  Chat
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/chat.tsx","../src/client/use-chat.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport React from \"react\";\r\n\r\nimport { useChat } from \"./use-chat\";\r\nimport { type StyleOptions, type WebChatLib } from \"@agentcrafta/core\";\r\n\r\ndeclare global {\r\n interface Window {\r\n WebChat: WebChatLib;\r\n }\r\n}\r\n\r\ntype ChatProps = {\r\n show?: boolean;\r\n botName?: string;\r\n logoUrl?: string;\r\n styleOptions?: Partial<StyleOptions>;\r\n entryPoint: string;\r\n};\r\n\r\n/**\r\n * @description Componente de chat para interactuar con un agente virtual utilizando Bot Framework Web Chat. Permite iniciar y reiniciar conversaciones, y se adapta a la configuración de estilo definida en el hook useChat.\r\n * @param botName Nombre del bot a mostrar en el encabezado del chat\r\n * @param logoUrl URL del logo a mostrar junto al nombre del bot (opcional)\r\n * @param show Indica si el chat debe mostrarse o no (por defecto es true)\r\n * @param styleOptions: StyleOptions Opciones de estilo personalizadas para el chat (opcional)\r\n * @param entryPoint Punto de entrada para la conversación (opcional)\r\n * @returns\r\n */\r\nexport const Chat = ({\r\n botName = \"Agent\",\r\n show = true,\r\n logoUrl,\r\n styleOptions,\r\n entryPoint,\r\n}: ChatProps) => {\r\n const {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n handleChangeVisibility,\r\n } = useChat(styleOptions, entryPoint);\r\n\r\n const scriptLoadedRef = React.useRef(false);\r\n\r\n React.useEffect(() => {\r\n if (!show) return;\r\n // Verificar si el script ya existe en el DOM\r\n const existingScript = document.querySelector(\r\n 'script[src*=\"botframework-webchat\"]',\r\n );\r\n\r\n if (existingScript || scriptLoadedRef.current) {\r\n // Si WebChat ya está disponible, inicializar\r\n if (globalThis.window.WebChat) {\r\n initializeChat();\r\n }\r\n return;\r\n }\r\n\r\n // Cargar el script solo si no existe\r\n const script = document.createElement(\"script\");\r\n script.src =\r\n \"https://cdn.botframework.com/botframework-webchat/latest/webchat.js\";\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n scriptLoadedRef.current = true;\r\n initializeChat();\r\n };\r\n\r\n script.onerror = () => {\r\n console.error(\"Error al cargar el script de WebChat\");\r\n scriptLoadedRef.current = false;\r\n };\r\n\r\n document.head.appendChild(script);\r\n\r\n return () => {\r\n cleanup();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chatKey]);\r\n\r\n if (!show) return null;\r\n return (\r\n <>\r\n <div\r\n className={`fixed bottom-8 right-8 z-[999] h-[520px] w-[450px] origin-bottom-right overflow-hidden rounded-2xl bg-white shadow-2xl transition-all duration-300 ease-in-out ${\r\n isVisible\r\n ? \"block scale-100 opacity-100\"\r\n : \"hidden scale-95 opacity-0\"\r\n }`}\r\n role=\"complementary\"\r\n aria-label={`Chat ${botName}`}\r\n >\r\n <div\r\n className=\"flex h-14 items-center justify-between bg-primary px-5 py-4 text-white\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <div className=\"flex items-center gap-3 text-base font-medium\">\r\n {logoUrl && (\r\n <img\r\n src={logoUrl}\r\n alt=\"Logo\"\r\n width={24}\r\n height={24}\r\n className=\"h-7 w-7 rounded-sm\"\r\n />\r\n )}\r\n <span>{botName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <button\r\n className={`flex cursor-pointer items-center justify-center rounded-lg border-none bg-transparent p-2 transition-all duration-200 hover:bg-white/10 focus:outline focus:outline-2 focus:outline-offset-2 focus:outline-white/50 ${\r\n isRestarting ? \"cursor-not-allowed opacity-50\" : \"\"\r\n }`}\r\n onClick={restartConversation}\r\n disabled={isRestarting}\r\n aria-label={\r\n isRestarting\r\n ? \"Restarting Conversation...\"\r\n : \"Restart Conversation\"\r\n }\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n {isRestarting ? (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className=\"animate-spin\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\r\n <path d=\"M3 3v5h5\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n <button\r\n className=\"flex cursor-pointer items-center justify-center rounded-lg border-none bg-transparent p-2 transition-all duration-200 hover:bg-white/10 focus:outline focus:outline-2 focus:outline-offset-2 focus:outline-white/50\"\r\n onClick={() => handleChangeVisibility(false)}\r\n aria-label=\"Close Chat\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n key={chatKey}\r\n className=\"relative h-[calc(100%-56px)] bg-gray-50\"\r\n role=\"main\"\r\n ref={webChatRef}\r\n >\r\n {isRestarting && (\r\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-gray-50/80\">\r\n <div className=\"flex flex-col items-center gap-3 text-gray-600\">\r\n <svg\r\n className=\"h-8 w-8 animate-spin\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n <span className=\"text-sm font-medium\">\r\n Reiniciando conversación...\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <button\r\n className={`focus:outline-3 fixed bottom-24 right-8 z-[998] flex h-16 w-16 cursor-pointer items-center justify-center rounded-full border-none bg-primary shadow-lg transition-all duration-300 ease-in-out hover:-translate-y-1 hover:shadow-xl focus:outline focus:outline-offset-2 focus:outline-indigo-500/50 ${isVisible ? \"pointer-events-none translate-y-2 scale-95 opacity-0\" : \"scale-100 opacity-100\"}`}\r\n onClick={() => handleChangeVisibility(true)}\r\n aria-label=\"Open Chat Assistant\"\r\n >\r\n <svg\r\n className=\"h-7 w-7 text-white transition-transform\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\r\n </svg>\r\n </button>\r\n </>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\n\r\nimport {\r\n TypeDispatch,\r\n styleOptionsBase,\r\n type StyleOptions,\r\n type WebChatAction,\r\n type WebChatStore,\r\n} from \"@agentcrafta/core\";\r\nimport {\r\n getChatStoreConfig,\r\n getConversationToken,\r\n getRegionalSettings,\r\n logChatError,\r\n} from \"../server\";\r\n\r\nexport const useChat = (\r\n styleOptionsProps: Partial<StyleOptions> | undefined,\r\n entryPoint: string,\r\n) => {\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n const [isRestarting, setIsRestarting] = React.useState(false);\r\n const [chatKey, setChatKey] = React.useState(Date.now());\r\n const webChatRef = React.useRef<HTMLDivElement>(null);\r\n const webChatInstanceRef = React.useRef<unknown>(null);\r\n const directLineUrlRef = React.useRef<string | null>(null);\r\n const isInitializedRef = React.useRef(false);\r\n\r\n const styleOptionsMerged = { ...styleOptionsBase, ...styleOptionsProps };\r\n\r\n const handleChangeVisibility = (visible: boolean) => {\r\n setIsVisible(visible);\r\n };\r\n\r\n /**\r\n * Crea una tienda personalizada para Web Chat que maneja la conexión y filtra actividades específicas.\r\n *\r\n * @returns action: WebChatAction\r\n */\r\n const createCustomStore = async () => {\r\n const configResult = await getChatStoreConfig();\r\n const { eventConfig, filterConfig, initialState } = configResult ?? {};\r\n\r\n return globalThis.window.WebChat.createStore(\r\n initialState || {},\r\n ({ dispatch }: WebChatStore) =>\r\n (next: (action: WebChatAction) => WebChatAction) =>\r\n (action: WebChatAction) => {\r\n if (action.type === TypeDispatch.CONNECTED_FULFILLED) {\r\n dispatch({\r\n type: TypeDispatch.POST_ACTIVITY,\r\n meta: { method: \"keyboard\" },\r\n payload: {\r\n activity: eventConfig?.startConversation || {\r\n channelData: { postBack: true },\r\n name: \"startConversation\",\r\n type: \"event\",\r\n },\r\n },\r\n });\r\n }\r\n\r\n // Filtrar actividades trace con configuración del servidor\r\n if (\r\n action.type === TypeDispatch.INCOMING_ACTIVITY &&\r\n action.payload?.activity?.type === \"trace\"\r\n ) {\r\n const errorMessage =\r\n filterConfig?.traceErrorMessage || \"Error de conectividad\";\r\n console.error(errorMessage);\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n logChatError({\r\n errorType: \"trace_activity\",\r\n errorMessage: \"Trace activity filtered\",\r\n actionType: action.type,\r\n });\r\n\r\n return action;\r\n }\r\n\r\n return next(action);\r\n },\r\n );\r\n };\r\n\r\n /**\r\n * Reinicia la conversación del chat usando el patrón React key para remount completo.\r\n * @returns\r\n */\r\n const restartConversation = async () => {\r\n if (isRestarting) return;\r\n\r\n try {\r\n setIsRestarting(true);\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n setChatKey(Date.now());\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error al reiniciar conversación:\", errorMessage);\r\n logChatError({\r\n errorType: \"restart_conversation\",\r\n errorMessage,\r\n actionType: \"Error reiniciando conversación\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n } finally {\r\n setIsRestarting(false);\r\n }\r\n };\r\n\r\n /**\r\n * Inicializa el chat embebido obteniendo la URL de DirectLine y el token de conversación.\r\n * @returns\r\n */\r\n const initializeChat = async () => {\r\n if (isInitializedRef.current) return;\r\n\r\n try {\r\n const data = await getRegionalSettings(entryPoint);\r\n directLineUrlRef.current = data.channelUrlsById.directline;\r\n\r\n if (!directLineUrlRef.current) {\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage: \"DirectLine URL not found in regional settings\",\r\n actionType: \"Error inicializando chat\",\r\n });\r\n console.error(\"No se pudo obtener la URL de DirectLine\");\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n return;\r\n }\r\n const token = await getConversationToken(entryPoint);\r\n const directLine = globalThis.window.WebChat.createDirectLine({\r\n domain: `${directLineUrlRef.current}v3/directline`,\r\n token,\r\n });\r\n\r\n if (webChatRef.current && !isInitializedRef.current) {\r\n const store = await createCustomStore();\r\n webChatInstanceRef.current = globalThis.window.WebChat.renderWebChat(\r\n {\r\n directLine,\r\n styleOptions: styleOptionsMerged,\r\n store,\r\n },\r\n webChatRef.current,\r\n );\r\n isInitializedRef.current = true;\r\n }\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error detallado al inicializar el chat:\", err);\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage,\r\n actionType: \"Error inicializando chat\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n }\r\n };\r\n\r\n /**\r\n * Limpia la instancia del chat embebido de forma simple.\r\n */\r\n const cleanup = () => {\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n // No manipular DOM directamente - dejar que React maneje el ciclo de vida\r\n };\r\n\r\n return {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n handleChangeVisibility,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n };\r\n};\r\n"],"mappings":"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","names":["React","React"]}
1
+ {"version":3,"sources":["../src/client/chat.tsx","../src/client/use-chat.ts","../src/client/chat-button-default.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { useChat } from \"./use-chat\";\r\nimport { type StyleOptions, type WebChatLib } from \"@agentcrafta/core\";\r\nimport { ChatButtonDefault } from \"./chat-button-default\";\r\n\r\ndeclare global {\r\n interface Window {\r\n WebChat: WebChatLib;\r\n }\r\n}\r\n\r\ntype Position = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\r\n\r\ntype ChatButtonProps = {\r\n isVisible: boolean;\r\n toggle: () => void;\r\n};\r\n\r\ntype ChatProps = {\r\n show?: boolean;\r\n botName?: string;\r\n logoUrl?: string;\r\n chatButton?: (props: ChatButtonProps) => React.ReactNode;\r\n styleOptions?: Partial<StyleOptions>;\r\n entryPoint: string;\r\n position?: Position;\r\n};\r\n\r\nconst positionClasses: Record<Position, string> = {\r\n \"bottom-right\": \"bottom-8 right-8\",\r\n \"bottom-left\": \"bottom-8 left-8\",\r\n \"top-right\": \"top-8 right-8\",\r\n \"top-left\": \"top-8 left-8\",\r\n};\r\n\r\n/**\r\n * @description Componente de chat para interactuar con un agente virtual utilizando Bot Framework Web Chat. Permite iniciar y reiniciar conversaciones, y se adapta a la configuración de estilo definida en el hook useChat.\r\n * @param botName Nombre del bot a mostrar en el encabezado del chat\r\n * @param logoUrl URL del logo a mostrar junto al nombre del bot (opcional)\r\n * @param chatButton Elemento de botón personalizado para abrir el chat (opcional)\r\n * @param show Indica si el chat debe mostrarse o no (por defecto es true)\r\n * @param styleOptions: StyleOptions Opciones de estilo personalizadas para el chat (opcional)\r\n * @param entryPoint Punto de entrada para la conversación (opcional)\r\n * @param position Posición del chat en la pantalla (por defecto es \"bottom-right\")\r\n * @returns\r\n */\r\nexport const Chat = ({\r\n botName = \"Agent\",\r\n show = true,\r\n logoUrl,\r\n chatButton,\r\n styleOptions,\r\n entryPoint,\r\n position = \"bottom-right\",\r\n}: ChatProps) => {\r\n const {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n handleChangeVisibility,\r\n } = useChat(styleOptions, entryPoint);\r\n\r\n const scriptLoadedRef = React.useRef(false);\r\n\r\n const toggle = () => handleChangeVisibility(!isVisible);\r\n\r\n const button = chatButton ? (\r\n chatButton({ isVisible, toggle })\r\n ) : (\r\n <ChatButtonDefault isVisible={isVisible} toggle={toggle} />\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!show) return;\r\n // Verificar si el script ya existe en el DOM\r\n const existingScript = document.querySelector(\r\n 'script[src*=\"botframework-webchat\"]',\r\n );\r\n\r\n if (existingScript || scriptLoadedRef.current) {\r\n // Si WebChat ya está disponible, inicializar\r\n if (globalThis.window.WebChat) {\r\n initializeChat();\r\n }\r\n return;\r\n }\r\n\r\n // Cargar el script solo si no existe\r\n const script = document.createElement(\"script\");\r\n script.src =\r\n \"https://cdn.botframework.com/botframework-webchat/latest/webchat.js\";\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n scriptLoadedRef.current = true;\r\n initializeChat();\r\n };\r\n\r\n script.onerror = () => {\r\n console.error(\"Error al cargar el script de WebChat\");\r\n scriptLoadedRef.current = false;\r\n };\r\n\r\n document.head.appendChild(script);\r\n\r\n return () => {\r\n cleanup();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chatKey]);\r\n\r\n if (!show) return null;\r\n\r\n return createPortal(\r\n <div\r\n className={`fixed ${positionClasses[position]} z-[999]`}\r\n aria-live=\"polite\"\r\n >\r\n <div\r\n className={`mb-4 h-[520px] w-[450px] origin-bottom-right overflow-hidden rounded-2xl bg-white shadow-2xl transition-all duration-300 ease-in-out ${\r\n isVisible\r\n ? \"scale-100 opacity-100\"\r\n : \"pointer-events-none scale-95 opacity-0\"\r\n }`}\r\n role=\"complementary\"\r\n aria-label={`Chat ${botName}`}\r\n >\r\n <div\r\n className=\"flex h-14 items-center justify-between bg-primary px-5 text-white\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <div className=\"flex items-center gap-3 text-base font-medium\">\r\n {logoUrl && (\r\n <img\r\n src={logoUrl}\r\n alt=\"Logo\"\r\n width={24}\r\n height={24}\r\n className=\"h-7 w-7 rounded-sm\"\r\n />\r\n )}\r\n <span>{botName}</span>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <button\r\n onClick={restartConversation}\r\n disabled={isRestarting}\r\n className=\"rounded-lg p-2 transition hover:bg-white/10\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n {isRestarting ? (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className=\"animate-spin\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n ) : (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"></path>\r\n <path d=\"M3 3v5h5\"></path>\r\n </svg>\r\n )}\r\n </button>\r\n\r\n <button\r\n onClick={() => handleChangeVisibility(false)}\r\n className=\"rounded-lg p-2 transition hover:bg-white/10\"\r\n style={{ color: styleOptionsMerged.suggestedActionTextColor }}\r\n >\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n key={chatKey}\r\n ref={webChatRef}\r\n className=\"relative h-[calc(100%-56px)] w-full bg-gray-50\"\r\n />\r\n\r\n {isRestarting && (\r\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-gray-50/80\">\r\n <div className=\"flex flex-col items-center gap-3 text-gray-600\">\r\n <svg\r\n className=\"h-8 w-8 animate-spin\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n >\r\n <path d=\"M21 12a9 9 0 11-6.219-8.56\" />\r\n </svg>\r\n <span className=\"text-sm font-medium\">\r\n Reiniciando conversación...\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {button}\r\n </div>,\r\n document.body,\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\n\r\nimport {\r\n TypeDispatch,\r\n styleOptionsBase,\r\n type StyleOptions,\r\n type WebChatAction,\r\n type WebChatStore,\r\n} from \"@agentcrafta/core\";\r\nimport {\r\n getChatStoreConfig,\r\n getConversationToken,\r\n getRegionalSettings,\r\n logChatError,\r\n} from \"../server\";\r\n\r\nexport const useChat = (\r\n styleOptionsProps: Partial<StyleOptions> | undefined,\r\n entryPoint: string,\r\n) => {\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n const [isRestarting, setIsRestarting] = React.useState(false);\r\n const [chatKey, setChatKey] = React.useState(Date.now());\r\n const webChatRef = React.useRef<HTMLDivElement>(null);\r\n const webChatInstanceRef = React.useRef<unknown>(null);\r\n const directLineUrlRef = React.useRef<string | null>(null);\r\n const isInitializedRef = React.useRef(false);\r\n\r\n const styleOptionsMerged = { ...styleOptionsBase, ...styleOptionsProps };\r\n\r\n const handleChangeVisibility = (visible: boolean) => {\r\n setIsVisible(visible);\r\n };\r\n\r\n /**\r\n * Crea una tienda personalizada para Web Chat que maneja la conexión y filtra actividades específicas.\r\n *\r\n * @returns action: WebChatAction\r\n */\r\n const createCustomStore = async () => {\r\n const configResult = await getChatStoreConfig();\r\n const { eventConfig, filterConfig, initialState } = configResult ?? {};\r\n\r\n return globalThis.window.WebChat.createStore(\r\n initialState || {},\r\n ({ dispatch }: WebChatStore) =>\r\n (next: (action: WebChatAction) => WebChatAction) =>\r\n (action: WebChatAction) => {\r\n if (action.type === TypeDispatch.CONNECTED_FULFILLED) {\r\n dispatch({\r\n type: TypeDispatch.POST_ACTIVITY,\r\n meta: { method: \"keyboard\" },\r\n payload: {\r\n activity: eventConfig?.startConversation || {\r\n channelData: { postBack: true },\r\n name: \"startConversation\",\r\n type: \"event\",\r\n },\r\n },\r\n });\r\n }\r\n\r\n // Filtrar actividades trace con configuración del servidor\r\n if (\r\n action.type === TypeDispatch.INCOMING_ACTIVITY &&\r\n action.payload?.activity?.type === \"trace\"\r\n ) {\r\n const errorMessage =\r\n filterConfig?.traceErrorMessage || \"Error de conectividad\";\r\n console.error(errorMessage);\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n logChatError({\r\n errorType: \"trace_activity\",\r\n errorMessage: \"Trace activity filtered\",\r\n actionType: action.type,\r\n });\r\n\r\n return action;\r\n }\r\n\r\n return next(action);\r\n },\r\n );\r\n };\r\n\r\n /**\r\n * Reinicia la conversación del chat usando el patrón React key para remount completo.\r\n * @returns\r\n */\r\n const restartConversation = async () => {\r\n if (isRestarting) return;\r\n\r\n try {\r\n setIsRestarting(true);\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n setChatKey(Date.now());\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error al reiniciar conversación:\", errorMessage);\r\n logChatError({\r\n errorType: \"restart_conversation\",\r\n errorMessage,\r\n actionType: \"Error reiniciando conversación\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n } finally {\r\n setIsRestarting(false);\r\n }\r\n };\r\n\r\n /**\r\n * Inicializa el chat embebido obteniendo la URL de DirectLine y el token de conversación.\r\n * @returns\r\n */\r\n const initializeChat = async () => {\r\n if (isInitializedRef.current) return;\r\n\r\n try {\r\n const data = await getRegionalSettings(entryPoint);\r\n directLineUrlRef.current = data.channelUrlsById.directline;\r\n\r\n if (!directLineUrlRef.current) {\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage: \"DirectLine URL not found in regional settings\",\r\n actionType: \"Error inicializando chat\",\r\n });\r\n console.error(\"No se pudo obtener la URL de DirectLine\");\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n return;\r\n }\r\n const token = await getConversationToken(entryPoint);\r\n const directLine = globalThis.window.WebChat.createDirectLine({\r\n domain: `${directLineUrlRef.current}v3/directline`,\r\n token,\r\n });\r\n\r\n if (webChatRef.current && !isInitializedRef.current) {\r\n const store = await createCustomStore();\r\n webChatInstanceRef.current = globalThis.window.WebChat.renderWebChat(\r\n {\r\n directLine,\r\n styleOptions: styleOptionsMerged,\r\n store,\r\n },\r\n webChatRef.current,\r\n );\r\n isInitializedRef.current = true;\r\n }\r\n } catch (err) {\r\n const errorMessage =\r\n err instanceof Error ? err.message : \"Error desconocido\";\r\n console.error(\"Error detallado al inicializar el chat:\", err);\r\n logChatError({\r\n errorType: \"initialize_chat\",\r\n errorMessage,\r\n actionType: \"Error inicializando chat\",\r\n });\r\n // Mostrar mensaje de error al usuario con toast o similar\r\n }\r\n };\r\n\r\n /**\r\n * Limpia la instancia del chat embebido de forma simple.\r\n */\r\n const cleanup = () => {\r\n isInitializedRef.current = false;\r\n webChatInstanceRef.current = null;\r\n // No manipular DOM directamente - dejar que React maneje el ciclo de vida\r\n };\r\n\r\n return {\r\n isVisible,\r\n isRestarting,\r\n chatKey,\r\n webChatRef,\r\n styleOptionsMerged,\r\n handleChangeVisibility,\r\n initializeChat,\r\n restartConversation,\r\n cleanup,\r\n };\r\n};\r\n","\"use client\";\r\ntype ChatButtonProps = {\r\n isVisible: boolean;\r\n toggle: () => void;\r\n};\r\n\r\nexport const ChatButtonDefault = ({ toggle, isVisible }: ChatButtonProps) => {\r\n return (\r\n <button\r\n onClick={toggle}\r\n className={`flex h-16 w-16 items-center justify-center rounded-full bg-primary shadow-lg transition-all duration-300 hover:-translate-y-1 hover:shadow-xl ${\r\n isVisible\r\n ? \"pointer-events-none translate-y-2 scale-95 opacity-0\"\r\n : \"scale-100 opacity-100\"\r\n }`}\r\n aria-label=\"Open Chat Assistant\"\r\n >\r\n <svg\r\n className=\"h-7 w-7 text-white transition-transform\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\r\n </svg>\r\n </button>\r\n );\r\n};\r\n"],"mappings":"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","names":["React","jsx","React"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentcrafta/chat-next",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Customizable chat agent",