@agentcrafta/chat-next 0.0.7 → 0.0.9

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.
@@ -0,0 +1,180 @@
1
+ /* Estilos base para AgentCrafta Chat */
2
+ .agentcrafta-chat-container {
3
+ position: fixed;
4
+ z-index: 999;
5
+ }
6
+
7
+ .agentcrafta-chat-container.bottom-right {
8
+ bottom: 2rem;
9
+ right: 2rem;
10
+ }
11
+
12
+ .agentcrafta-chat-container.bottom-left {
13
+ bottom: 2rem;
14
+ left: 2rem;
15
+ }
16
+
17
+ .agentcrafta-chat-container.top-right {
18
+ top: 2rem;
19
+ right: 2rem;
20
+ }
21
+
22
+ .agentcrafta-chat-container.top-left {
23
+ top: 2rem;
24
+ left: 2rem;
25
+ }
26
+
27
+ .agentcrafta-chat-window {
28
+ margin-bottom: 1rem;
29
+ height: 520px;
30
+ width: 450px;
31
+ overflow: hidden;
32
+ border-radius: 1rem;
33
+ background-color: white;
34
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
35
+ transition: all 0.3s ease-in-out;
36
+ }
37
+
38
+ .agentcrafta-chat-window.bottom-right,
39
+ .agentcrafta-chat-window.bottom-left {
40
+ transform-origin: bottom;
41
+ }
42
+
43
+ .agentcrafta-chat-window.top-right,
44
+ .agentcrafta-chat-window.top-left {
45
+ transform-origin: top;
46
+ }
47
+
48
+ .agentcrafta-chat-window.visible {
49
+ transform: scale(1);
50
+ opacity: 1;
51
+ }
52
+
53
+ .agentcrafta-chat-window.hidden {
54
+ transform: scale(0.95);
55
+ opacity: 0;
56
+ pointer-events: none;
57
+ }
58
+
59
+ .agentcrafta-chat-header {
60
+ display: flex;
61
+ height: 3.5rem;
62
+ align-items: center;
63
+ justify-content: space-between;
64
+ padding: 0 1.25rem;
65
+ background-color: var(--primary-color, #0066cc);
66
+ color: white;
67
+ }
68
+
69
+ .agentcrafta-chat-header-content {
70
+ display: flex;
71
+ align-items: center;
72
+ gap: 0.75rem;
73
+ font-size: 1rem;
74
+ font-weight: 500;
75
+ }
76
+
77
+ .agentcrafta-chat-logo {
78
+ height: 1.75rem;
79
+ width: 1.75rem;
80
+ border-radius: 0.25rem;
81
+ }
82
+
83
+ .agentcrafta-chat-actions {
84
+ display: flex;
85
+ align-items: center;
86
+ gap: 0.75rem;
87
+ }
88
+
89
+ .agentcrafta-chat-button {
90
+ border-radius: 0.5rem;
91
+ padding: 0.5rem;
92
+ transition: background-color 0.2s;
93
+ border: none;
94
+ background: transparent;
95
+ cursor: pointer;
96
+ color: inherit;
97
+ }
98
+
99
+ .agentcrafta-chat-button:hover {
100
+ background-color: rgba(255, 255, 255, 0.1);
101
+ }
102
+
103
+ .agentcrafta-chat-button:disabled {
104
+ cursor: not-allowed;
105
+ opacity: 0.5;
106
+ }
107
+
108
+ .agentcrafta-chat-content {
109
+ position: relative;
110
+ height: calc(100% - 56px);
111
+ width: 100%;
112
+ background-color: #f9fafb;
113
+ }
114
+
115
+ .agentcrafta-chat-loading {
116
+ position: absolute;
117
+ inset: 0;
118
+ z-index: 10;
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ background-color: rgba(249, 250, 251, 0.8);
123
+ }
124
+
125
+ .agentcrafta-chat-loading-content {
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: center;
129
+ gap: 0.75rem;
130
+ color: #4b5563;
131
+ }
132
+
133
+ .agentcrafta-chat-loading-spinner {
134
+ height: 2rem;
135
+ width: 2rem;
136
+ animation: spin 1s linear infinite;
137
+ }
138
+
139
+ @keyframes spin {
140
+ from {
141
+ transform: rotate(0deg);
142
+ }
143
+ to {
144
+ transform: rotate(360deg);
145
+ }
146
+ }
147
+
148
+ .agentcrafta-chat-loading-text {
149
+ font-size: 0.875rem;
150
+ font-weight: 500;
151
+ }
152
+
153
+ /* Estilos para el botón flotante */
154
+ .agentcrafta-chat-fab {
155
+ height: 3.5rem;
156
+ width: 3.5rem;
157
+ border-radius: 9999px;
158
+ background-color: var(--primary-color, #0066cc);
159
+ color: white;
160
+ border: none;
161
+ cursor: pointer;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ box-shadow:
166
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1),
167
+ 0 4px 6px -2px rgba(0, 0, 0, 0.05);
168
+ transition: all 0.2s;
169
+ }
170
+
171
+ .agentcrafta-chat-fab:hover {
172
+ transform: scale(1.1);
173
+ box-shadow:
174
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1),
175
+ 0 10px 10px -5px rgba(0, 0, 0, 0.04);
176
+ }
177
+
178
+ .agentcrafta-chat-fab:active {
179
+ transform: scale(1.05);
180
+ }
package/dist/index.js CHANGED
@@ -141,27 +141,41 @@ var useChat = (styleOptionsProps, entryPoint) => {
141
141
  import "@agentcrafta/core";
142
142
 
143
143
  // src/client/chat-button-default.tsx
144
- import { jsx } from "react/jsx-runtime";
144
+ import { jsx, jsxs } from "react/jsx-runtime";
145
145
  var ChatButtonDefault = ({ toggle, isVisible }) => {
146
146
  return /* @__PURE__ */ jsx(
147
147
  "button",
148
148
  {
149
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
- "aria-expanded": isVisible,
153
- "aria-controls": "agentcrafta-chat-window",
154
- children: /* @__PURE__ */ jsx(
150
+ className: "agentcrafta-chat-fab",
151
+ "aria-label": isVisible ? "Cerrar chat" : "Abrir chat",
152
+ children: isVisible ? /* @__PURE__ */ jsxs(
155
153
  "svg",
156
154
  {
157
- className: "h-7 w-7 text-white transition-transform",
155
+ width: "24",
156
+ height: "24",
157
+ viewBox: "0 0 24 24",
158
+ fill: "none",
159
+ stroke: "currentColor",
160
+ strokeWidth: "2",
161
+ strokeLinecap: "round",
162
+ strokeLinejoin: "round",
163
+ children: [
164
+ /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
165
+ /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
166
+ ]
167
+ }
168
+ ) : /* @__PURE__ */ jsx(
169
+ "svg",
170
+ {
171
+ width: "24",
172
+ height: "24",
158
173
  viewBox: "0 0 24 24",
159
174
  fill: "none",
160
175
  stroke: "currentColor",
161
176
  strokeWidth: "2",
162
177
  strokeLinecap: "round",
163
178
  strokeLinejoin: "round",
164
- "aria-hidden": "true",
165
179
  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" })
166
180
  }
167
181
  )
@@ -170,19 +184,7 @@ var ChatButtonDefault = ({ toggle, isVisible }) => {
170
184
  };
171
185
 
172
186
  // src/client/chat.tsx
173
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
174
- var positionClasses = {
175
- "bottom-right": "bottom-8 right-8",
176
- "bottom-left": "bottom-8 left-8",
177
- "top-right": "top-8 right-8",
178
- "top-left": "top-8 left-8"
179
- };
180
- var originClasses = {
181
- "bottom-right": "origin-bottom-right",
182
- "bottom-left": "origin-bottom-left",
183
- "top-right": "origin-top-right",
184
- "top-left": "origin-top-left"
185
- };
187
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
186
188
  var Chat = ({
187
189
  botName = "Agent",
188
190
  show = true,
@@ -204,7 +206,6 @@ var Chat = ({
204
206
  handleChangeVisibility
205
207
  } = useChat(styleOptions, entryPoint);
206
208
  const [portalContainer, setPortalContainer] = React2.useState(null);
207
- const initializedRef = React2.useRef(false);
208
209
  const scriptLoadedRef = React2.useRef(false);
209
210
  const toggle = () => handleChangeVisibility(!isVisible);
210
211
  const button = chatButton ? chatButton({ isVisible, toggle }) : /* @__PURE__ */ jsx2(ChatButtonDefault, { isVisible, toggle });
@@ -222,10 +223,9 @@ var Chat = ({
222
223
  const existingScript = document.querySelector(
223
224
  'script[src*="botframework-webchat"]'
224
225
  );
225
- if ((existingScript || scriptLoadedRef.current) && !initializedRef.current) {
226
+ if (existingScript || scriptLoadedRef.current) {
226
227
  if (globalThis.window.WebChat) {
227
228
  initializeChat();
228
- initializedRef.current = true;
229
229
  }
230
230
  return;
231
231
  }
@@ -234,10 +234,7 @@ var Chat = ({
234
234
  script.async = true;
235
235
  script.onload = () => {
236
236
  scriptLoadedRef.current = true;
237
- if (!initializedRef.current) {
238
- initializeChat();
239
- initializedRef.current = true;
240
- }
237
+ initializeChat();
241
238
  };
242
239
  script.onerror = () => {
243
240
  console.error("Error al cargar el script de WebChat");
@@ -247,31 +244,33 @@ var Chat = ({
247
244
  return () => {
248
245
  cleanup();
249
246
  };
250
- }, [chatKey, portalContainer, show]);
247
+ }, [portalContainer, show]);
251
248
  if (!show || !portalContainer) return null;
252
249
  return createPortal(
253
- /* @__PURE__ */ jsxs(
250
+ /* @__PURE__ */ jsxs2(
254
251
  "div",
255
252
  {
256
- className: `fixed ${positionClasses[position]} z-[999]`,
253
+ className: `agentcrafta-chat-container ${position}`,
257
254
  role: "dialog",
258
255
  "aria-modal": "false",
259
256
  children: [
260
- /* @__PURE__ */ jsxs(
257
+ /* @__PURE__ */ jsxs2(
261
258
  "div",
262
259
  {
263
260
  id: "agentcrafta-chat-window",
264
- className: `mb-4 h-[520px] w-[450px] ${originClasses[position]} 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"}`,
261
+ className: `agentcrafta-chat-window ${position} ${isVisible ? "visible" : "hidden"}`,
265
262
  role: "complementary",
266
263
  "aria-label": `Chat ${botName}`,
267
264
  children: [
268
- /* @__PURE__ */ jsxs(
265
+ /* @__PURE__ */ jsxs2(
269
266
  "div",
270
267
  {
271
- className: "flex h-14 items-center justify-between bg-primary px-5 text-white",
272
- style: { color: styleOptionsMerged.suggestedActionTextColor },
268
+ className: "agentcrafta-chat-header",
269
+ style: {
270
+ color: styleOptionsMerged.suggestedActionTextColor
271
+ },
273
272
  children: [
274
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-base font-medium", children: [
273
+ /* @__PURE__ */ jsxs2("div", { className: "agentcrafta-chat-header-content", children: [
275
274
  logoUrl && /* @__PURE__ */ jsx2(
276
275
  "img",
277
276
  {
@@ -279,18 +278,18 @@ var Chat = ({
279
278
  alt: "Logo",
280
279
  width: 24,
281
280
  height: 24,
282
- className: "h-7 w-7 rounded-sm"
281
+ className: "agentcrafta-chat-logo"
283
282
  }
284
283
  ),
285
284
  /* @__PURE__ */ jsx2("span", { children: botName })
286
285
  ] }),
287
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
286
+ /* @__PURE__ */ jsxs2("div", { className: "agentcrafta-chat-actions", children: [
288
287
  /* @__PURE__ */ jsx2(
289
288
  "button",
290
289
  {
291
290
  onClick: restartConversation,
292
291
  disabled: isRestarting,
293
- className: "rounded-lg p-2 transition hover:bg-white/10",
292
+ className: "agentcrafta-chat-button",
294
293
  style: { color: styleOptionsMerged.suggestedActionTextColor },
295
294
  children: isRestarting ? /* @__PURE__ */ jsx2(
296
295
  "svg",
@@ -304,10 +303,10 @@ var Chat = ({
304
303
  strokeLinecap: "round",
305
304
  strokeLinejoin: "round",
306
305
  "aria-hidden": "true",
307
- className: "animate-spin",
306
+ className: "agentcrafta-chat-loading-spinner",
308
307
  children: /* @__PURE__ */ jsx2("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
309
308
  }
310
- ) : /* @__PURE__ */ jsxs(
309
+ ) : /* @__PURE__ */ jsxs2(
311
310
  "svg",
312
311
  {
313
312
  width: "20",
@@ -331,9 +330,9 @@ var Chat = ({
331
330
  "button",
332
331
  {
333
332
  onClick: () => handleChangeVisibility(false),
334
- className: "rounded-lg p-2 transition hover:bg-white/10",
333
+ className: "agentcrafta-chat-button",
335
334
  style: { color: styleOptionsMerged.suggestedActionTextColor },
336
- children: /* @__PURE__ */ jsxs(
335
+ children: /* @__PURE__ */ jsxs2(
337
336
  "svg",
338
337
  {
339
338
  width: "20",
@@ -361,15 +360,15 @@ var Chat = ({
361
360
  "div",
362
361
  {
363
362
  ref: webChatRef,
364
- className: "relative h-[calc(100%-56px)] w-full bg-gray-50"
363
+ className: "agentcrafta-chat-content"
365
364
  },
366
365
  chatKey
367
366
  ),
368
- 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: [
367
+ isRestarting && /* @__PURE__ */ jsx2("div", { className: "agentcrafta-chat-loading", children: /* @__PURE__ */ jsxs2("div", { className: "agentcrafta-chat-loading-content", children: [
369
368
  /* @__PURE__ */ jsx2(
370
369
  "svg",
371
370
  {
372
- className: "h-8 w-8 animate-spin",
371
+ className: "agentcrafta-chat-loading-spinner",
373
372
  viewBox: "0 0 24 24",
374
373
  fill: "none",
375
374
  stroke: "currentColor",
@@ -377,7 +376,7 @@ var Chat = ({
377
376
  children: /* @__PURE__ */ jsx2("path", { d: "M21 12a9 9 0 11-6.219-8.56" })
378
377
  }
379
378
  ),
380
- /* @__PURE__ */ jsx2("span", { className: "text-sm font-medium", children: "Reiniciando conversaci\xF3n..." })
379
+ /* @__PURE__ */ jsx2("span", { className: "agentcrafta-chat-loading-text", children: "Reiniciando conversaci\xF3n..." })
381
380
  ] }) })
382
381
  ]
383
382
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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\nconst originClasses: Record<Position, string> = {\r\n \"bottom-right\": \"origin-bottom-right\",\r\n \"bottom-left\": \"origin-bottom-left\",\r\n \"top-right\": \"origin-top-right\",\r\n \"top-left\": \"origin-top-left\",\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 const [portalContainer, setPortalContainer] =\r\n React.useState<HTMLElement | null>(null);\r\n const initializedRef = React.useRef(false);\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 let container = document.getElementById(\"agentcrafta-chat-root\");\r\n\r\n if (!container) {\r\n container = document.createElement(\"div\");\r\n container.id = \"agentcrafta-chat-root\";\r\n document.body.appendChild(container);\r\n }\r\n\r\n setPortalContainer(container);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if (!show || !portalContainer) 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 (\r\n (existingScript || scriptLoadedRef.current) &&\r\n !initializedRef.current\r\n ) {\r\n // Si WebChat ya está disponible, inicializar\r\n if (globalThis.window.WebChat) {\r\n initializeChat();\r\n initializedRef.current = true;\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 if (!initializedRef.current) {\r\n initializeChat();\r\n initializedRef.current = true;\r\n }\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 }, [chatKey, portalContainer, show]);\r\n\r\n if (!show || !portalContainer) return null;\r\n\r\n return createPortal(\r\n <div\r\n className={`fixed ${positionClasses[position]} z-[999]`}\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n >\r\n <div\r\n id=\"agentcrafta-chat-window\"\r\n className={`mb-4 h-[520px] w-[450px] ${originClasses[position]} 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 portalContainer,\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 aria-expanded={isVisible}\r\n aria-controls=\"agentcrafta-chat-window\"\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"]}
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\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 const [portalContainer, setPortalContainer] =\r\n React.useState<HTMLElement | null>(null);\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 let container = document.getElementById(\"agentcrafta-chat-root\");\r\n\r\n if (!container) {\r\n container = document.createElement(\"div\");\r\n container.id = \"agentcrafta-chat-root\";\r\n document.body.appendChild(container);\r\n }\r\n\r\n setPortalContainer(container);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if (!show || !portalContainer) 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 }, [portalContainer, show]);\r\n\r\n if (!show || !portalContainer) return null;\r\n\r\n return createPortal(\r\n <div\r\n className={`agentcrafta-chat-container ${position}`}\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n >\r\n <div\r\n id=\"agentcrafta-chat-window\"\r\n className={`agentcrafta-chat-window ${position} ${isVisible ? \"visible\" : \"hidden\"}`}\r\n role=\"complementary\"\r\n aria-label={`Chat ${botName}`}\r\n >\r\n <div\r\n className=\"agentcrafta-chat-header\"\r\n style={{\r\n color: styleOptionsMerged.suggestedActionTextColor,\r\n }}\r\n >\r\n <div className=\"agentcrafta-chat-header-content\">\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=\"agentcrafta-chat-logo\"\r\n />\r\n )}\r\n <span>{botName}</span>\r\n </div>\r\n <div className=\"agentcrafta-chat-actions\">\r\n <button\r\n onClick={restartConversation}\r\n disabled={isRestarting}\r\n className=\"agentcrafta-chat-button\"\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=\"agentcrafta-chat-loading-spinner\"\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=\"agentcrafta-chat-button\"\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=\"agentcrafta-chat-content\"\r\n />\r\n\r\n {isRestarting && (\r\n <div className=\"agentcrafta-chat-loading\">\r\n <div className=\"agentcrafta-chat-loading-content\">\r\n <svg\r\n className=\"agentcrafta-chat-loading-spinner\"\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=\"agentcrafta-chat-loading-text\">\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 portalContainer,\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=\"agentcrafta-chat-fab\"\r\n aria-label={isVisible ? \"Cerrar chat\" : \"Abrir chat\"}\r\n >\r\n {isVisible ? (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\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 >\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 ) : (\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\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 >\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 )}\r\n </button>\r\n );\r\n};\r\n"],"mappings":"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","names":["React","jsx","jsxs","React"]}
package/package.json CHANGED
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "@agentcrafta/chat-next",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
- "sideEffects": false,
5
+ "style": "dist/chat.style.css",
6
+ "sideEffects": [
7
+ "*.css"
8
+ ],
6
9
  "description": "Customizable chat agent",
7
10
  "author": "Lazaro Blanco",
8
11
  "license": "MIT",
9
12
  "scripts": {
10
- "build": "tsup",
13
+ "build": "tsup && cpy src/client/chat.style.css dist/ --flat",
11
14
  "dev": "tsup --watch",
12
15
  "typecheck": "tsc --noEmit",
13
16
  "test": "vitest",
@@ -24,7 +27,8 @@
24
27
  "./server": {
25
28
  "types": "./dist/server/index.d.ts",
26
29
  "default": "./dist/server/index.js"
27
- }
30
+ },
31
+ "./styles.css": "./dist/chat.style.css"
28
32
  },
29
33
  "peerDependencies": {
30
34
  "next": ">=14",