{"version":3,"sources":["../src/api.ts","../src/form-helpers.ts","../src/sanitize.ts","../src/message-helpers.ts","../src/template.ts","../src/chat-widget.ts","../src/index.ts"],"sourcesContent":["import type { ChatResponse, FormData, FormSubmitResponse } from \"./types\";\n\nconst BASE_URL = \"https://chatbot.trinamix.com:5050\";\nconst TOKEN_STORAGE_KEY = \"text_chat_auth_token\";\nconst TOKEN_EXPIRY_STORAGE_KEY = \"text_chat_auth_token_expires_at\";\nconst TOKEN_TTL_MS = 2 * 60 * 60 * 1000;\nconst TOKEN_EXPIRY_BUFFER_MS = 60 * 1000;\n\nasync function requestToken(): Promise<string> {\n  const response = await fetch(`${BASE_URL}/auth/token`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n    },\n  });\n\n  if (!response.ok) {\n    throw new Error(`Token request failed with status: ${response.status}`);\n  }\n\n  const data = await response.json();\n  const token = data.token || data.access_token || data.jwt;\n\n  if (!token || typeof token !== \"string\") {\n    throw new Error(\"Token response did not include a valid token\");\n  }\n\n  sessionStorage.setItem(TOKEN_STORAGE_KEY, token);\n  sessionStorage.setItem(\n    TOKEN_EXPIRY_STORAGE_KEY,\n    (Date.now() + TOKEN_TTL_MS - TOKEN_EXPIRY_BUFFER_MS).toString()\n  );\n\n  return token;\n}\n\nasync function getAuthToken(forceRefresh = false): Promise<string> {\n  const storedToken = sessionStorage.getItem(TOKEN_STORAGE_KEY);\n  const storedExpiry = Number(sessionStorage.getItem(TOKEN_EXPIRY_STORAGE_KEY) || \"0\");\n\n  if (!forceRefresh && storedToken && storedExpiry > Date.now()) {\n    return storedToken;\n  }\n\n  return requestToken();\n}\n\nasync function fetchWithAuth(\n  endpoint: \"/chat\" | \"/submit-form\",\n  body: unknown\n): Promise<Response> {\n  const sendRequest = async (forceRefresh = false): Promise<Response> => {\n    const token = await getAuthToken(forceRefresh);\n\n    return fetch(`${BASE_URL}${endpoint}`, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        Authorization: `Bearer ${token}`,\n      },\n      body: JSON.stringify(body),\n    });\n  };\n\n  const response = await sendRequest();\n\n  if (response.status === 401) {\n    return sendRequest(true);\n  }\n\n  return response;\n}\n\nexport async function fetchChatResponse(\n  sessionId: string,\n  message: string\n): Promise<ChatResponse> {\n  try {\n    const response = await fetchWithAuth(\"/chat\", {\n      session_id: sessionId,\n      message: message,\n    });\n\n    if (response.status === 429) {\n      return {\n        response: \"Too many requests. Please wait a moment before trying again.\",\n      };\n    }\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const data = await response.json();\n\n    return {\n      response: data.response || data.output || data.message || \"No response received.\",\n      session_id: data.session_id || sessionId,\n      show_form: Boolean(data.show_form),\n      conversation_ended: Boolean(data.conversation_ended),\n    };\n  } catch (error) {\n    console.error(\"Chat API error:\", error);\n    return {\n      response: \"Sorry, something went wrong. Please try again.\",\n      error: error instanceof Error ? error.message : \"Unknown error\",\n    };\n  }\n}\n\nexport async function submitForm(formData: FormData): Promise<FormSubmitResponse> {\n  try {\n    const response = await fetchWithAuth(\"/submit-form\", formData);\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const data = await response.json();\n\n    return {\n      success: true,\n      message: data.message || \"Form submitted successfully!\",\n    };\n  } catch (error) {\n    console.error(\"Form submission error:\", error);\n    return {\n      success: false,\n      error: error instanceof Error ? error.message : \"Unknown error\",\n    };\n  }\n}\n\nexport function generateSessionId(): string {\n  if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n    return crypto.randomUUID();\n  }\n\n  // Fallback UUID v4 generator\n  return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\nexport function getOrCreateSessionId(): string {\n  const storageKey = \"text_chat_session_id\";\n  let sessionId = sessionStorage.getItem(storageKey);\n\n  if (!sessionId) {\n    sessionId = generateSessionId();\n    sessionStorage.setItem(storageKey, sessionId);\n  }\n\n  return sessionId;\n}\n","import type { FormData } from \"./types\";\n\nexport function validateEmail(email: string): boolean {\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(email);\n}\n\nexport function validateForm(form: {\n  name: string;\n  email: string;\n}): { isValid: boolean; errors: { name?: string; email?: string } } {\n  const errors: { name?: string; email?: string } = {};\n\n  if (!form.name.trim()) {\n    errors.name = \"Name is required\";\n  }\n\n  if (!form.email.trim()) {\n    errors.email = \"Email is required\";\n  } else if (!validateEmail(form.email)) {\n    errors.email = \"Please enter a valid email\";\n  }\n\n  return {\n    isValid: Object.keys(errors).length === 0,\n    errors,\n  };\n}\n\nexport function getFormData(shadowRoot: ShadowRoot, sessionId: string): FormData {\n  const nameInput = shadowRoot.getElementById(\"formName\") as HTMLInputElement;\n  const emailInput = shadowRoot.getElementById(\"formEmail\") as HTMLInputElement;\n  const companyInput = shadowRoot.getElementById(\"formCompany\") as HTMLInputElement;\n  const titleInput = shadowRoot.getElementById(\"formTitle\") as HTMLInputElement;\n  const requirementInput = shadowRoot.getElementById(\"formRequirement\") as HTMLTextAreaElement;\n\n  return {\n    session_id: sessionId,\n    name: nameInput?.value.trim() || \"\",\n    email: emailInput?.value.trim() || \"\",\n    company: companyInput?.value.trim() || \"\",\n    title: titleInput?.value.trim() || \"\",\n    requirement: requirementInput?.value.trim() || \"\",\n  };\n}\n\nexport function showFormErrors(\n  shadowRoot: ShadowRoot,\n  errors: { name?: string; email?: string }\n): void {\n  const nameError = shadowRoot.getElementById(\"formNameError\");\n  const emailError = shadowRoot.getElementById(\"formEmailError\");\n  const nameInput = shadowRoot.getElementById(\"formName\") as HTMLInputElement;\n  const emailInput = shadowRoot.getElementById(\"formEmail\") as HTMLInputElement;\n\n  if (nameError) {\n    nameError.textContent = errors.name || \"\";\n    nameInput?.classList.toggle(\"error\", !!errors.name);\n  }\n\n  if (emailError) {\n    emailError.textContent = errors.email || \"\";\n    emailInput?.classList.toggle(\"error\", !!errors.email);\n  }\n}\n\nexport function clearFormErrors(shadowRoot: ShadowRoot): void {\n  const nameError = shadowRoot.getElementById(\"formNameError\");\n  const emailError = shadowRoot.getElementById(\"formEmailError\");\n  const nameInput = shadowRoot.getElementById(\"formName\") as HTMLInputElement;\n  const emailInput = shadowRoot.getElementById(\"formEmail\") as HTMLInputElement;\n\n  if (nameError) nameError.textContent = \"\";\n  if (emailError) emailError.textContent = \"\";\n  nameInput?.classList.remove(\"error\");\n  emailInput?.classList.remove(\"error\");\n}\n","const ALLOWED_TAGS = [\"p\", \"br\", \"strong\", \"a\", \"ul\", \"ol\", \"li\", \"em\", \"b\", \"i\", \"div\"];\nconst ALLOWED_ATTRIBUTES: Record<string, string[]> = {\n  a: [\"href\", \"target\", \"rel\"],\n  div: [\"class\"],\n};\n\nexport function sanitizeURL(url: string): string {\n  const dangerousProtocols = [\"javascript:\", \"data:\", \"vbscript:\", \"file:\", \"about:\"];\n\n  try {\n    const trimmedUrl = url.trim().toLowerCase();\n\n    for (const protocol of dangerousProtocols) {\n      if (trimmedUrl.startsWith(protocol)) {\n        return \"#\";\n      }\n    }\n\n    if (trimmedUrl.startsWith(\"/\") || trimmedUrl.startsWith(\"./\") || trimmedUrl.startsWith(\"../\")) {\n      return url;\n    }\n\n    const parsed = new URL(url);\n    if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n      return \"#\";\n    }\n\n    return url;\n  } catch {\n    if (url.startsWith(\"/\") || url.startsWith(\"./\") || url.startsWith(\"../\")) {\n      return url;\n    }\n    return \"#\";\n  }\n}\n\nexport function sanitizeHTML(html: string): string {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n\n  const sanitizeNode = (node: Node): void => {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as Element;\n      const tagName = element.tagName.toLowerCase();\n\n      if (!ALLOWED_TAGS.includes(tagName)) {\n        const textContent = element.textContent || \"\";\n        const textNode = document.createTextNode(textContent);\n        element.parentNode?.replaceChild(textNode, element);\n        return;\n      }\n\n      const allowedAttrs = ALLOWED_ATTRIBUTES[tagName] || [];\n      const attrsToRemove: string[] = [];\n\n      for (const attr of element.attributes) {\n        if (!allowedAttrs.includes(attr.name)) {\n          attrsToRemove.push(attr.name);\n        } else if (attr.name === \"href\") {\n          element.setAttribute(\"href\", sanitizeURL(attr.value));\n        }\n      }\n\n      for (const attrName of attrsToRemove) {\n        element.removeAttribute(attrName);\n      }\n    }\n\n    const children = Array.from(node.childNodes);\n    for (const child of children) {\n      sanitizeNode(child);\n    }\n  };\n\n  sanitizeNode(template.content);\n  return template.innerHTML;\n}\n\nexport function escapeHTML(str: string): string {\n  const div = document.createElement(\"div\");\n  div.textContent = str;\n  return div.innerHTML;\n}\n","import { sanitizeHTML, sanitizeURL } from \"./sanitize\";\n\nexport function parseMarkdownToHTML(text: string): string {\n     if (!text) return \"\";\n\n     let html = text;\n\n     // Bold: **text** or __text__\n     html = html.replace(/\\*\\*(.*?)\\*\\*/g, \"<strong>$1</strong>\");\n     html = html.replace(/__(.*?)__/g, \"<strong>$1</strong>\");\n\n     // Italic: *text* or _text_\n     html = html.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n     html = html.replace(/_([^_]+)_/g, \"<em>$1</em>\");\n\n     // Links: [text](url)\n     html = html.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_, text, url) => {\n          const sanitizedUrl = sanitizeURL(url);\n          return `<a href=\"${sanitizedUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n     });\n\n     // Unordered lists\n     html = html.replace(/^[\\s]*[-*]\\s+(.+)$/gm, \"<li>$1</li>\");\n     html = html.replace(/(<li>.*<\\/li>\\n?)+/g, \"<ul>$&</ul>\");\n\n     // Ordered lists\n     html = html.replace(/^[\\s]*\\d+\\.\\s+(.+)$/gm, \"<li>$1</li>\");\n\n     // Line breaks\n     html = html.replace(/\\n\\n/g, \"</p><p>\");\n     html = html.replace(/\\n/g, \"<br>\");\n\n     // Wrap in paragraph if not already wrapped\n     if (!html.startsWith(\"<p>\") && !html.startsWith(\"<ul>\") && !html.startsWith(\"<ol>\")) {\n          html = `<p>${html}</p>`;\n     }\n\n     return html;\n}\n\nexport function createMessageElement(content: string, isUser: boolean, userChatColor: string, logoIcon: string): HTMLElement {\n     const messageDiv = document.createElement(\"div\");\n     messageDiv.className = `message ${isUser ? \"user\" : \"bot\"}`;\n\n     //      if (!isUser) {\n     //           const avatarSVG = document.createElement(\"div\");\n     //           avatarSVG.className = \"message-avatar\";\n     //           avatarSVG.innerHTML = `<svg class=\"svg-class-chat\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 15 15\" fill=\"none\" style=\"\n     //     margin-top: 4px;\n     // \">\n     //       <path d=\"M7.49512 13.794C7.49516 14.0659 7.81482 14.212 8.02051 14.0342L11.5801 10.9541L12.9727 9.74906L12.9873 9.73734C13.0683 9.67142 13.1474 9.60265 13.2246 9.53226L13.2432 9.51566C13.6429 9.14412 13.9869 8.71437 14.2617 8.23832C14.7308 7.42771 14.9999 6.4845 15 5.47758C15 5.15809 14.9729 4.84319 14.9209 4.5391C14.8091 3.8841 14.5822 3.26891 14.2617 2.71586C13.3218 1.09196 11.5777 7.71891e-05 9.58203 3.8263e-05L5.41894 3.86269e-05C3.42261 3.88014e-05 1.67818 1.09194 0.73828 2.71586C0.269238 3.52641 0.000111226 4.47073 -7.54858e-07 5.47758C6.32593e-05 6.4845 0.26922 7.42771 0.738281 8.23832C1.67814 9.86306 3.42248 10.9541 5.41895 10.9541L7.17773 10.9541C7.35288 10.9542 7.49478 11.0974 7.49512 11.2725L7.49512 13.794ZM7.85645 10.5948C7.71261 10.7137 7.49512 10.6106 7.49512 10.4239L7.49512 8.5557C7.49468 8.38072 7.35281 8.23836 7.17773 8.23832L5.33105 8.23832C5.2612 8.23768 5.18548 8.23497 5.10547 8.22855C5.02705 8.22215 4.95345 8.21305 4.88574 8.20219L4.88574 8.20121L4.88477 8.20023C3.58851 7.98553 2.59978 6.84905 2.59961 5.47758C2.59991 4.106 3.58862 2.96608 4.88574 2.75102C5.0305 2.72663 5.17932 2.71586 5.33105 2.71586L9.59863 2.71586L9.59863 2.71488L9.59961 2.71488C11.108 2.71518 12.3307 3.95175 12.3311 5.4766C12.331 5.88499 12.2125 6.28427 12.2061 6.3057C12.0341 6.85278 11.7283 7.21632 11.5498 7.39945L11.3145 7.60355L11.3096 7.60746L10.6611 8.16801L7.85645 10.5948Z\" fill=\"white\"></path>\n     //       <rect x=\"8.31921\" y=\"4.54626\" width=\"0.397148\" height=\"2.18431\" rx=\"0.198574\" fill=\"white\"></rect>\n     //       <rect x=\"5.34085\" y=\"4.74485\" width=\"0.397148\" height=\"1.78716\" rx=\"0.198574\" fill=\"white\"></rect>\n     //       <rect x=\"7.32642\" y=\"4.34768\" width=\"0.397148\" height=\"2.58146\" rx=\"0.198574\" fill=\"white\"></rect>\n     //       <rect x=\"10.3048\" y=\"5.14195\" width=\"0.397148\" height=\"1.19144\" rx=\"0.198574\" fill=\"white\"></rect>\n     //       <rect x=\"4.3475\" y=\"5.14195\" width=\"0.397148\" height=\"1.19144\" rx=\"0.198574\" fill=\"white\"></rect>\n     //       <rect x=\"9.31201\" y=\"4.74485\" width=\"0.397148\" height=\"1.78716\" rx=\"0.198574\" fill=\"white\"></rect>\n     //       <rect x=\"6.33365\" y=\"4.54626\" width=\"0.397148\" height=\"2.18431\" rx=\"0.198574\" fill=\"white\"></rect>\n     //     </svg>`;\n     //           messageDiv.appendChild(avatarSVG);\n     //      }\n\n     const contentDiv = document.createElement(\"div\");\n     contentDiv.className = \"message-content\";\n\n     if (isUser) {\n          contentDiv.style.background = userChatColor;\n          contentDiv.textContent = content;\n     } else {\n          const parsedContent = parseMarkdownToHTML(content);\n          contentDiv.innerHTML = sanitizeHTML(parsedContent);\n     }\n\n     messageDiv.appendChild(contentDiv);\n     return messageDiv;\n}\n\nexport function createTypingIndicator(): HTMLElement {\n     const messageDiv = document.createElement(\"div\");\n     messageDiv.className = \"message bot\";\n     messageDiv.id = \"typingIndicator\";\n\n     const contentDiv = document.createElement(\"div\");\n     contentDiv.className = \"message-content\";\n\n     const typingDiv = document.createElement(\"div\");\n     typingDiv.className = \"typing-indicator\";\n     typingDiv.innerHTML = `\n    <div class=\"typing-dot\"></div>\n    <div class=\"typing-dot\"></div>\n    <div class=\"typing-dot\"></div>\n  `;\n\n     contentDiv.appendChild(typingDiv);\n     messageDiv.appendChild(contentDiv);\n\n     return messageDiv;\n}\n\nexport function removeTypingIndicator(container: HTMLElement): void {\n     const indicator = container.querySelector(\"#typingIndicator\");\n     if (indicator) {\n          indicator.remove();\n     }\n}\n\nexport function scrollToBottom(container: HTMLElement): void {\n     // Use requestAnimationFrame for smoother scrolling\n     requestAnimationFrame(() => {\n          // Small delay to ensure DOM is updated\n          setTimeout(() => {\n               container.scrollTo({\n                    top: container.scrollHeight,\n                    behavior: \"smooth\",\n               });\n          }, 50);\n     });\n}\n","import chatIcon from \"./assets/chat.png\";\n\nexport function getTemplate(config: {\n     bannerColor: string;\r\n     bannerText: string;\r\n     bannerTextColor: string;\r\n     bannerTextParagraph: string;\r\n     bannerTextParagraphColor: string;\r\n     closeButtonColor: string;\r\n     logoIcon: string;\r\n     sendColor: string;\r\n     floatingBtnColor: string;\r\n     userChatColor: string;\r\n}): string {\r\n     return `\r\n    <link href=\"https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n    <style>\r\n      @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;500;600;700&display=swap');\r\n\r\n      * {\r\n        margin: 0;\r\n        padding: 0;\r\n        box-sizing: border-box;\r\n      }\r\n\r\n      :host {\r\n        font-family: 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n      }\r\n\r\n      .chat-widget-container {\r\n        position: fixed;\r\n        bottom: 6em;\r\n        right: 2em;\r\n        z-index: 9998;\r\n        display: none;\r\n        flex-direction: column;\r\n        width: 430px;\r\n        max-width: calc(100vw - 2rem);\r\n        max-height: min(600px, calc(100vh - 8em));\r\n        background: #fff;\r\n        border-radius: 1.5rem;\r\n        box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\r\n        overflow: hidden;\r\n        animation: slideUp 0.4s ease-out;\r\n        font-family: 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n      }\r\n\r\n      .chat-widget-container.open {\r\n        display: flex;\r\n        height: 35rem;\r\n      }\r\n\r\n      .chat-widget-container.closing {\r\n        animation: slideDown 0.3s ease-in forwards;\r\n      }\r\n\r\n      /* Header */\r\n      .chat-header {\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: space-between;\r\n        padding: 0.75rem 1rem;\r\n        background: ${config.bannerColor};\r\n        color: ${config.bannerTextColor};\r\n        flex-shrink: 0;\r\n      }\r\n\r\n      .chat-header-left {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 0.75rem;\r\n      }\r\n\r\n      .chat-logo {\r\n        width: 70px;\r\n        height: 50px;\r\n        border-radius: 8px;\r\n        object-fit: contain;\r\n      }\r\n\r\n      .chat-header-info h3 {\r\n        font-size: 1.1rem;\r\n        font-weight: 600;\r\n        margin-bottom: 0.1rem;\r\n        letter-spacing: -0.01em;\r\n      }\r\n\r\n      .chat-status {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 0.35rem;\r\n        font-size: 0.7rem;\r\n        color: ${config.bannerTextParagraphColor};\r\n        font-weight: 500;\r\n      }\r\n\r\n      .status-dot {\r\n        width: 6px;\r\n        height: 6px;\r\n        background: #4ade80;\r\n        border-radius: 50%;\r\n        animation: pulse 1.5s infinite;\r\n      }\r\n\r\n      .close-btn {\r\n        background: transparent;\r\n        border: none;\r\n        color: ${config.closeButtonColor};\r\n        cursor: pointer;\r\n        padding: 0.25rem;\r\n        border-radius: 50%;\r\n        transition: opacity 0.2s;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n      }\r\n\r\n      .close-btn:hover {\r\n        opacity: 0.8;\r\n      }\r\n\r\n      /* Messages Area */\r\n      .chat-messages {\r\n        flex: 1;\r\n        overflow-y: auto;\r\n        padding: 1.25rem;\r\n        background: #fff;\r\n        min-height: 250px;\r\n        max-height: 405px;\r\n        scroll-behavior: smooth;\r\n      }\r\n\r\n      .message {\r\n        display: flex;\r\n        margin-bottom: 1rem;\r\n        gap: 0.75rem;\r\n        animation: messageSlideIn 0.3s ease-out;\r\n        align-items: center;\r\n      }\r\n\r\n      .message.user {\r\n        flex-direction: row-reverse;\r\n        animation: messageSlideInRight 0.3s ease-out;\r\n      }\r\n\r\n      .message-content {\r\n        max-width: 80%;\r\n        padding: 1.2rem 1.9rem;\r\n        border-radius: 1rem;\r\n        font-size: 0.875rem;\r\n        line-height: 1.4;\r\n        word-wrap: break-word;\r\n        overflow-wrap: break-word;\r\n      }\r\n\r\n      .message.bot .message-content {\r\n        background: #ececec;\r\n        border-radius: 1rem;\r\n        color: #0f172a;\r\n      }\r\n\r\n      .message.user .message-content {\r\n        background: ${config.userChatColor};\r\n        border-radius: 1rem;\r\n        color: #000;\r\n      }\r\n\r\n      /* Typing Indicator */\r\n      .typing-indicator {\r\n        display: flex;\r\n        gap: 0.25rem;\r\n        padding: 0.1rem 0rem;\r\n        align-items: center;\r\n      }\r\n\r\n      .typing-container {\r\n        background: #ececec;\r\n        border-radius: 50px;\r\n        padding: 7px 15px;\r\n        display: flex;\r\n        gap: 0.25rem;\r\n      }\r\n\r\n      .typing-dot {\r\n        width: 8px;\r\n        height: 8px;\r\n        background: #888;\r\n        border-radius: 50%;\r\n        animation: typingBounce 1.4s infinite ease-in-out;\r\n      }\r\n\r\n      .typing-dot:nth-child(1) { animation-delay: 0s; }\r\n      .typing-dot:nth-child(2) { animation-delay: 0.2s; }\r\n      .typing-dot:nth-child(3) { animation-delay: 0.4s; }\r\n\r\n      /* Input Area */\r\n      .chat-input-area {\r\n        padding: 1rem;\r\n        padding-bottom: 0.25rem;\r\n        background: #fff;\r\n        border-top: 1px solid #e2e8f0;\r\n        transition: opacity 0.3s ease-out, max-height 0.3s ease-out;\r\n      }\r\n\r\n      .chat-input-area.hidden {\r\n        opacity: 0;\r\n        max-height: 0;\r\n        padding: 0;\r\n        overflow: hidden;\r\n        border: none;\r\n      }\r\n\r\n      .chat-input-wrapper {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 0.5rem;\r\n      }\r\n\r\n      .chat-input {\r\n        flex: 1;\r\n        background: #ececec;\r\n        border: 1px solid #fff;\r\n        border-radius: 9999px;\r\n        padding: 0.75rem 1rem;\r\n        font-size: 0.875rem;\r\n        outline: none;\r\n        color: #333;\r\n        font-family: inherit;\r\n      }\r\n\r\n      .chat-input::placeholder {\r\n        color: #888;\r\n      }\r\n\r\n      .chat-input:focus {\r\n        background: #e8e8e8;\r\n      }\r\n\r\n      .chat-input:disabled {\r\n        opacity: 0.6;\r\n      }\r\n\r\n      .send-btn {\r\n        width: 48px;\r\n        height: 48px;\r\n        border-radius: 0.75rem;\r\n        border: none;\r\n        background: transparent;\r\n        cursor: pointer;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        transition: transform 0.2s;\r\n        flex-shrink: 0;\r\n        padding: 0;\r\n      }\r\n\r\n      .send-btn:hover:not(:disabled) {\r\n        transform: scale(1.05);\r\n      }\r\n\r\n      .send-btn:active:not(:disabled) {\r\n        transform: scale(1.05);\r\n      }\r\n\r\n      .send-btn:disabled {\r\n        opacity: 0.5;\r\n        cursor: not-allowed;\r\n        transform: none;\r\n      }\r\n\r\n      .chat-footer {\n        position: relative;\n        text-align: center;\n        padding: 0.5rem;\n        font-size: 12px;\n        font-weight: 500;\n        color: #333;\n        background: #fff;\n      }\n\n      .disclaimer-btn {\n        background: none;\n        border: none;\n        color: #111827;\n        cursor: pointer;\n        font: inherit;\n        font-weight: 700;\n        padding: 0;\n        text-decoration: underline;\n      }\n\n      .disclaimer-btn:hover,\n      .disclaimer-btn:focus {\n        color: #000;\n        outline: none;\n      }\n\n      .disclaimer-popup {\n        position: absolute;\n        left: 1rem;\n        right: 1rem;\n        bottom: calc(100% + 0.5rem);\n        display: none;\n        padding: 0.85rem 1rem;\n        background: #fff;\n        border: 1px solid #d1d5db;\n        border-radius: 0.5rem;\n        box-shadow: 0 10px 25px rgba(15, 23, 42, 0.18);\n        color: #111827;\n        font-size: 12px;\n        line-height: 1.5;\n        text-align: left;\n        z-index: 2;\n      }\n\n      .disclaimer-popup.open {\n        display: block;\n      }\n\n      .disclaimer-popup a {\n        color: ${config.sendColor};\n        font-weight: 700;\n        text-decoration: underline;\n      }\n\n      .disclaimer-popup::after {\n        content: \"\";\n        position: absolute;\n        left: 50%;\n        bottom: -7px;\n        width: 12px;\n        height: 12px;\n        background: #fff;\n        border-right: 1px solid #d1d5db;\n        border-bottom: 1px solid #d1d5db;\n        transform: translateX(-50%) rotate(45deg);\n      }\n\r\n      /* Inline Form Styles (appears in chat) */\r\n      .inline-form-container {\r\n        background: #f8f9fa;\r\n        border-radius: 1rem;\r\n        padding: 1rem;\r\n        margin-bottom: 1rem;\r\n        animation: messageSlideIn 0.3s ease-out;\r\n        border: 1px solid #e9ecef;\r\n      }\r\n\r\n      .inline-form-title {\r\n        font-size: 0.9rem;\r\n        font-weight: 600;\r\n        margin-bottom: 0.25rem;\r\n        color: #333;\r\n      }\r\n\r\n      .inline-form-subtitle {\r\n        font-size: 0.8rem;\r\n        color: #666;\r\n        margin-bottom: 1rem;\r\n      }\r\n\r\n      .form-group {\r\n        margin-bottom: 0.75rem;\r\n      }\r\n\r\n      .form-label {\r\n        display: block;\r\n        font-size: 0.75rem;\r\n        font-weight: 500;\r\n        color: #555;\r\n        margin-bottom: 0.25rem;\r\n      }\r\n\r\n      .form-input {\r\n        width: 100%;\r\n        padding: 0.6rem 0.75rem;\r\n        border: 1px solid #ddd;\r\n        border-radius: 0.5rem;\r\n        font-size: 0.8rem;\r\n        transition: border-color 0.2s, box-shadow 0.2s;\r\n        background: #fff;\r\n        color: #333;\r\n        font-family: inherit;\r\n      }\r\n\r\n      .form-input:focus {\r\n        outline: none;\r\n        border-color: ${config.sendColor};\r\n        box-shadow: 0 0 0 2px ${config.sendColor}20;\r\n      }\r\n\r\n      .form-input.error {\r\n        border-color: #ef4444;\r\n        background: #fef2f2;\r\n      }\r\n\r\n      .form-input::placeholder {\r\n        color: #999;\r\n      }\r\n\r\n      .form-textarea {\r\n        min-height: 60px;\r\n        resize: vertical;\r\n      }\r\n\r\n      .form-error {\r\n        font-size: 0.7rem;\r\n        color: #ef4444;\r\n        margin-top: 0.2rem;\r\n      }\r\n\r\n      .form-submit-btn {\r\n        width: 100%;\r\n        padding: 0.7rem;\r\n        background: ${config.sendColor};\r\n        color: #fff;\r\n        border: none;\r\n        border-radius: 0.5rem;\r\n        font-size: 0.85rem;\r\n        font-weight: 600;\r\n        cursor: pointer;\r\n        transition: transform 0.2s, opacity 0.2s, box-shadow 0.2s;\r\n        margin-top: 0.5rem;\r\n      }\r\n\r\n      .form-submit-btn:hover:not(:disabled) {\r\n        transform: translateY(-1px);\r\n        box-shadow: 0 4px 12px ${config.sendColor}30;\r\n      }\r\n\r\n      .form-submit-btn:active:not(:disabled) {\r\n        transform: translateY(0);\r\n      }\r\n\r\n      .form-submit-btn:disabled {\r\n        opacity: 0.6;\r\n        cursor: not-allowed;\r\n        transform: none;\r\n      }\r\n\r\n      /* Floating Button */\r\n      .floating-btn {\r\n        position: fixed;\r\n        bottom: 15px;\r\n        right: 45px;\r\n        width: 75px;\r\n        height: 75px;\r\n        border-radius: 9999px;\r\n        background: ${config.floatingBtnColor};\r\n        border: none;\r\n        cursor: pointer;\r\n        box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        z-index: 9999;\r\n        transition: filter 0.3s, transform 0.2s;\r\n        animation: floatBtn 3s ease-in-out infinite;\r\n        filter: brightness(1.15);\r\n        padding: 1rem;\r\n        overflow: hidden;\r\n      }\r\n\r\n      .floating-btn:hover {\r\n        filter: brightness(1);\r\n        animation: none;\r\n      }\r\n\r\n      .floating-btn:active {\r\n        transform: scale(0.95);\r\n      }\r\n\r\n      .floating-btn svg {\r\n        width: 32px;\r\n        height: 26px;\r\n        color: #fff;\r\n      }\r\n\r\n      .floating-btn img {\r\n        width: 50px;\r\n        height: 50px;\r\n        object-fit: contain;\r\n        display: block;\r\n      }\r\n\r\n      .floating-btn.hidden {\r\n        display: none;\r\n      }\r\n\r\n      /* Animations */\r\n      @keyframes slideUp {\r\n        from {\r\n          opacity: 0;\r\n          transform: translateY(20px);\r\n        }\r\n        to {\r\n          opacity: 1;\r\n          transform: translateY(0);\r\n        }\r\n      }\r\n\r\n      @keyframes slideDown {\r\n        from {\r\n          opacity: 1;\r\n          transform: translateY(0);\r\n        }\r\n        to {\r\n          opacity: 0;\r\n          transform: translateY(20px);\r\n        }\r\n      }\r\n\r\n      @keyframes pulse {\r\n        0%, 100% { opacity: 1; }\r\n        50% { opacity: 0.4; }\r\n      }\r\n\r\n      @keyframes typingBounce {\r\n        0%, 80%, 100% {\r\n          transform: translateY(0);\r\n        }\r\n        40% {\r\n          transform: translateY(-6px);\r\n        }\r\n      }\r\n\r\n      @keyframes floatBtn {\r\n        0%, 100% { transform: translateY(0); }\r\n        50% { transform: translateY(-5px); }\r\n      }\r\n\r\n      @keyframes messageSlideIn {\r\n        from {\r\n          opacity: 0;\r\n          transform: translateY(10px);\r\n        }\r\n        to {\r\n          opacity: 1;\r\n          transform: translateY(0);\r\n        }\r\n      }\r\n\r\n      @keyframes messageSlideInRight {\r\n        from {\r\n          opacity: 0;\r\n          transform: translateY(10px);\r\n        }\r\n        to {\r\n          opacity: 1;\r\n          transform: translateY(0);\r\n        }\r\n      }\r\n\r\n      /* Scrollbar */\r\n      .chat-messages, .chat-form {\r\n        scrollbar-width: thin;\r\n        scrollbar-color: #ccc transparent;\r\n      }\r\n\r\n      .chat-messages::-webkit-scrollbar,\r\n      .chat-form::-webkit-scrollbar {\r\n        width: 6px;\r\n      }\r\n\r\n      .chat-messages::-webkit-scrollbar-track,\r\n      .chat-form::-webkit-scrollbar-track {\r\n        background: transparent;\r\n      }\r\n\r\n      .chat-messages::-webkit-scrollbar-thumb,\r\n      .chat-form::-webkit-scrollbar-thumb {\r\n        background: #ccc;\r\n        border-radius: 3px;\r\n      }\r\n\r\n      .chat-messages::-webkit-scrollbar-thumb:hover,\r\n      .chat-form::-webkit-scrollbar-thumb:hover {\r\n        background: #aaa;\r\n      }\r\n\r\n      /* Message content styles */\r\n      .message-content p {\r\n        margin-bottom: 0.5rem;\r\n      }\r\n\r\n      .message-content p:last-child {\r\n        margin-bottom: 0;\r\n      }\r\n\r\n      .message-content a {\r\n        color: ${config.sendColor};\r\n        text-decoration: underline;\r\n      }\r\n\r\n      .message-content ul, .message-content ol {\r\n        margin-left: 1.25rem;\r\n        margin-bottom: 0.5rem;\r\n      }\r\n\r\n      .message-content li {\r\n        margin-bottom: 0.25rem;\r\n      }\r\n    </style>\r\n\r\n    <div class=\"chat-widget-container\" id=\"chatContainer\">\r\n      <div class=\"chat-header\">\r\n        <div class=\"chat-header-left\">\r\n          <img class=\"chat-logo\" src=\"${config.logoIcon}\" alt=\"Logo\" onerror=\"this.style.display='none'\" />\r\n          <div class=\"chat-header-info\">\r\n            <h3>${config.bannerText}</h3>\r\n            <div class=\"chat-status\">\r\n              <span>${config.bannerTextParagraph}</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <button class=\"close-btn\" id=\"closeBtn\" aria-label=\"Close chat\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M9.21387 0.125C11.5101 0.127425 13.7122 1.04041 15.3359 2.66406C16.9596 4.28776 17.8726 6.48988 17.875 8.78613C17.8749 10.4989 17.3676 12.1735 16.416 13.5977C15.4644 15.0219 14.1109 16.1316 12.5283 16.7871C10.9459 17.4425 9.20431 17.6144 7.52441 17.2803C5.84472 16.9461 4.3019 16.1211 3.09082 14.9102C1.87964 13.699 1.05392 12.1555 0.719727 10.4756C0.38557 8.79567 0.557473 7.05415 1.21289 5.47168C1.86833 3.88932 2.97833 2.5366 4.40234 1.58496C5.82644 0.633413 7.50114 0.125111 9.21387 0.125ZM12.1074 1.80176C10.7262 1.22963 9.20557 1.0804 7.73926 1.37207C6.27313 1.6638 4.92618 2.38339 3.86914 3.44043C2.8121 4.49747 2.09251 5.84442 1.80078 7.31055C1.50911 8.77686 1.65834 10.2975 2.23047 11.6787C2.8026 13.0599 3.7716 14.2407 5.01465 15.0713C6.25771 15.9019 7.71983 16.3447 9.21484 16.3447C11.2188 16.3424 13.1396 15.5449 14.5566 14.1279C15.9737 12.7109 16.7711 10.7901 16.7734 8.78613C16.7734 7.29112 16.3306 5.829 15.5 4.58594C14.6694 3.34289 13.4886 2.37389 12.1074 1.80176ZM11.918 5.53125C11.9903 5.53128 12.0621 5.54557 12.1289 5.57324C12.1957 5.60093 12.2565 5.64129 12.3076 5.69238C12.3587 5.74346 12.3991 5.80438 12.4268 5.87109C12.4544 5.93785 12.4687 6.00978 12.4688 6.08203C12.4687 6.15432 12.4544 6.22617 12.4268 6.29297C12.3991 6.35971 12.3587 6.42056 12.3076 6.47168L10.0811 8.69727L9.99316 8.78613L10.0811 8.87402L12.3076 11.0996C12.3587 11.1507 12.3991 11.2116 12.4268 11.2783C12.4544 11.3452 12.4688 11.4169 12.4688 11.4893C12.4687 11.5616 12.4544 11.6334 12.4268 11.7002C12.3991 11.767 12.3587 11.8278 12.3076 11.8789C12.2565 11.93 12.1957 11.9703 12.1289 11.998C12.0621 12.0257 11.9903 12.04 11.918 12.04C11.8456 12.04 11.7739 12.0257 11.707 11.998C11.6403 11.9704 11.5795 11.93 11.5283 11.8789L9.30273 9.65234L9.21484 9.56445L9.12598 9.65234L6.90039 11.8789C6.84927 11.9299 6.78842 11.9704 6.72168 11.998C6.65488 12.0257 6.58303 12.04 6.51074 12.04C6.43849 12.04 6.36656 12.0257 6.2998 11.998C6.23309 11.9704 6.17217 11.93 6.12109 11.8789C6.07 11.8278 6.02964 11.7669 6.00195 11.7002C5.97428 11.6334 5.95999 11.5616 5.95996 11.4893C5.95996 11.4169 5.9743 11.3451 6.00195 11.2783C6.0296 11.2116 6.07006 11.1507 6.12109 11.0996L8.34766 8.87402L8.43555 8.78613L8.34766 8.69727L6.12109 6.47168H6.12012C6.01729 6.36839 5.95996 6.22781 5.95996 6.08203C5.96006 5.93598 6.01782 5.79566 6.12109 5.69238C6.22437 5.5891 6.3647 5.53135 6.51074 5.53125C6.65675 5.53125 6.79706 5.58926 6.90039 5.69238L9.12598 7.91895L9.21484 8.00684L9.30273 7.91895L11.5283 5.69238C11.5794 5.64135 11.6403 5.60089 11.707 5.57324C11.7739 5.54559 11.8456 5.53125 11.918 5.53125Z\" fill=\"${config.closeButtonColor}\" stroke-width=\"0.25\"/>\r\n          </svg>\r\n        </button>\r\n      </div>\r\n\r\n      <div class=\"chat-messages\" id=\"chatMessages\">\r\n        <!-- Messages will be appended here -->\r\n      </div>\r\n\r\n      <div class=\"chat-input-area\" id=\"chatInputArea\">\n        <div class=\"chat-input-wrapper\">\n          <input type=\"text\" class=\"chat-input\" id=\"chatInput\" placeholder=\"Type your message...\" autocomplete=\"off\" />\n          <button class=\"send-btn\" id=\"sendBtn\" aria-label=\"Send message\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\" viewBox=\"0 0 30 30\" fill=\"none\">\n            <rect id=\"send-button-color\" width=\"29.0214\" height=\"29.0214\" rx=\"14.5107\" fill=\"${config.sendColor}\" style=\"fill: ${config.sendColor};\"></rect>\n            <mask id=\"mask0_983_365\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"9\" y=\"8\" width=\"14\" height=\"13\">\n            <rect x=\"9.13684\" y=\"8.06158\" width=\"12.8984\" height=\"12.8984\" fill=\"url(#pattern0_983_365)\"></rect>\n            </mask>\n            <g mask=\"url(#mask0_983_365)\">\r\n            <rect x=\"9.13684\" y=\"8.06158\" width=\"12.8984\" height=\"12.8984\" fill=\"white\"></rect>\r\n            </g>\r\n            <defs>\r\n            <pattern id=\"pattern0_983_365\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\r\n            <use xlink:href=\"#image0_983_365\" transform=\"scale(0.00195312)\"></use>\r\n            </pattern>\r\n            <image id=\"image0_983_365\" width=\"512\" height=\"512\" preserveAspectRatio=\"none\" xlink:href=\"\r\ndata:image/png;base64,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\r\n\"></image>\r\n            </defs>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n        \n      </div>\n\n      <div class=\"chat-footer\">\n        <div class=\"disclaimer-popup\" id=\"disclaimerPopup\" role=\"dialog\" aria-live=\"polite\">\n          This AI chatbot is provided for informational purposes only and operates based on automated processing of user inputs. Chat interactions may be monitored and logged to improve service quality and security. See our\n          <a href=\"https://www.trinamix.com/privacy-policy/\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a>.\n        </div>\n        By chatting, you agree to this\n        <button type=\"button\" class=\"disclaimer-btn\" id=\"disclaimerBtn\" aria-expanded=\"false\" aria-controls=\"disclaimerPopup\">disclaimer</button>.\n      </div>\n\n    </div>\n\r\n    <button class=\"floating-btn\" id=\"floatingBtn\" aria-label=\"Open chat\">\n      <img src=\"${chatIcon}\" alt=\"Chat Icon\" />\n    </button>\n  `;\n}\n","import { fetchChatResponse, getOrCreateSessionId, submitForm } from \"./api\";\nimport { clearFormErrors, getFormData, showFormErrors, validateForm } from \"./form-helpers\";\nimport { createMessageElement, createTypingIndicator, removeTypingIndicator, scrollToBottom } from \"./message-helpers\";\nimport { getTemplate } from \"./template\";\nimport type { WidgetFlags } from \"./types\";\n\nconst MESSAGE_COUNT_BEFORE_FORM = 5;\n\nexport class TextChatWidget extends HTMLElement {\n     private shadowRoot_: ShadowRoot;\n     private sessionId: string = \"\";\n     private messageCount: number = 0;\n\n     private flags: WidgetFlags = {\n          isOpen: false,\n          isButtonClicked: false,\n          isAutoOpen: false,\n          defaultMessageDisplayed: false,\n          isFormShown: false,\n          isFormSubmitted: false,\n     };\n\n     // Configurable properties\n     private config = {\n          primaryText: \"Hello! How can I help you today?\",\n          bannerColor: \"#120b14\",\n          bannerText: \"Chat Assistant\",\n          bannerTextColor: \"#ffffff\",\n          bannerTextParagraph: \"Online\",\n          bannerTextParagraphColor: \"#999999\",\n          closeButtonColor: \"#ffffff\",\n          logoIcon:\n               \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23FC0E3F'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z'/%3E%3C/svg%3E\",\n          sendColor: \"#FC0E3F\",\n          floatingBtnColor: \"#FC0E3F\",\n          userChatColor: \"#ffdde4\",\n          autoOpen: false,\n     };\n\n     constructor() {\n          super();\n          this.shadowRoot_ = this.attachShadow({ mode: \"closed\" });\n     }\n\n     static get observedAttributes(): string[] {\n          return [\n               \"primary-text\",\n               \"banner-color\",\n               \"banner-text\",\n               \"banner-text-color\",\n               \"banner-text-paragraph\",\n               \"banner-text-paragraph-color\",\n               \"close-button-color\",\n               \"logo-icon\",\n               \"send-color\",\n               \"floating-btn-color\",\n               \"user-chat-color\",\n               \"auto-open\",\n          ];\n     }\n\n     connectedCallback(): void {\n          this.loadConfiguration();\n          this.sessionId = getOrCreateSessionId();\n          this.loadMessageCount();\n          this.render();\n          this.bindEvents();\n\n          // Show initial message\n          setTimeout(() => {\n               this.showInitialMessage();\n          }, 100);\n\n          // Auto-open if configured\n          if (this.config.autoOpen) {\n               setTimeout(() => {\n                    if (!this.flags.isButtonClicked) {\n                         this.openChat();\n                    }\n               }, 3000);\n          }\n     }\n\n     private loadConfiguration(): void {\n          this.config.primaryText = this.getAttribute(\"primary-text\") || this.config.primaryText;\n          this.config.bannerColor = this.getAttribute(\"banner-color\") || this.config.bannerColor;\n          this.config.bannerText = this.getAttribute(\"banner-text\") || this.config.bannerText;\n          this.config.bannerTextColor = this.getAttribute(\"banner-text-color\") || this.config.bannerTextColor;\n          this.config.bannerTextParagraph = this.getAttribute(\"banner-text-paragraph\") || this.config.bannerTextParagraph;\n          this.config.bannerTextParagraphColor = this.getAttribute(\"banner-text-paragraph-color\") || this.config.bannerTextParagraphColor;\n          this.config.closeButtonColor = this.getAttribute(\"close-button-color\") || this.config.closeButtonColor;\n          this.config.logoIcon = this.getAttribute(\"logo-icon\") || this.config.logoIcon;\n          this.config.sendColor = this.getAttribute(\"send-color\") || this.config.sendColor;\n          this.config.floatingBtnColor = this.getAttribute(\"floating-btn-color\") || this.config.floatingBtnColor;\n          this.config.userChatColor = this.getAttribute(\"user-chat-color\") || this.config.userChatColor;\n          this.config.autoOpen = this.getAttribute(\"auto-open\") === \"true\";\n     }\n\n     private loadMessageCount(): void {\n          const storedCount = sessionStorage.getItem(\"text_chat_message_count\");\n          const storedFormSubmitted = sessionStorage.getItem(\"text_chat_form_submitted\");\n\n          if (storedCount) {\n               this.messageCount = parseInt(storedCount, 10) || 0;\n          }\n\n          if (storedFormSubmitted === \"true\") {\n               this.flags.isFormSubmitted = true;\n          }\n     }\n\n     private saveMessageCount(): void {\n          sessionStorage.setItem(\"text_chat_message_count\", this.messageCount.toString());\n     }\n\n     private render(): void {\n          this.shadowRoot_.innerHTML = getTemplate({\n               bannerColor: this.config.bannerColor,\n               bannerText: this.config.bannerText,\n               bannerTextColor: this.config.bannerTextColor,\n               bannerTextParagraph: this.config.bannerTextParagraph,\n               bannerTextParagraphColor: this.config.bannerTextParagraphColor,\n               closeButtonColor: this.config.closeButtonColor,\n               logoIcon: this.config.logoIcon,\n               sendColor: this.config.sendColor,\n               floatingBtnColor: this.config.floatingBtnColor,\n               userChatColor: this.config.userChatColor,\n          });\n     }\n\n     private bindEvents(): void {\n          const floatingBtn = this.shadowRoot_.getElementById(\"floatingBtn\");\n          const closeBtn = this.shadowRoot_.getElementById(\"closeBtn\");\n          const sendBtn = this.shadowRoot_.getElementById(\"sendBtn\");\n          const disclaimerBtn = this.shadowRoot_.getElementById(\"disclaimerBtn\");\n          const chatInput = this.shadowRoot_.getElementById(\"chatInput\") as HTMLInputElement;\n          const formSubmitBtn = this.shadowRoot_.getElementById(\"formSubmitBtn\");\n\n          floatingBtn?.addEventListener(\"click\", () => this.toggleChat());\n          closeBtn?.addEventListener(\"click\", () => this.closeChat());\n          disclaimerBtn?.addEventListener(\"click\", (event) => {\n               event.stopPropagation();\n               this.toggleDisclaimer();\n          });\n\n          this.shadowRoot_.addEventListener(\"click\", (event) => {\n               const target = event.target as Node;\n               const disclaimerPopup = this.shadowRoot_.getElementById(\"disclaimerPopup\");\n\n               if (!disclaimerPopup?.contains(target) && !disclaimerBtn?.contains(target)) {\n                    this.hideDisclaimer();\n               }\n          });\n\n          this.shadowRoot_.addEventListener(\"keydown\", (event) => {\n               if ((event as KeyboardEvent).key === \"Escape\") {\n                    this.hideDisclaimer();\n               }\n          });\n\n          sendBtn?.addEventListener(\"click\", () => this.handleSendMessage());\n\n          chatInput?.addEventListener(\"keypress\", (e: KeyboardEvent) => {\n               if (e.key === \"Enter\" && !e.shiftKey) {\n                    e.preventDefault();\n                    this.handleSendMessage();\n               }\n          });\n\n          formSubmitBtn?.addEventListener(\"click\", () => this.handleFormSubmit());\n\n          // Clear form errors on input\n          const formInputs = this.shadowRoot_.querySelectorAll(\".form-input\");\n          formInputs.forEach((input) => {\n               input.addEventListener(\"input\", () => clearFormErrors(this.shadowRoot_));\n          });\n     }\n\n     private showInitialMessage(): void {\n          if (this.flags.defaultMessageDisplayed) return;\n\n          const messagesContainer = this.shadowRoot_.getElementById(\"chatMessages\");\n          if (!messagesContainer) return;\n\n          const botMessage = createMessageElement(this.config.primaryText, false, this.config.userChatColor, this.config.logoIcon);\n\n          messagesContainer.appendChild(botMessage);\n          this.flags.defaultMessageDisplayed = true;\n     }\n\n     private toggleChat(): void {\n          this.flags.isButtonClicked = true;\n\n          if (this.flags.isOpen) {\n               this.closeChat();\n          } else {\n               this.openChat();\n          }\n     }\n\n     private openChat(): void {\n          const container = this.shadowRoot_.getElementById(\"chatContainer\");\n          const floatingBtn = this.shadowRoot_.getElementById(\"floatingBtn\");\n\n          if (container) {\n               container.classList.add(\"open\");\n               container.classList.remove(\"closing\");\n          }\n\n          floatingBtn?.classList.add(\"hidden\");\n          this.flags.isOpen = true;\n\n          // Focus input\n          const chatInput = this.shadowRoot_.getElementById(\"chatInput\") as HTMLInputElement;\n          setTimeout(() => chatInput?.focus(), 100);\n     }\n\n     private closeChat(): void {\n          const container = this.shadowRoot_.getElementById(\"chatContainer\");\n          const floatingBtn = this.shadowRoot_.getElementById(\"floatingBtn\");\n\n          this.hideDisclaimer();\n\n          if (container) {\n               container.classList.add(\"closing\");\n               setTimeout(() => {\n                    container.classList.remove(\"open\", \"closing\");\n               }, 300);\n          }\n\n          setTimeout(() => {\n               floatingBtn?.classList.remove(\"hidden\");\n          }, 300);\n\n          this.flags.isOpen = false;\n     }\n\n     private toggleDisclaimer(): void {\n          const disclaimerPopup = this.shadowRoot_.getElementById(\"disclaimerPopup\");\n          const disclaimerBtn = this.shadowRoot_.getElementById(\"disclaimerBtn\");\n          const isOpen = disclaimerPopup?.classList.toggle(\"open\") ?? false;\n\n          disclaimerBtn?.setAttribute(\"aria-expanded\", isOpen.toString());\n     }\n\n     private hideDisclaimer(): void {\n          const disclaimerPopup = this.shadowRoot_.getElementById(\"disclaimerPopup\");\n          const disclaimerBtn = this.shadowRoot_.getElementById(\"disclaimerBtn\");\n\n          disclaimerPopup?.classList.remove(\"open\");\n          disclaimerBtn?.setAttribute(\"aria-expanded\", \"false\");\n     }\n\n     private async handleSendMessage(): Promise<void> {\n          const chatInput = this.shadowRoot_.getElementById(\"chatInput\") as HTMLInputElement;\n          const messagesContainer = this.shadowRoot_.getElementById(\"chatMessages\");\n          const sendBtn = this.shadowRoot_.getElementById(\"sendBtn\") as HTMLButtonElement;\n\n          if (!chatInput || !messagesContainer) return;\n\n          const message = chatInput.value.trim();\n          if (!message) return;\n\n          // Disable input while processing\n          chatInput.disabled = true;\n          sendBtn.disabled = true;\n\n          // Add user message\n          const userMessage = createMessageElement(message, true, this.config.userChatColor, this.config.logoIcon);\n          messagesContainer.appendChild(userMessage);\n          chatInput.value = \"\";\n          scrollToBottom(messagesContainer);\n\n          // Show typing indicator\n          const typingIndicator = createTypingIndicator();\n          messagesContainer.appendChild(typingIndicator);\n          scrollToBottom(messagesContainer);\n\n          try {\n               // Call the API\n               const response = await fetchChatResponse(this.sessionId, message);\n\n               // Remove typing indicator\n               removeTypingIndicator(messagesContainer);\n\n               // Add bot response\n               const botMessage = createMessageElement(response.response || \"No response received.\", false, this.config.userChatColor, this.config.logoIcon);\n               messagesContainer.appendChild(botMessage);\n               scrollToBottom(messagesContainer);\n\n               if (!response.error) {\n                    this.messageCount++;\n                    this.saveMessageCount();\n               }\n\n               const shouldShowForm = response.show_form || this.messageCount >= MESSAGE_COUNT_BEFORE_FORM;\n\n               if (shouldShowForm && !this.flags.isFormSubmitted) {\n                    this.showForm();\n               }\n          } catch (error) {\n               console.error(\"Error sending message:\", error);\n               removeTypingIndicator(messagesContainer);\n\n               const errorMessage = createMessageElement(\"Sorry, something went wrong. Please try again.\", false, this.config.userChatColor, this.config.logoIcon);\n               messagesContainer.appendChild(errorMessage);\n               scrollToBottom(messagesContainer);\n          } finally {\n               // Re-enable input\n               chatInput.disabled = false;\n               sendBtn.disabled = false;\n               chatInput.focus();\n          }\n     }\n\n     private showForm(): void {\n          if (this.flags.isFormShown) return;\n\n          const messagesContainer = this.shadowRoot_.getElementById(\"chatMessages\");\n\n          if (!messagesContainer) return;\n\n          // Add a message prompting user to fill the form first\n          const promptMessage = createMessageElement(\n               \"Thank you for chatting with us! Please fill in your details below so we can better assist you.\",\n               false,\n               this.config.userChatColor,\n               this.config.logoIcon,\n          );\n          messagesContainer.appendChild(promptMessage);\n\n          // Create form as a message element\n          const formMessageDiv = document.createElement(\"div\");\n          formMessageDiv.className = \"message bot-message\";\n\n          const formContent = document.createElement(\"div\");\n          formContent.className = \"inline-form-container\";\n          formContent.innerHTML = `\n      <h4 class=\"form-title\">Before we continue...</h4>\n      <p class=\"form-subtitle\">Please share your details so we can assist you better.</p>\n\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"formName\">Name *</label>\n        <input type=\"text\" class=\"form-input\" id=\"formName\" placeholder=\"Your name\" required />\n        <div class=\"form-error\" id=\"formNameError\"></div>\n      </div>\n\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"formEmail\">Email *</label>\n        <input type=\"email\" class=\"form-input\" id=\"formEmail\" placeholder=\"your@email.com\" required />\n        <div class=\"form-error\" id=\"formEmailError\"></div>\n      </div>\n\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"formCompany\">Company</label>\n        <input type=\"text\" class=\"form-input\" id=\"formCompany\" placeholder=\"Your company\" />\n      </div>\n\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"formTitle\">Title</label>\n        <input type=\"text\" class=\"form-input\" id=\"formTitle\" placeholder=\"Your job title\" />\n      </div>\n\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"formRequirement\">Requirement</label>\n        <textarea class=\"form-input form-textarea\" id=\"formRequirement\" placeholder=\"Tell us what you're looking for...\"></textarea>\n      </div>\n\n      <button type=\"button\" class=\"form-submit-btn\" id=\"formSubmitBtn\">Continue Chat</button>\n    `;\n\n          formMessageDiv.appendChild(formContent);\n          messagesContainer.appendChild(formMessageDiv);\n\n          // Hide the chat input area\n          const chatInputArea = this.shadowRoot_.getElementById(\"chatInputArea\");\n          chatInputArea?.classList.add(\"hidden\");\n\n          // Scroll to bottom to show the form\n          scrollToBottom(messagesContainer);\n\n          // Bind form submit handler\n          const formSubmitBtn = this.shadowRoot_.getElementById(\"formSubmitBtn\");\n          formSubmitBtn?.addEventListener(\"click\", () => this.handleFormSubmit());\n\n          // Clear form errors on input\n          const formInputs = this.shadowRoot_.querySelectorAll(\".inline-form-container .form-input\");\n          formInputs.forEach((input) => {\n               input.addEventListener(\"input\", () => clearFormErrors(this.shadowRoot_));\n          });\n\n          // Focus first input\n          setTimeout(() => {\n               const nameInput = this.shadowRoot_.getElementById(\"formName\") as HTMLInputElement;\n               nameInput?.focus();\n          }, 100);\n\n          this.flags.isFormShown = true;\n     }\n\n     private async handleFormSubmit(): Promise<void> {\n          const formSubmitBtn = this.shadowRoot_.getElementById(\"formSubmitBtn\") as HTMLButtonElement;\n          const formData = getFormData(this.shadowRoot_, this.sessionId);\n\n          // Validate\n          const validation = validateForm({\n               name: formData.name,\n               email: formData.email,\n          });\n\n          if (!validation.isValid) {\n               showFormErrors(this.shadowRoot_, validation.errors);\n               return;\n          }\n\n          // Disable button\n          formSubmitBtn.disabled = true;\n          formSubmitBtn.textContent = \"Submitting...\";\n\n          try {\n               const response = await submitForm(formData);\n\n               if (response.success) {\n                    this.flags.isFormSubmitted = true;\n                    sessionStorage.setItem(\"text_chat_form_submitted\", \"true\");\n\n                    // Update button to show submitted state\n                    formSubmitBtn.textContent = \"Submitted\";\n                    formSubmitBtn.disabled = true;\n\n                    // Hide the form and show input area\n                    this.hideForm();\n\n                    // Add thank you message\n                    const messagesContainer = this.shadowRoot_.getElementById(\"chatMessages\");\n                    if (messagesContainer) {\n                         const thankYouMessage = createMessageElement(\n                              response.message || `Thank you, ${formData.name}. We have received your details. Someone from our team will connect with you.`,\n                              false,\n                              this.config.userChatColor,\n                              this.config.logoIcon,\n                         );\n                         messagesContainer.appendChild(thankYouMessage);\n                         scrollToBottom(messagesContainer);\n                    }\n               } else {\n                    throw new Error(response.error || \"Form submission failed\");\n               }\n          } catch (error) {\n               console.error(\"Form submission error:\", error);\n               formSubmitBtn.disabled = false;\n               formSubmitBtn.textContent = \"Continue Chat\";\n\n               // Show error\n               const messagesContainer = this.shadowRoot_.getElementById(\"chatMessages\");\n               if (messagesContainer) {\n                    const errorMessage = createMessageElement(\"Sorry, there was an error submitting your details. Please try again.\", false, this.config.userChatColor, this.config.logoIcon);\n                    messagesContainer.appendChild(errorMessage);\n                    scrollToBottom(messagesContainer);\n               }\n          }\n     }\n\n     private hideForm(): void {\n          const chatInputArea = this.shadowRoot_.getElementById(\"chatInputArea\");\n          const messagesContainer = this.shadowRoot_.getElementById(\"chatMessages\");\n\n          if (chatInputArea) {\n               // Remove hidden class to show input area with smooth transition\n               chatInputArea.classList.remove(\"hidden\");\n\n               // Scroll to bottom after showing input area\n               if (messagesContainer) {\n                    scrollToBottom(messagesContainer);\n               }\n\n               // Focus input after transition\n               setTimeout(() => {\n                    const chatInput = this.shadowRoot_.getElementById(\"chatInput\") as HTMLInputElement;\n                    chatInput?.focus();\n               }, 100);\n          }\n     }\n}\n","import { TextChatWidget } from \"./chat-widget\";\n\n// Register the custom element\nif (typeof window !== \"undefined\" && !customElements.get(\"text-chat-widget\")) {\n  customElements.define(\"text-chat-widget\", TextChatWidget);\n}\n\n// Export for programmatic usage\nexport { TextChatWidget };\nexport * from \"./types\";\n\n// Auto-initialization function for script tag usage\nexport function initTextChatWidget(options?: {\n  primaryText?: string;\n  bannerColor?: string;\n  bannerText?: string;\n  bannerTextColor?: string;\n  bannerTextParagraph?: string;\n  bannerTextParagraphColor?: string;\n  closeButtonColor?: string;\n  logoIcon?: string;\n  sendColor?: string;\n  floatingBtnColor?: string;\n  userChatColor?: string;\n  autoOpen?: boolean;\n}): HTMLElement | null {\n  if (typeof document === \"undefined\") return null;\n\n  // Check if widget already exists\n  const existing = document.querySelector(\"text-chat-widget\");\n  if (existing) return existing as HTMLElement;\n\n  // Create widget element\n  const widget = document.createElement(\"text-chat-widget\");\n\n  // Apply options as attributes\n  if (options) {\n    if (options.primaryText) widget.setAttribute(\"primary-text\", options.primaryText);\n    if (options.bannerColor) widget.setAttribute(\"banner-color\", options.bannerColor);\n    if (options.bannerText) widget.setAttribute(\"banner-text\", options.bannerText);\n    if (options.bannerTextColor) widget.setAttribute(\"banner-text-color\", options.bannerTextColor);\n    if (options.bannerTextParagraph) widget.setAttribute(\"banner-text-paragraph\", options.bannerTextParagraph);\n    if (options.bannerTextParagraphColor) widget.setAttribute(\"banner-text-paragraph-color\", options.bannerTextParagraphColor);\n    if (options.closeButtonColor) widget.setAttribute(\"close-button-color\", options.closeButtonColor);\n    if (options.logoIcon) widget.setAttribute(\"logo-icon\", options.logoIcon);\n    if (options.sendColor) widget.setAttribute(\"send-color\", options.sendColor);\n    if (options.floatingBtnColor) widget.setAttribute(\"floating-btn-color\", options.floatingBtnColor);\n    if (options.userChatColor) widget.setAttribute(\"user-chat-color\", options.userChatColor);\n    if (options.autoOpen) widget.setAttribute(\"auto-open\", \"true\");\n  }\n\n  // Append to body\n  document.body.appendChild(widget);\n\n  return widget;\n}\n\n// Default export\nexport default TextChatWidget;\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBA+JzBA,EAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAmETA,EAAO,SAAS;AAAA,gCACRA,EAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBA0B1BA,EAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAaLA,EAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["BASE_URL","TOKEN_STORAGE_KEY","TOKEN_EXPIRY_STORAGE_KEY","requestToken","response","BASE_URL","data","token","TOKEN_STORAGE_KEY","TOKEN_EXPIRY_STORAGE_KEY","getAuthToken","forceRefresh","storedToken","storedExpiry","fetchWithAuth","endpoint","body","sendRequest","fetchChatResponse","sessionId","message","error","submitForm","formData","generateSessionId","c","r","getOrCreateSessionId","storageKey","validateEmail","email","validateForm","form","errors","getFormData","shadowRoot","sessionId","nameInput","emailInput","companyInput","titleInput","requirementInput","showFormErrors","nameError","emailError","clearFormErrors","ALLOWED_TAGS","ALLOWED_ATTRIBUTES","sanitizeURL","url","dangerousProtocols","trimmedUrl","protocol","parsed","sanitizeHTML","html","template","sanitizeNode","node","element","tagName","textContent","textNode","allowedAttrs","attrsToRemove","attr","attrName","children","child","parseMarkdownToHTML","text","html","_","url","sanitizeURL","createMessageElement","content","isUser","userChatColor","logoIcon","messageDiv","contentDiv","parsedContent","sanitizeHTML","createTypingIndicator","typingDiv","removeTypingIndicator","container","indicator","scrollToBottom","getTemplate","config","chat_default","MESSAGE_COUNT_BEFORE_FORM","TextChatWidget","getOrCreateSessionId","storedCount","storedFormSubmitted","getTemplate","floatingBtn","closeBtn","sendBtn","disclaimerBtn","chatInput","formSubmitBtn","event","target","e","input","clearFormErrors","messagesContainer","botMessage","createMessageElement","container","disclaimerPopup","isOpen","message","userMessage","scrollToBottom","typingIndicator","createTypingIndicator","response","fetchChatResponse","removeTypingIndicator","error","errorMessage","promptMessage","formMessageDiv","formContent","formData","getFormData","validation","validateForm","showFormErrors","submitForm","thankYouMessage","chatInputArea","TextChatWidget","initTextChatWidget","options","existing","widget","index_default","TextChatWidget"]}