@agentcrafta/chat-next 0.0.9 → 0.0.11
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/chat.style.css +13 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.js +38 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/chat.style.css
CHANGED
|
@@ -2,30 +2,42 @@
|
|
|
2
2
|
.agentcrafta-chat-container {
|
|
3
3
|
position: fixed;
|
|
4
4
|
z-index: 999;
|
|
5
|
+
display: flex;
|
|
6
|
+
align-items: flex-end;
|
|
7
|
+
gap: 1rem;
|
|
5
8
|
}
|
|
6
9
|
|
|
10
|
+
/* Bottom Right: Chat a la izquierda, botón a la derecha */
|
|
7
11
|
.agentcrafta-chat-container.bottom-right {
|
|
8
12
|
bottom: 2rem;
|
|
9
13
|
right: 2rem;
|
|
14
|
+
flex-direction: row;
|
|
10
15
|
}
|
|
11
16
|
|
|
17
|
+
/* Bottom Left: Botón a la izquierda, chat a la derecha */
|
|
12
18
|
.agentcrafta-chat-container.bottom-left {
|
|
13
19
|
bottom: 2rem;
|
|
14
20
|
left: 2rem;
|
|
21
|
+
flex-direction: row-reverse;
|
|
15
22
|
}
|
|
16
23
|
|
|
24
|
+
/* Top Right: Chat a la izquierda, botón a la derecha */
|
|
17
25
|
.agentcrafta-chat-container.top-right {
|
|
18
26
|
top: 2rem;
|
|
19
27
|
right: 2rem;
|
|
28
|
+
flex-direction: row;
|
|
29
|
+
align-items: flex-start;
|
|
20
30
|
}
|
|
21
31
|
|
|
32
|
+
/* Top Left: Botón a la izquierda, chat a la derecha */
|
|
22
33
|
.agentcrafta-chat-container.top-left {
|
|
23
34
|
top: 2rem;
|
|
24
35
|
left: 2rem;
|
|
36
|
+
flex-direction: row-reverse;
|
|
37
|
+
align-items: flex-start;
|
|
25
38
|
}
|
|
26
39
|
|
|
27
40
|
.agentcrafta-chat-window {
|
|
28
|
-
margin-bottom: 1rem;
|
|
29
41
|
height: 520px;
|
|
30
42
|
width: 450px;
|
|
31
43
|
overflow: hidden;
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ declare global {
|
|
|
6
6
|
WebChat: WebChatLib;
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
type Position = "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
|
10
9
|
type ChatButtonProps = {
|
|
11
10
|
isVisible: boolean;
|
|
12
11
|
toggle: () => void;
|
|
@@ -18,7 +17,7 @@ type ChatProps = {
|
|
|
18
17
|
chatButton?: (props: ChatButtonProps) => React.ReactNode;
|
|
19
18
|
styleOptions?: Partial<StyleOptions>;
|
|
20
19
|
entryPoint: string;
|
|
21
|
-
position?:
|
|
20
|
+
position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
|
22
21
|
};
|
|
23
22
|
/**
|
|
24
23
|
* @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.
|
|
@@ -33,4 +32,11 @@ type ChatProps = {
|
|
|
33
32
|
*/
|
|
34
33
|
declare const Chat: ({ botName, show, logoUrl, chatButton, styleOptions, entryPoint, position, }: ChatProps) => React.ReactPortal | null;
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Convierte una variable CSS (ej: "var(--primary)") a su equivalente en formato hex
|
|
37
|
+
* @param cssVar - String en formato "var(--variable-name)"
|
|
38
|
+
* @returns Color en formato hex (ej: "#0078d4") o el valor original si no se puede convertir
|
|
39
|
+
*/
|
|
40
|
+
declare const getCssVariableAsHex: (cssVar: string) => string;
|
|
41
|
+
|
|
42
|
+
export { Chat, getCssVariableAsHex };
|
package/dist/index.js
CHANGED
|
@@ -244,7 +244,7 @@ var Chat = ({
|
|
|
244
244
|
return () => {
|
|
245
245
|
cleanup();
|
|
246
246
|
};
|
|
247
|
-
}, [portalContainer, show]);
|
|
247
|
+
}, [portalContainer, show, chatKey, initializeChat]);
|
|
248
248
|
if (!show || !portalContainer) return null;
|
|
249
249
|
return createPortal(
|
|
250
250
|
/* @__PURE__ */ jsxs2(
|
|
@@ -388,7 +388,43 @@ var Chat = ({
|
|
|
388
388
|
portalContainer
|
|
389
389
|
);
|
|
390
390
|
};
|
|
391
|
+
|
|
392
|
+
// src/shared/utils/utils.ts
|
|
393
|
+
var getCssVariableAsHex = (cssVar) => {
|
|
394
|
+
if (!cssVar.startsWith("var(--")) {
|
|
395
|
+
return cssVar;
|
|
396
|
+
}
|
|
397
|
+
const variableName = cssVar.slice(4, -1);
|
|
398
|
+
try {
|
|
399
|
+
const cssValue = getComputedStyle(document.documentElement).getPropertyValue(variableName).trim();
|
|
400
|
+
if (!cssValue) {
|
|
401
|
+
console.warn(`Variable CSS ${variableName} no encontrada`);
|
|
402
|
+
return cssVar;
|
|
403
|
+
}
|
|
404
|
+
const hslValue = `hsl(${cssValue})`;
|
|
405
|
+
return hslToHex(hslValue);
|
|
406
|
+
} catch (error) {
|
|
407
|
+
console.error(`Error al convertir variable CSS ${cssVar}:`, error);
|
|
408
|
+
return cssVar;
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
var hslToHex = (hsl) => {
|
|
412
|
+
const tempDiv = document.createElement("div");
|
|
413
|
+
tempDiv.style.color = hsl;
|
|
414
|
+
document.body.appendChild(tempDiv);
|
|
415
|
+
const computedColor = getComputedStyle(tempDiv).color;
|
|
416
|
+
tempDiv.remove();
|
|
417
|
+
const rgbMatch = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/.exec(computedColor);
|
|
418
|
+
if (rgbMatch) {
|
|
419
|
+
const r = rgbMatch[1] ?? "0";
|
|
420
|
+
const g = rgbMatch[2] ?? "0";
|
|
421
|
+
const b = rgbMatch[3] ?? "0";
|
|
422
|
+
return `#${((1 << 24) + (Number.parseInt(r) << 16) + (Number.parseInt(g) << 8) + Number.parseInt(b)).toString(16).slice(1)}`;
|
|
423
|
+
}
|
|
424
|
+
return hsl;
|
|
425
|
+
};
|
|
391
426
|
export {
|
|
392
|
-
Chat
|
|
427
|
+
Chat,
|
|
428
|
+
getCssVariableAsHex
|
|
393
429
|
};
|
|
394
430
|
//# sourceMappingURL=index.js.map
|
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\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/chat.tsx","../src/client/use-chat.ts","../src/client/chat-button-default.tsx","../src/shared/utils/utils.ts"],"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 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?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"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 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, chatKey, initializeChat]);\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","/**\r\n * Convierte una variable CSS (ej: \"var(--primary)\") a su equivalente en formato hex\r\n * @param cssVar - String en formato \"var(--variable-name)\"\r\n * @returns Color en formato hex (ej: \"#0078d4\") o el valor original si no se puede convertir\r\n */\r\nexport const getCssVariableAsHex = (cssVar: string): string => {\r\n // Si no es una variable CSS, devolver el valor original\r\n if (!cssVar.startsWith(\"var(--\")) {\r\n return cssVar;\r\n }\r\n\r\n // Extraer el nombre de la variable (ej: \"--primary\" de \"var(--primary)\")\r\n const variableName = cssVar.slice(4, -1); // Remover \"var(\" y \")\"\r\n\r\n try {\r\n // Obtener el valor de la variable CSS del documento\r\n const cssValue = getComputedStyle(document.documentElement)\r\n .getPropertyValue(variableName)\r\n .trim();\r\n\r\n if (!cssValue) {\r\n console.warn(`Variable CSS ${variableName} no encontrada`);\r\n return cssVar;\r\n }\r\n\r\n // Convertir HSL a hex (las variables están en formato \"204 97% 41%\")\r\n const hslValue = `hsl(${cssValue})`;\r\n return hslToHex(hslValue);\r\n } catch (error) {\r\n console.error(`Error al convertir variable CSS ${cssVar}:`, error);\r\n return cssVar;\r\n }\r\n};\r\n\r\n/**\r\n * Convierte un color HSL a formato hex\r\n * @param hsl - Color en formato \"hsl(h, s%, l%)\"\r\n * @returns Color en formato hex\r\n */\r\nconst hslToHex = (hsl: string): string => {\r\n const tempDiv = document.createElement(\"div\");\r\n tempDiv.style.color = hsl;\r\n document.body.appendChild(tempDiv);\r\n\r\n const computedColor = getComputedStyle(tempDiv).color;\r\n tempDiv.remove();\r\n\r\n // Convertir rgb a hex\r\n const rgbMatch = /rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/.exec(computedColor);\r\n if (rgbMatch) {\r\n const r = rgbMatch[1] ?? \"0\";\r\n const g = rgbMatch[2] ?? \"0\";\r\n const b = rgbMatch[3] ?? \"0\";\r\n return `#${((1 << 24) + (Number.parseInt(r) << 16) + (Number.parseInt(g) << 8) + Number.parseInt(b)).toString(16).slice(1)}`;\r\n }\r\n\r\n return hsl;\r\n};\r\n"],"mappings":";;;;;;;;AAEA,OAAOA,YAAW;AAClB,SAAS,oBAAoB;;;ACD7B,OAAO,WAAW;AAElB;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAQA,IAAM,UAAU,CACrB,mBACA,eACG;AACH,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,KAAK;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,KAAK,IAAI,CAAC;AACvD,QAAM,aAAa,MAAM,OAAuB,IAAI;AACpD,QAAM,qBAAqB,MAAM,OAAgB,IAAI;AACrD,QAAM,mBAAmB,MAAM,OAAsB,IAAI;AACzD,QAAM,mBAAmB,MAAM,OAAO,KAAK;AAE3C,QAAM,qBAAqB,EAAE,GAAG,kBAAkB,GAAG,kBAAkB;AAEvE,QAAM,yBAAyB,CAAC,YAAqB;AACnD,iBAAa,OAAO;AAAA,EACtB;AAOA,QAAM,oBAAoB,YAAY;AACpC,UAAM,eAAe,MAAM,mBAAmB;AAC9C,UAAM,EAAE,aAAa,cAAc,aAAa,IAAI,gBAAgB,CAAC;AAErE,WAAO,WAAW,OAAO,QAAQ;AAAA,MAC/B,gBAAgB,CAAC;AAAA,MACjB,CAAC,EAAE,SAAS,MACV,CAAC,SACD,CAAC,WAA0B;AACzB,YAAI,OAAO,SAAS,aAAa,qBAAqB;AACpD,mBAAS;AAAA,YACP,MAAM,aAAa;AAAA,YACnB,MAAM,EAAE,QAAQ,WAAW;AAAA,YAC3B,SAAS;AAAA,cACP,UAAU,aAAa,qBAAqB;AAAA,gBAC1C,aAAa,EAAE,UAAU,KAAK;AAAA,gBAC9B,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAGA,YACE,OAAO,SAAS,aAAa,qBAC7B,OAAO,SAAS,UAAU,SAAS,SACnC;AACA,gBAAM,eACJ,cAAc,qBAAqB;AACrC,kBAAQ,MAAM,YAAY;AAE1B,uBAAa;AAAA,YACX,WAAW;AAAA,YACX,cAAc;AAAA,YACd,YAAY,OAAO;AAAA,UACrB,CAAC;AAED,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACJ;AAAA,EACF;AAMA,QAAM,sBAAsB,YAAY;AACtC,QAAI,aAAc;AAElB,QAAI;AACF,sBAAgB,IAAI;AACpB,uBAAiB,UAAU;AAC3B,yBAAmB,UAAU;AAC7B,iBAAW,KAAK,IAAI,CAAC;AAAA,IACvB,SAAS,KAAK;AACZ,YAAM,eACJ,eAAe,QAAQ,IAAI,UAAU;AACvC,cAAQ,MAAM,uCAAoC,YAAY;AAC9D,mBAAa;AAAA,QACX,WAAW;AAAA,QACX;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IAEH,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAMA,QAAM,iBAAiB,YAAY;AACjC,QAAI,iBAAiB,QAAS;AAE9B,QAAI;AACF,YAAM,OAAO,MAAM,oBAAoB,UAAU;AACjD,uBAAiB,UAAU,KAAK,gBAAgB;AAEhD,UAAI,CAAC,iBAAiB,SAAS;AAC7B,qBAAa;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,YAAY;AAAA,QACd,CAAC;AACD,gBAAQ,MAAM,yCAAyC;AAEvD;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,qBAAqB,UAAU;AACnD,YAAM,aAAa,WAAW,OAAO,QAAQ,iBAAiB;AAAA,QAC5D,QAAQ,GAAG,iBAAiB,OAAO;AAAA,QACnC;AAAA,MACF,CAAC;AAED,UAAI,WAAW,WAAW,CAAC,iBAAiB,SAAS;AACnD,cAAM,QAAQ,MAAM,kBAAkB;AACtC,2BAAmB,UAAU,WAAW,OAAO,QAAQ;AAAA,UACrD;AAAA,YACE;AAAA,YACA,cAAc;AAAA,YACd;AAAA,UACF;AAAA,UACA,WAAW;AAAA,QACb;AACA,yBAAiB,UAAU;AAAA,MAC7B;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,eACJ,eAAe,QAAQ,IAAI,UAAU;AACvC,cAAQ,MAAM,2CAA2C,GAAG;AAC5D,mBAAa;AAAA,QACX,WAAW;AAAA,QACX;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IAEH;AAAA,EACF;AAKA,QAAM,UAAU,MAAM;AACpB,qBAAiB,UAAU;AAC3B,uBAAmB,UAAU;AAAA,EAE/B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADrLA,OAAmD;;;AES3C,SAUE,KAVF;AARD,IAAM,oBAAoB,CAAC,EAAE,QAAQ,UAAU,MAAuB;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,WAAU;AAAA,MACV,cAAY,YAAY,gBAAgB;AAAA,MAEvC,sBACC;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,UAEf;AAAA,gCAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,YACpC,oBAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,MACtC,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,UAEf,8BAAC,UAAK,GAAE,iEAAgE;AAAA;AAAA,MAC1E;AAAA;AAAA,EAEJ;AAEJ;;;AF0BI,gBAAAC,MAyEM,QAAAC,aAzEN;AA7BG,IAAM,OAAO,CAAC;AAAA,EACnB,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAAiB;AACf,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,QAAQ,cAAc,UAAU;AACpC,QAAM,CAAC,iBAAiB,kBAAkB,IACxCC,OAAM,SAA6B,IAAI;AACzC,QAAM,kBAAkBA,OAAM,OAAO,KAAK;AAE1C,QAAM,SAAS,MAAM,uBAAuB,CAAC,SAAS;AAEtD,QAAM,SAAS,aACb,WAAW,EAAE,WAAW,OAAO,CAAC,IAEhC,gBAAAF,KAAC,qBAAkB,WAAsB,QAAgB;AAG3D,EAAAE,OAAM,UAAU,MAAM;AACpB,QAAI,YAAY,SAAS,eAAe,uBAAuB;AAE/D,QAAI,CAAC,WAAW;AACd,kBAAY,SAAS,cAAc,KAAK;AACxC,gBAAU,KAAK;AACf,eAAS,KAAK,YAAY,SAAS;AAAA,IACrC;AAEA,uBAAmB,SAAS;AAAA,EAC9B,GAAG,CAAC,CAAC;AAEL,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,gBAAiB;AAE/B,UAAM,iBAAiB,SAAS;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,kBAAkB,gBAAgB,SAAS;AAE7C,UAAI,WAAW,OAAO,SAAS;AAC7B,uBAAe;AAAA,MACjB;AACA;AAAA,IACF;AAGA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MACL;AACF,WAAO,QAAQ;AAEf,WAAO,SAAS,MAAM;AACpB,sBAAgB,UAAU;AAC1B,qBAAe;AAAA,IACjB;AAEA,WAAO,UAAU,MAAM;AACrB,cAAQ,MAAM,sCAAsC;AACpD,sBAAgB,UAAU;AAAA,IAC5B;AAEA,aAAS,KAAK,YAAY,MAAM;AAEhC,WAAO,MAAM;AACX,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,iBAAiB,MAAM,SAAS,cAAc,CAAC;AAEnD,MAAI,CAAC,QAAQ,CAAC,gBAAiB,QAAO;AAEtC,SAAO;AAAA,IACL,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,8BAA8B,QAAQ;AAAA,QACjD,MAAK;AAAA,QACL,cAAW;AAAA,QAEX;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,WAAW,2BAA2B,QAAQ,IAAI,YAAY,YAAY,QAAQ;AAAA,cAClF,MAAK;AAAA,cACL,cAAY,QAAQ,OAAO;AAAA,cAE3B;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,OAAO,mBAAmB;AAAA,oBAC5B;AAAA,oBAEA;AAAA,sCAAAA,MAAC,SAAI,WAAU,mCACZ;AAAA,mCACC,gBAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,KAAK;AAAA,4BACL,KAAI;AAAA,4BACJ,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,WAAU;AAAA;AAAA,wBACZ;AAAA,wBAEF,gBAAAA,KAAC,UAAM,mBAAQ;AAAA,yBACjB;AAAA,sBACA,gBAAAC,MAAC,SAAI,WAAU,4BACb;AAAA,wCAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS;AAAA,4BACT,UAAU;AAAA,4BACV,WAAU;AAAA,4BACV,OAAO,EAAE,OAAO,mBAAmB,yBAAyB;AAAA,4BAE3D,yBACC,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,OAAM;AAAA,gCACN,QAAO;AAAA,gCACP,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,QAAO;AAAA,gCACP,aAAY;AAAA,gCACZ,eAAc;AAAA,gCACd,gBAAe;AAAA,gCACf,eAAY;AAAA,gCACZ,WAAU;AAAA,gCAEV,0BAAAA,KAAC,UAAK,GAAE,8BAA6B;AAAA;AAAA,4BACvC,IAEA,gBAAAC;AAAA,8BAAC;AAAA;AAAA,gCACC,OAAM;AAAA,gCACN,QAAO;AAAA,gCACP,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,QAAO;AAAA,gCACP,aAAY;AAAA,gCACZ,eAAc;AAAA,gCACd,gBAAe;AAAA,gCACf,eAAY;AAAA,gCAEZ;AAAA,kDAAAD,KAAC,UAAK,GAAE,qDAAoD;AAAA,kCAC5D,gBAAAA,KAAC,UAAK,GAAE,YAAW;AAAA;AAAA;AAAA,4BACrB;AAAA;AAAA,wBAEJ;AAAA,wBAEA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,MAAM,uBAAuB,KAAK;AAAA,4BAC3C,WAAU;AAAA,4BACV,OAAO,EAAE,OAAO,mBAAmB,yBAAyB;AAAA,4BAE5D,0BAAAC;AAAA,8BAAC;AAAA;AAAA,gCACC,OAAM;AAAA,gCACN,QAAO;AAAA,gCACP,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,QAAO;AAAA,gCACP,aAAY;AAAA,gCACZ,eAAc;AAAA,gCACd,gBAAe;AAAA,gCACf,eAAY;AAAA,gCAEZ;AAAA,kDAAAD,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,kCACpC,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,4BACtC;AAAA;AAAA,wBACF;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,KAAK;AAAA,oBACL,WAAU;AAAA;AAAA,kBAFL;AAAA,gBAGP;AAAA,gBAEC,gBACC,gBAAAA,KAAC,SAAI,WAAU,4BACb,0BAAAC,MAAC,SAAI,WAAU,oCACb;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,aAAY;AAAA,sBAEZ,0BAAAA,KAAC,UAAK,GAAE,8BAA6B;AAAA;AAAA,kBACvC;AAAA,kBACA,gBAAAA,KAAC,UAAK,WAAU,iCAAgC,4CAEhD;AAAA,mBACF,GACF;AAAA;AAAA;AAAA,UAEJ;AAAA,UAEC;AAAA;AAAA;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;;;AGlPO,IAAM,sBAAsB,CAAC,WAA2B;AAE7D,MAAI,CAAC,OAAO,WAAW,QAAQ,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,OAAO,MAAM,GAAG,EAAE;AAEvC,MAAI;AAEF,UAAM,WAAW,iBAAiB,SAAS,eAAe,EACvD,iBAAiB,YAAY,EAC7B,KAAK;AAER,QAAI,CAAC,UAAU;AACb,cAAQ,KAAK,gBAAgB,YAAY,gBAAgB;AACzD,aAAO;AAAA,IACT;AAGA,UAAM,WAAW,OAAO,QAAQ;AAChC,WAAO,SAAS,QAAQ;AAAA,EAC1B,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,MAAM,KAAK,KAAK;AACjE,WAAO;AAAA,EACT;AACF;AAOA,IAAM,WAAW,CAAC,QAAwB;AACxC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,MAAM,QAAQ;AACtB,WAAS,KAAK,YAAY,OAAO;AAEjC,QAAM,gBAAgB,iBAAiB,OAAO,EAAE;AAChD,UAAQ,OAAO;AAGf,QAAM,WAAW,iCAAiC,KAAK,aAAa;AACpE,MAAI,UAAU;AACZ,UAAM,IAAI,SAAS,CAAC,KAAK;AACzB,UAAM,IAAI,SAAS,CAAC,KAAK;AACzB,UAAM,IAAI,SAAS,CAAC,KAAK;AACzB,WAAO,MAAM,KAAK,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC,KAAK,KAAK,OAAO,SAAS,CAAC,GAAG,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,EAC5H;AAEA,SAAO;AACT;","names":["React","jsx","jsxs","React"]}
|