@eshal-bot/chat-widget 0.1.73 → 0.1.74

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.
@@ -7869,7 +7869,7 @@
7869
7869
  m$2.hydrateRoot;
7870
7870
  }
7871
7871
 
7872
- var css_248z$1 = "*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.chat-widget-root{--cw-primary:#2563eb;--cw-primary-hover:#1d4ed8;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.\\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}#chat-widget-root .chat-widget-root *{box-sizing:border-box;margin:0;padding:0}#chat-widget-root .chat-messages::-webkit-scrollbar{width:6px}#chat-widget-root .chat-messages::-webkit-scrollbar-track{background:transparent}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb{background:rgba(156,163,175,.5);border-radius:10px}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(156,163,175,.7)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb{background:rgba(75,85,99,.5)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(75,85,99,.7)}#chat-widget-root .pointer-events-none{pointer-events:none}#chat-widget-root .visible{visibility:visible}#chat-widget-root .collapse{visibility:collapse}#chat-widget-root .static{position:static}#chat-widget-root .fixed{position:fixed}#chat-widget-root .absolute{position:absolute}#chat-widget-root .relative{position:relative}#chat-widget-root .sticky{position:sticky}#chat-widget-root .inset-0{inset:0}#chat-widget-root .-top-8{top:-2rem}#chat-widget-root .bottom-0{bottom:0}#chat-widget-root .bottom-5{bottom:1.25rem}#chat-widget-root .bottom-full{bottom:100%}#chat-widget-root .left-0{left:0}#chat-widget-root .left-1\\/2{left:50%}#chat-widget-root .left-5{left:1.25rem}#chat-widget-root .right-0{right:0}#chat-widget-root .right-5{right:1.25rem}#chat-widget-root .top-0{top:0}#chat-widget-root .top-1\\/2{top:50%}#chat-widget-root .top-5{top:1.25rem}#chat-widget-root .top-full{top:100%}#chat-widget-root .isolate{isolation:isolate}#chat-widget-root .z-10{z-index:10}#chat-widget-root .z-50{z-index:50}#chat-widget-root .z-\\[60\\]{z-index:60}#chat-widget-root .z-\\[70\\]{z-index:70}#chat-widget-root .z-\\[71\\]{z-index:71}#chat-widget-root .z-\\[999999\\]{z-index:999999}#chat-widget-root .z-\\[9999\\]{z-index:9999}#chat-widget-root .m-0{margin:0}#chat-widget-root .mx-2{margin-left:.5rem;margin-right:.5rem}#chat-widget-root .my-3{margin-bottom:.75rem;margin-top:.75rem}#chat-widget-root .my-4{margin-bottom:1rem;margin-top:1rem}#chat-widget-root .-mb-px{margin-bottom:-1px}#chat-widget-root .mb-1{margin-bottom:.25rem}#chat-widget-root .mb-2{margin-bottom:.5rem}#chat-widget-root .mb-3{margin-bottom:.75rem}#chat-widget-root .mb-4{margin-bottom:1rem}#chat-widget-root .mb-5{margin-bottom:1.25rem}#chat-widget-root .ml-0\\.5{margin-left:.125rem}#chat-widget-root .ml-1{margin-left:.25rem}#chat-widget-root .mt-1{margin-top:.25rem}#chat-widget-root .mt-1\\.5{margin-top:.375rem}#chat-widget-root .mt-2{margin-top:.5rem}#chat-widget-root .mt-3{margin-top:.75rem}#chat-widget-root .mt-4{margin-top:1rem}#chat-widget-root .block{display:block}#chat-widget-root .inline-block{display:inline-block}#chat-widget-root .inline{display:inline}#chat-widget-root .flex{display:flex}#chat-widget-root .inline-flex{display:inline-flex}#chat-widget-root .table{display:table}#chat-widget-root .grid{display:grid}#chat-widget-root .hidden{display:none}#chat-widget-root .h-1\\.5{height:.375rem}#chat-widget-root .h-10{height:2.5rem}#chat-widget-root .h-12{height:3rem}#chat-widget-root .h-14{height:3.5rem}#chat-widget-root .h-16{height:4rem}#chat-widget-root .h-2{height:.5rem}#chat-widget-root .h-3{height:.75rem}#chat-widget-root .h-3\\.5{height:.875rem}#chat-widget-root .h-4{height:1rem}#chat-widget-root .h-5{height:1.25rem}#chat-widget-root .h-6{height:1.5rem}#chat-widget-root .h-7{height:1.75rem}#chat-widget-root .h-8{height:2rem}#chat-widget-root .h-\\[48px\\]{height:48px}#chat-widget-root .h-\\[650px\\]{height:650px}#chat-widget-root .h-auto{height:auto}#chat-widget-root .h-full{height:100%}#chat-widget-root .h-px{height:1px}#chat-widget-root .max-h-\\[85vh\\]{max-height:85vh}#chat-widget-root .min-h-0{min-height:0}#chat-widget-root .min-h-\\[48px\\]{min-height:48px}#chat-widget-root .w-1\\.5{width:.375rem}#chat-widget-root .w-10{width:2.5rem}#chat-widget-root .w-12{width:3rem}#chat-widget-root .w-14{width:3.5rem}#chat-widget-root .w-16{width:4rem}#chat-widget-root .w-2{width:.5rem}#chat-widget-root .w-3{width:.75rem}#chat-widget-root .w-3\\.5{width:.875rem}#chat-widget-root .w-4{width:1rem}#chat-widget-root .w-44{width:11rem}#chat-widget-root .w-5{width:1.25rem}#chat-widget-root .w-6{width:1.5rem}#chat-widget-root .w-7{width:1.75rem}#chat-widget-root .w-8{width:2rem}#chat-widget-root .w-80{width:20rem}#chat-widget-root .w-96{width:24rem}#chat-widget-root .w-\\[380px\\]{width:380px}#chat-widget-root .w-\\[48px\\]{width:48px}#chat-widget-root .w-full{width:100%}#chat-widget-root .min-w-0{min-width:0}#chat-widget-root .min-w-\\[60px\\]{min-width:60px}#chat-widget-root .min-w-full{min-width:100%}#chat-widget-root .max-w-\\[75\\%\\]{max-width:75%}#chat-widget-root .max-w-\\[92vw\\]{max-width:92vw}#chat-widget-root .max-w-full{max-width:100%}#chat-widget-root .max-w-none{max-width:none}#chat-widget-root .max-w-sm{max-width:24rem}#chat-widget-root .max-w-xs{max-width:20rem}#chat-widget-root .flex-1{flex:1 1 0%}#chat-widget-root .flex-shrink-0{flex-shrink:0}#chat-widget-root .border-collapse{border-collapse:collapse}#chat-widget-root .-translate-x-1\\/2{--tw-translate-x:-50%}#chat-widget-root .-translate-x-1\\/2,#chat-widget-root .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .-translate-y-1\\/2{--tw-translate-y:-50%}#chat-widget-root .rotate-0{--tw-rotate:0deg}#chat-widget-root .rotate-0,#chat-widget-root .rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .rotate-90{--tw-rotate:90deg}#chat-widget-root .scale-0{--tw-scale-x:0;--tw-scale-y:0}#chat-widget-root .scale-0,#chat-widget-root .scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-100{--tw-scale-x:1;--tw-scale-y:1}#chat-widget-root .scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .scale-110,#chat-widget-root .scale-125{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}#chat-widget-root .scale-95{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .scale-95,#chat-widget-root .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}#chat-widget-root .animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}#chat-widget-root .animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}#chat-widget-root .animate-spin{animation:spin 1s linear infinite}#chat-widget-root .cursor-ew-resize{cursor:ew-resize}#chat-widget-root .cursor-not-allowed{cursor:not-allowed}#chat-widget-root .cursor-ns-resize{cursor:ns-resize}#chat-widget-root .cursor-nwse-resize{cursor:nwse-resize}#chat-widget-root .cursor-pointer{cursor:pointer}#chat-widget-root .resize-none{resize:none}#chat-widget-root .resize{resize:both}#chat-widget-root .list-decimal{list-style-type:decimal}#chat-widget-root .list-disc{list-style-type:disc}#chat-widget-root .list-none{list-style-type:none}#chat-widget-root .flex-row{flex-direction:row}#chat-widget-root .flex-row-reverse{flex-direction:row-reverse}#chat-widget-root .flex-col{flex-direction:column}#chat-widget-root .flex-wrap{flex-wrap:wrap}#chat-widget-root .items-start{align-items:flex-start}#chat-widget-root .items-end{align-items:flex-end}#chat-widget-root .items-center{align-items:center}#chat-widget-root .justify-start{justify-content:flex-start}#chat-widget-root .justify-end{justify-content:flex-end}#chat-widget-root .justify-center{justify-content:center}#chat-widget-root .justify-between{justify-content:space-between}#chat-widget-root .gap-0{gap:0}#chat-widget-root .gap-0\\.5{gap:.125rem}#chat-widget-root .gap-1{gap:.25rem}#chat-widget-root .gap-1\\.5{gap:.375rem}#chat-widget-root .gap-2{gap:.5rem}#chat-widget-root .gap-2\\.5{gap:.625rem}#chat-widget-root .gap-3{gap:.75rem}#chat-widget-root .gap-4{gap:1rem}#chat-widget-root .gap-6{gap:1.5rem}#chat-widget-root :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root .overflow-hidden{overflow:hidden}#chat-widget-root .overflow-visible{overflow:visible}#chat-widget-root .overflow-x-auto{overflow-x:auto}#chat-widget-root .overflow-y-auto{overflow-y:auto}#chat-widget-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#chat-widget-root .whitespace-nowrap{white-space:nowrap}#chat-widget-root .whitespace-pre-wrap{white-space:pre-wrap}#chat-widget-root .break-words{overflow-wrap:break-word}#chat-widget-root .rounded{border-radius:.25rem}#chat-widget-root .rounded-2xl{border-radius:1rem}#chat-widget-root .rounded-3xl{border-radius:1.5rem}#chat-widget-root .rounded-full{border-radius:9999px}#chat-widget-root .rounded-lg{border-radius:.5rem}#chat-widget-root .rounded-md{border-radius:.375rem}#chat-widget-root .rounded-xl{border-radius:.75rem}#chat-widget-root .rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}#chat-widget-root .rounded-tl-sm{border-top-left-radius:.125rem}#chat-widget-root .rounded-tr-sm{border-top-right-radius:.125rem}#chat-widget-root .border{border-width:1px}#chat-widget-root .border-0{border-width:0}#chat-widget-root .border-b{border-bottom-width:1px}#chat-widget-root .border-l-4{border-left-width:4px}#chat-widget-root .border-t{border-top-width:1px}#chat-widget-root .border-t-2{border-top-width:2px}#chat-widget-root .border-dotted{border-style:dotted}#chat-widget-root .border-none{border-style:none}#chat-widget-root .\\!border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity,1))!important}#chat-widget-root .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}#chat-widget-root .border-blue-700\\/50{border-color:rgba(29,78,216,.5)}#chat-widget-root .border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200\\/60{border-color:rgba(229,231,235,.6)}#chat-widget-root .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700\\/50{border-color:rgba(55,65,81,.5)}#chat-widget-root .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}#chat-widget-root .bg-current{background-color:currentColor}#chat-widget-root .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700\\/50{background-color:rgba(55,65,81,.5)}#chat-widget-root .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}#chat-widget-root .bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity,1))}#chat-widget-root .bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}#chat-widget-root .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}#chat-widget-root .bg-slate-50\\/50{background-color:rgba(248,250,252,.5)}#chat-widget-root .bg-slate-800\\/50{background-color:rgba(30,41,59,.5)}#chat-widget-root .bg-transparent{background-color:transparent}#chat-widget-root .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-white\\/10{background-color:hsla(0,0%,100%,.1)}#chat-widget-root .bg-white\\/20{background-color:hsla(0,0%,100%,.2)}#chat-widget-root .bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}#chat-widget-root .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}#chat-widget-root .from-gray-50\\/50{--tw-gradient-from:rgba(249,250,251,.5) var(--tw-gradient-from-position);--tw-gradient-to:rgba(249,250,251,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/0{--tw-gradient-from:hsla(0,0%,100%,0) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/10{--tw-gradient-from:hsla(0,0%,100%,.1) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-yellow-200{--tw-gradient-from:#fef08a var(--tw-gradient-from-position);--tw-gradient-to:hsla(53,98%,77%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .via-white\\/5{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.05) var(--tw-gradient-via-position),var(--tw-gradient-to)}#chat-widget-root .to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}#chat-widget-root .to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}#chat-widget-root .to-white\\/10{--tw-gradient-to:hsla(0,0%,100%,.1) var(--tw-gradient-to-position)}#chat-widget-root .to-yellow-400{--tw-gradient-to:#facc15 var(--tw-gradient-to-position)}#chat-widget-root .object-cover{-o-object-fit:cover;object-fit:cover}#chat-widget-root .p-0{padding:0}#chat-widget-root .p-0\\.5{padding:.125rem}#chat-widget-root .p-3{padding:.75rem}#chat-widget-root .p-5{padding:1.25rem}#chat-widget-root .p-6{padding:1.5rem}#chat-widget-root .p-8{padding:2rem}#chat-widget-root .px-1{padding-left:.25rem;padding-right:.25rem}#chat-widget-root .px-2{padding-left:.5rem;padding-right:.5rem}#chat-widget-root .px-2\\.5{padding-left:.625rem;padding-right:.625rem}#chat-widget-root .px-3{padding-left:.75rem;padding-right:.75rem}#chat-widget-root .px-4{padding-left:1rem;padding-right:1rem}#chat-widget-root .px-5{padding-left:1.25rem;padding-right:1.25rem}#chat-widget-root .py-1{padding-bottom:.25rem;padding-top:.25rem}#chat-widget-root .py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}#chat-widget-root .py-12{padding-bottom:3rem;padding-top:3rem}#chat-widget-root .py-2{padding-bottom:.5rem;padding-top:.5rem}#chat-widget-root .py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}#chat-widget-root .py-3{padding-bottom:.75rem;padding-top:.75rem}#chat-widget-root .py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}#chat-widget-root .py-4{padding-bottom:1rem;padding-top:1rem}#chat-widget-root .pb-1{padding-bottom:.25rem}#chat-widget-root .pb-2{padding-bottom:.5rem}#chat-widget-root .pl-4{padding-left:1rem}#chat-widget-root .pl-\\[50px\\]{padding-left:50px}#chat-widget-root .pt-1{padding-top:.25rem}#chat-widget-root .text-left{text-align:left}#chat-widget-root .text-center{text-align:center}#chat-widget-root .text-right{text-align:right}#chat-widget-root .align-text-bottom{vertical-align:text-bottom}#chat-widget-root .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}#chat-widget-root .text-2xl{font-size:1.5rem;line-height:2rem}#chat-widget-root .text-\\[10px\\]{font-size:10px}#chat-widget-root .text-\\[11px\\]{font-size:11px}#chat-widget-root .text-\\[15px\\]{font-size:15px}#chat-widget-root .text-base{font-size:1rem;line-height:1.5rem}#chat-widget-root .text-lg{font-size:1.125rem;line-height:1.75rem}#chat-widget-root .text-sm{font-size:.875rem;line-height:1.25rem}#chat-widget-root .text-xl{font-size:1.25rem;line-height:1.75rem}#chat-widget-root .text-xs{font-size:.75rem;line-height:1rem}#chat-widget-root .font-bold{font-weight:700}#chat-widget-root .font-medium{font-weight:500}#chat-widget-root .font-semibold{font-weight:600}#chat-widget-root .uppercase{text-transform:uppercase}#chat-widget-root .lowercase{text-transform:lowercase}#chat-widget-root .italic{font-style:italic}#chat-widget-root .tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}#chat-widget-root .leading-5{line-height:1.25rem}#chat-widget-root .leading-none{line-height:1}#chat-widget-root .leading-normal{line-height:1.5}#chat-widget-root .leading-relaxed{line-height:1.625}#chat-widget-root .leading-tight{line-height:1.25}#chat-widget-root .tracking-wide{letter-spacing:.025em}#chat-widget-root .text-\\[\\#4A5568\\]{--tw-text-opacity:1;color:rgb(74 85 104/var(--tw-text-opacity,1))}#chat-widget-root .text-current{color:currentColor}#chat-widget-root .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500\\/80{color:hsla(220,9%,46%,.8)}#chat-widget-root .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}#chat-widget-root .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}#chat-widget-root .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}#chat-widget-root .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}#chat-widget-root .text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}#chat-widget-root .no-underline{text-decoration-line:none}#chat-widget-root .placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .opacity-0{opacity:0}#chat-widget-root .opacity-50{opacity:.5}#chat-widget-root .opacity-60{opacity:.6}#chat-widget-root .opacity-80{opacity:.8}#chat-widget-root .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}#chat-widget-root .shadow,#chat-widget-root .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}#chat-widget-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}#chat-widget-root .shadow-lg,#chat-widget-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}#chat-widget-root .shadow-none,#chat-widget-root .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}#chat-widget-root .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-black\\/20{--tw-shadow-color:rgba(0,0,0,.2);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .shadow-gray-200\\/80{--tw-shadow-color:rgba(229,231,235,.8);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .outline-none{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity,1))}#chat-widget-root .ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}#chat-widget-root .blur{--tw-blur:blur(8px)}#chat-widget-root .blur,#chat-widget-root .drop-shadow{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md,#chat-widget-root .drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}#chat-widget-root .grayscale-\\[0\\.3\\]{--tw-grayscale:grayscale(0.3)}#chat-widget-root .filter,#chat-widget-root .grayscale-\\[0\\.3\\]{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}#chat-widget-root .transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .duration-150{transition-duration:.15s}#chat-widget-root .duration-200{transition-duration:.2s}#chat-widget-root .duration-300{transition-duration:.3s}#chat-widget-root .duration-500{transition-duration:.5s}#chat-widget-root :is(#chat-widget-root .animate-in){animation:slideIn .3s ease-out}#chat-widget-root :is(#chat-widget-root .transition-all){transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .\\[font-family\\:inherit\\]{font-family:inherit}#chat-widget-root .placeholder\\:text-\\[\\#8C8C8C\\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(140 140 140/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#8C8C8C\\]::placeholder{--tw-text-opacity:1;color:rgb(140 140 140/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}#chat-widget-root .hover\\:scale-105:hover,#chat-widget-root .hover\\:scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-blue-500\\/20:hover{background-color:rgba(59,130,246,.2)}#chat-widget-root .hover\\:bg-blue-900\\/50:hover{background-color:rgba(30,58,138,.5)}#chat-widget-root .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-transparent:hover{background-color:transparent}#chat-widget-root .hover\\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:underline:hover{text-decoration-line:underline}#chat-widget-root .hover\\:opacity-80:hover{opacity:.8}#chat-widget-root .hover\\:opacity-90:hover{opacity:.9}#chat-widget-root .hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .hover\\:shadow-md:hover,#chat-widget-root .hover\\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}#chat-widget-root .hover\\:grayscale-0:hover{--tw-grayscale:grayscale(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .focus\\:\\!border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity,1))!important}#chat-widget-root .focus\\:border-\\[\\#5A6069\\]:focus{--tw-border-opacity:1;border-color:rgb(90 96 105/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:border-\\[\\#B0B0B0\\]:focus{--tw-border-opacity:1;border-color:rgb(176 176 176/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus\\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-0:focus,#chat-widget-root .focus\\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus\\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}#chat-widget-root .focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}#chat-widget-root .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color:hsla(0,0%,100%,.4)}#chat-widget-root .active\\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .active\\:scale-95:active,#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{--tw-scale-x:0.97;--tw-scale-y:0.97}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:outline-none:active{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .active\\:ring-0:active{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}#chat-widget-root .disabled\\:opacity-40:disabled{opacity:.4}#chat-widget-root .disabled\\:opacity-50:disabled{opacity:.5}#chat-widget-root .disabled\\:shadow-none:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root :is(.group:hover .group-hover\\:scale-100){--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root :is(.group:hover .group-hover\\:opacity-100){opacity:1}#chat-widget-root .dark\\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .dark\\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}#chat-widget-root .rtl\\:rounded-tl-2xl:where([dir=rtl],[dir=rtl] *){border-top-left-radius:1rem}#chat-widget-root .rtl\\:rounded-tr-sm:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.125rem}#chat-widget-root .\\[\\&\\:first-child\\]\\:\\!mt-0:first-child{margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:first-child\\]\\:\\!mt-0>:first-child){margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:last-child\\]\\:\\!mb-0>:last-child){margin-bottom:0!important}";
7872
+ var css_248z$1 = "*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.chat-widget-root{--cw-primary:#2563eb;--cw-primary-hover:#1d4ed8;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.\\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}#chat-widget-root .chat-widget-root *{box-sizing:border-box;margin:0;padding:0}#chat-widget-root .chat-messages::-webkit-scrollbar{width:6px}#chat-widget-root .chat-messages::-webkit-scrollbar-track{background:transparent}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb{background:rgba(156,163,175,.5);border-radius:10px}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(156,163,175,.7)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb{background:rgba(75,85,99,.5)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(75,85,99,.7)}#chat-widget-root .pointer-events-none{pointer-events:none}#chat-widget-root .visible{visibility:visible}#chat-widget-root .collapse{visibility:collapse}#chat-widget-root .static{position:static}#chat-widget-root .fixed{position:fixed}#chat-widget-root .absolute{position:absolute}#chat-widget-root .relative{position:relative}#chat-widget-root .sticky{position:sticky}#chat-widget-root .inset-0{inset:0}#chat-widget-root .-top-8{top:-2rem}#chat-widget-root .bottom-0{bottom:0}#chat-widget-root .bottom-5{bottom:1.25rem}#chat-widget-root .bottom-full{bottom:100%}#chat-widget-root .left-0{left:0}#chat-widget-root .left-1\\/2{left:50%}#chat-widget-root .left-5{left:1.25rem}#chat-widget-root .right-0{right:0}#chat-widget-root .right-5{right:1.25rem}#chat-widget-root .top-0{top:0}#chat-widget-root .top-1\\/2{top:50%}#chat-widget-root .top-5{top:1.25rem}#chat-widget-root .top-full{top:100%}#chat-widget-root .isolate{isolation:isolate}#chat-widget-root .z-10{z-index:10}#chat-widget-root .z-50{z-index:50}#chat-widget-root .z-\\[60\\]{z-index:60}#chat-widget-root .z-\\[70\\]{z-index:70}#chat-widget-root .z-\\[71\\]{z-index:71}#chat-widget-root .z-\\[999999\\]{z-index:999999}#chat-widget-root .z-\\[9999\\]{z-index:9999}#chat-widget-root .m-0{margin:0}#chat-widget-root .mx-2{margin-left:.5rem;margin-right:.5rem}#chat-widget-root .my-3{margin-bottom:.75rem;margin-top:.75rem}#chat-widget-root .my-4{margin-bottom:1rem;margin-top:1rem}#chat-widget-root .-mb-px{margin-bottom:-1px}#chat-widget-root .mb-1{margin-bottom:.25rem}#chat-widget-root .mb-1\\.5{margin-bottom:.375rem}#chat-widget-root .mb-2{margin-bottom:.5rem}#chat-widget-root .mb-3{margin-bottom:.75rem}#chat-widget-root .mb-4{margin-bottom:1rem}#chat-widget-root .mb-5{margin-bottom:1.25rem}#chat-widget-root .ml-0\\.5{margin-left:.125rem}#chat-widget-root .ml-1{margin-left:.25rem}#chat-widget-root .mt-1{margin-top:.25rem}#chat-widget-root .mt-1\\.5{margin-top:.375rem}#chat-widget-root .mt-2{margin-top:.5rem}#chat-widget-root .mt-3{margin-top:.75rem}#chat-widget-root .mt-4{margin-top:1rem}#chat-widget-root .block{display:block}#chat-widget-root .inline-block{display:inline-block}#chat-widget-root .inline{display:inline}#chat-widget-root .flex{display:flex}#chat-widget-root .inline-flex{display:inline-flex}#chat-widget-root .table{display:table}#chat-widget-root .grid{display:grid}#chat-widget-root .hidden{display:none}#chat-widget-root .h-1\\.5{height:.375rem}#chat-widget-root .h-10{height:2.5rem}#chat-widget-root .h-12{height:3rem}#chat-widget-root .h-14{height:3.5rem}#chat-widget-root .h-16{height:4rem}#chat-widget-root .h-2{height:.5rem}#chat-widget-root .h-3{height:.75rem}#chat-widget-root .h-3\\.5{height:.875rem}#chat-widget-root .h-4{height:1rem}#chat-widget-root .h-5{height:1.25rem}#chat-widget-root .h-6{height:1.5rem}#chat-widget-root .h-7{height:1.75rem}#chat-widget-root .h-8{height:2rem}#chat-widget-root .h-\\[48px\\]{height:48px}#chat-widget-root .h-\\[650px\\]{height:650px}#chat-widget-root .h-auto{height:auto}#chat-widget-root .h-full{height:100%}#chat-widget-root .h-px{height:1px}#chat-widget-root .max-h-\\[85vh\\]{max-height:85vh}#chat-widget-root .min-h-0{min-height:0}#chat-widget-root .min-h-\\[48px\\]{min-height:48px}#chat-widget-root .w-1\\.5{width:.375rem}#chat-widget-root .w-10{width:2.5rem}#chat-widget-root .w-12{width:3rem}#chat-widget-root .w-14{width:3.5rem}#chat-widget-root .w-16{width:4rem}#chat-widget-root .w-2{width:.5rem}#chat-widget-root .w-3{width:.75rem}#chat-widget-root .w-3\\.5{width:.875rem}#chat-widget-root .w-4{width:1rem}#chat-widget-root .w-44{width:11rem}#chat-widget-root .w-5{width:1.25rem}#chat-widget-root .w-6{width:1.5rem}#chat-widget-root .w-7{width:1.75rem}#chat-widget-root .w-8{width:2rem}#chat-widget-root .w-80{width:20rem}#chat-widget-root .w-96{width:24rem}#chat-widget-root .w-\\[380px\\]{width:380px}#chat-widget-root .w-\\[48px\\]{width:48px}#chat-widget-root .w-full{width:100%}#chat-widget-root .min-w-0{min-width:0}#chat-widget-root .min-w-\\[60px\\]{min-width:60px}#chat-widget-root .min-w-full{min-width:100%}#chat-widget-root .max-w-\\[75\\%\\]{max-width:75%}#chat-widget-root .max-w-\\[92vw\\]{max-width:92vw}#chat-widget-root .max-w-full{max-width:100%}#chat-widget-root .max-w-none{max-width:none}#chat-widget-root .max-w-sm{max-width:24rem}#chat-widget-root .max-w-xs{max-width:20rem}#chat-widget-root .flex-1{flex:1 1 0%}#chat-widget-root .flex-shrink-0{flex-shrink:0}#chat-widget-root .border-collapse{border-collapse:collapse}#chat-widget-root .-translate-x-1\\/2{--tw-translate-x:-50%}#chat-widget-root .-translate-x-1\\/2,#chat-widget-root .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .-translate-y-1\\/2{--tw-translate-y:-50%}#chat-widget-root .rotate-0{--tw-rotate:0deg}#chat-widget-root .rotate-0,#chat-widget-root .rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .rotate-90{--tw-rotate:90deg}#chat-widget-root .scale-0{--tw-scale-x:0;--tw-scale-y:0}#chat-widget-root .scale-0,#chat-widget-root .scale-100{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-100{--tw-scale-x:1;--tw-scale-y:1}#chat-widget-root .scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .scale-110,#chat-widget-root .scale-125{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}#chat-widget-root .scale-95{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .scale-95,#chat-widget-root .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}#chat-widget-root .animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}#chat-widget-root .animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}#chat-widget-root .animate-spin{animation:spin 1s linear infinite}#chat-widget-root .cursor-ew-resize{cursor:ew-resize}#chat-widget-root .cursor-not-allowed{cursor:not-allowed}#chat-widget-root .cursor-ns-resize{cursor:ns-resize}#chat-widget-root .cursor-nwse-resize{cursor:nwse-resize}#chat-widget-root .cursor-pointer{cursor:pointer}#chat-widget-root .resize-none{resize:none}#chat-widget-root .resize{resize:both}#chat-widget-root .list-decimal{list-style-type:decimal}#chat-widget-root .list-disc{list-style-type:disc}#chat-widget-root .list-none{list-style-type:none}#chat-widget-root .flex-row{flex-direction:row}#chat-widget-root .flex-row-reverse{flex-direction:row-reverse}#chat-widget-root .flex-col{flex-direction:column}#chat-widget-root .flex-wrap{flex-wrap:wrap}#chat-widget-root .items-start{align-items:flex-start}#chat-widget-root .items-end{align-items:flex-end}#chat-widget-root .items-center{align-items:center}#chat-widget-root .justify-start{justify-content:flex-start}#chat-widget-root .justify-end{justify-content:flex-end}#chat-widget-root .justify-center{justify-content:center}#chat-widget-root .justify-between{justify-content:space-between}#chat-widget-root .gap-0{gap:0}#chat-widget-root .gap-0\\.5{gap:.125rem}#chat-widget-root .gap-1{gap:.25rem}#chat-widget-root .gap-1\\.5{gap:.375rem}#chat-widget-root .gap-2{gap:.5rem}#chat-widget-root .gap-2\\.5{gap:.625rem}#chat-widget-root .gap-3{gap:.75rem}#chat-widget-root .gap-4{gap:1rem}#chat-widget-root .gap-6{gap:1.5rem}#chat-widget-root :is(.space-y-1>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root .overflow-hidden{overflow:hidden}#chat-widget-root .overflow-visible{overflow:visible}#chat-widget-root .overflow-x-auto{overflow-x:auto}#chat-widget-root .overflow-y-auto{overflow-y:auto}#chat-widget-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#chat-widget-root .whitespace-nowrap{white-space:nowrap}#chat-widget-root .whitespace-pre-wrap{white-space:pre-wrap}#chat-widget-root .break-words{overflow-wrap:break-word}#chat-widget-root .rounded{border-radius:.25rem}#chat-widget-root .rounded-2xl{border-radius:1rem}#chat-widget-root .rounded-3xl{border-radius:1.5rem}#chat-widget-root .rounded-full{border-radius:9999px}#chat-widget-root .rounded-lg{border-radius:.5rem}#chat-widget-root .rounded-md{border-radius:.375rem}#chat-widget-root .rounded-xl{border-radius:.75rem}#chat-widget-root .rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}#chat-widget-root .rounded-tl-sm{border-top-left-radius:.125rem}#chat-widget-root .rounded-tr-sm{border-top-right-radius:.125rem}#chat-widget-root .border{border-width:1px}#chat-widget-root .border-0{border-width:0}#chat-widget-root .border-b{border-bottom-width:1px}#chat-widget-root .border-l-4{border-left-width:4px}#chat-widget-root .border-t{border-top-width:1px}#chat-widget-root .border-t-2{border-top-width:2px}#chat-widget-root .border-dotted{border-style:dotted}#chat-widget-root .border-none{border-style:none}#chat-widget-root .\\!border-red-500{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity,1))!important}#chat-widget-root .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}#chat-widget-root .border-blue-700\\/50{border-color:rgba(29,78,216,.5)}#chat-widget-root .border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200\\/60{border-color:rgba(229,231,235,.6)}#chat-widget-root .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700\\/50{border-color:rgba(55,65,81,.5)}#chat-widget-root .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}#chat-widget-root .bg-current{background-color:currentColor}#chat-widget-root .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700\\/50{background-color:rgba(55,65,81,.5)}#chat-widget-root .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}#chat-widget-root .bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity,1))}#chat-widget-root .bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}#chat-widget-root .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}#chat-widget-root .bg-slate-50\\/50{background-color:rgba(248,250,252,.5)}#chat-widget-root .bg-slate-800\\/50{background-color:rgba(30,41,59,.5)}#chat-widget-root .bg-transparent{background-color:transparent}#chat-widget-root .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-white\\/10{background-color:hsla(0,0%,100%,.1)}#chat-widget-root .bg-white\\/20{background-color:hsla(0,0%,100%,.2)}#chat-widget-root .bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}#chat-widget-root .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}#chat-widget-root .from-gray-50\\/50{--tw-gradient-from:rgba(249,250,251,.5) var(--tw-gradient-from-position);--tw-gradient-to:rgba(249,250,251,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/0{--tw-gradient-from:hsla(0,0%,100%,0) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/10{--tw-gradient-from:hsla(0,0%,100%,.1) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-yellow-200{--tw-gradient-from:#fef08a var(--tw-gradient-from-position);--tw-gradient-to:hsla(53,98%,77%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .via-white\\/5{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.05) var(--tw-gradient-via-position),var(--tw-gradient-to)}#chat-widget-root .to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}#chat-widget-root .to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}#chat-widget-root .to-white\\/10{--tw-gradient-to:hsla(0,0%,100%,.1) var(--tw-gradient-to-position)}#chat-widget-root .to-yellow-400{--tw-gradient-to:#facc15 var(--tw-gradient-to-position)}#chat-widget-root .object-cover{-o-object-fit:cover;object-fit:cover}#chat-widget-root .p-0{padding:0}#chat-widget-root .p-0\\.5{padding:.125rem}#chat-widget-root .p-3{padding:.75rem}#chat-widget-root .p-5{padding:1.25rem}#chat-widget-root .p-6{padding:1.5rem}#chat-widget-root .p-8{padding:2rem}#chat-widget-root .px-1{padding-left:.25rem;padding-right:.25rem}#chat-widget-root .px-2{padding-left:.5rem;padding-right:.5rem}#chat-widget-root .px-2\\.5{padding-left:.625rem;padding-right:.625rem}#chat-widget-root .px-3{padding-left:.75rem;padding-right:.75rem}#chat-widget-root .px-4{padding-left:1rem;padding-right:1rem}#chat-widget-root .px-5{padding-left:1.25rem;padding-right:1.25rem}#chat-widget-root .py-1{padding-bottom:.25rem;padding-top:.25rem}#chat-widget-root .py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}#chat-widget-root .py-12{padding-bottom:3rem;padding-top:3rem}#chat-widget-root .py-2{padding-bottom:.5rem;padding-top:.5rem}#chat-widget-root .py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}#chat-widget-root .py-3{padding-bottom:.75rem;padding-top:.75rem}#chat-widget-root .py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}#chat-widget-root .py-4{padding-bottom:1rem;padding-top:1rem}#chat-widget-root .pb-1{padding-bottom:.25rem}#chat-widget-root .pb-2{padding-bottom:.5rem}#chat-widget-root .pl-2{padding-left:.5rem}#chat-widget-root .pl-4{padding-left:1rem}#chat-widget-root .pl-\\[50px\\]{padding-left:50px}#chat-widget-root .pr-1{padding-right:.25rem}#chat-widget-root .pt-1{padding-top:.25rem}#chat-widget-root .text-left{text-align:left}#chat-widget-root .text-center{text-align:center}#chat-widget-root .text-right{text-align:right}#chat-widget-root .align-text-bottom{vertical-align:text-bottom}#chat-widget-root .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}#chat-widget-root .text-2xl{font-size:1.5rem;line-height:2rem}#chat-widget-root .text-\\[10px\\]{font-size:10px}#chat-widget-root .text-\\[11px\\]{font-size:11px}#chat-widget-root .text-\\[15px\\]{font-size:15px}#chat-widget-root .text-base{font-size:1rem;line-height:1.5rem}#chat-widget-root .text-lg{font-size:1.125rem;line-height:1.75rem}#chat-widget-root .text-sm{font-size:.875rem;line-height:1.25rem}#chat-widget-root .text-xl{font-size:1.25rem;line-height:1.75rem}#chat-widget-root .text-xs{font-size:.75rem;line-height:1rem}#chat-widget-root .font-bold{font-weight:700}#chat-widget-root .font-medium{font-weight:500}#chat-widget-root .font-semibold{font-weight:600}#chat-widget-root .uppercase{text-transform:uppercase}#chat-widget-root .lowercase{text-transform:lowercase}#chat-widget-root .italic{font-style:italic}#chat-widget-root .tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}#chat-widget-root .leading-5{line-height:1.25rem}#chat-widget-root .leading-none{line-height:1}#chat-widget-root .leading-normal{line-height:1.5}#chat-widget-root .leading-relaxed{line-height:1.625}#chat-widget-root .leading-tight{line-height:1.25}#chat-widget-root .tracking-wide{letter-spacing:.025em}#chat-widget-root .text-\\[\\#4A5568\\]{--tw-text-opacity:1;color:rgb(74 85 104/var(--tw-text-opacity,1))}#chat-widget-root .text-current{color:currentColor}#chat-widget-root .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500\\/80{color:hsla(220,9%,46%,.8)}#chat-widget-root .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}#chat-widget-root .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}#chat-widget-root .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}#chat-widget-root .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}#chat-widget-root .text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}#chat-widget-root .no-underline{text-decoration-line:none}#chat-widget-root .placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .opacity-0{opacity:0}#chat-widget-root .opacity-50{opacity:.5}#chat-widget-root .opacity-60{opacity:.6}#chat-widget-root .opacity-70{opacity:.7}#chat-widget-root .opacity-80{opacity:.8}#chat-widget-root .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}#chat-widget-root .shadow,#chat-widget-root .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}#chat-widget-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}#chat-widget-root .shadow-lg,#chat-widget-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}#chat-widget-root .shadow-none,#chat-widget-root .shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}#chat-widget-root .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-black\\/20{--tw-shadow-color:rgba(0,0,0,.2);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .shadow-gray-200\\/80{--tw-shadow-color:rgba(229,231,235,.8);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .outline-none{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity,1))}#chat-widget-root .ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}#chat-widget-root .blur{--tw-blur:blur(8px)}#chat-widget-root .blur,#chat-widget-root .drop-shadow{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md,#chat-widget-root .drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}#chat-widget-root .grayscale-\\[0\\.3\\]{--tw-grayscale:grayscale(0.3)}#chat-widget-root .filter,#chat-widget-root .grayscale-\\[0\\.3\\]{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}#chat-widget-root .transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .duration-150{transition-duration:.15s}#chat-widget-root .duration-200{transition-duration:.2s}#chat-widget-root .duration-300{transition-duration:.3s}#chat-widget-root .duration-500{transition-duration:.5s}#chat-widget-root :is(#chat-widget-root .animate-in){animation:slideIn .3s ease-out}#chat-widget-root :is(#chat-widget-root .transition-all){transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .\\[font-family\\:inherit\\]{font-family:inherit}#chat-widget-root .placeholder\\:text-\\[\\#8C8C8C\\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(140 140 140/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#8C8C8C\\]::placeholder{--tw-text-opacity:1;color:rgb(140 140 140/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}#chat-widget-root .hover\\:scale-105:hover,#chat-widget-root .hover\\:scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-blue-500\\/20:hover{background-color:rgba(59,130,246,.2)}#chat-widget-root .hover\\:bg-blue-900\\/50:hover{background-color:rgba(30,58,138,.5)}#chat-widget-root .hover\\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-transparent:hover{background-color:transparent}#chat-widget-root .hover\\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:underline:hover{text-decoration-line:underline}#chat-widget-root .hover\\:opacity-80:hover{opacity:.8}#chat-widget-root .hover\\:opacity-90:hover{opacity:.9}#chat-widget-root .hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .hover\\:shadow-md:hover,#chat-widget-root .hover\\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}#chat-widget-root .hover\\:grayscale-0:hover{--tw-grayscale:grayscale(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .focus\\:\\!border-red-500:focus{--tw-border-opacity:1!important;border-color:rgb(239 68 68/var(--tw-border-opacity,1))!important}#chat-widget-root .focus\\:border-\\[\\#5A6069\\]:focus{--tw-border-opacity:1;border-color:rgb(90 96 105/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:border-\\[\\#B0B0B0\\]:focus{--tw-border-opacity:1;border-color:rgb(176 176 176/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus\\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-0:focus,#chat-widget-root .focus\\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus\\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}#chat-widget-root .focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}#chat-widget-root .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color:hsla(0,0%,100%,.4)}#chat-widget-root .active\\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .active\\:scale-95:active,#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{--tw-scale-x:0.97;--tw-scale-y:0.97}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:outline-none:active{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .active\\:ring-0:active{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}#chat-widget-root .disabled\\:opacity-40:disabled{opacity:.4}#chat-widget-root .disabled\\:opacity-50:disabled{opacity:.5}#chat-widget-root .disabled\\:shadow-none:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root :is(.group:hover .group-hover\\:scale-100){--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root :is(.group:hover .group-hover\\:opacity-100){opacity:1}#chat-widget-root .dark\\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .dark\\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}#chat-widget-root .rtl\\:rounded-tl-2xl:where([dir=rtl],[dir=rtl] *){border-top-left-radius:1rem}#chat-widget-root .rtl\\:rounded-tr-sm:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.125rem}#chat-widget-root .\\[\\&\\:first-child\\]\\:\\!mt-0:first-child{margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:first-child\\]\\:\\!mt-0>:first-child){margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:last-child\\]\\:\\!mb-0>:last-child){margin-bottom:0!important}";
7873
7873
 
7874
7874
  var css_248z = ".chat-widget-root{position:fixed;z-index:999999}.chat-widget-container{color:var(--cw-text-color,inherit);font-family:var(\r\n --cw-font-family,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Roboto\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif\r\n )}#chat-widget-root .chat-messages p{overflow-wrap:anywhere;word-break:break-word}textarea#chat-widget-input::-moz-placeholder{border:none;line-height:48px;outline:none}textarea#chat-widget-input::placeholder{border:none;line-height:48px;outline:none}textarea#chat-widget-input{border:none;line-height:48px;outline:none}@keyframes slideIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}#chat-widget-root .scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}#chat-widget-root .scrollbar-hide::-webkit-scrollbar{display:none}@media print{.chat-widget-root{display:none!important}}";
7875
7875
 
@@ -8010,16 +8010,21 @@
8010
8010
  * Sends a streaming chat request using fetch
8011
8011
  * @param {object} request - Chat request object
8012
8012
  * @param {string} apiBaseUrl - Base URL for the API
8013
+ * @param {Function|undefined} getAuthToken - async fn returning a Bearer token (in-app JWT path), or undefined (Mode B proxy)
8013
8014
  */
8014
- const sendStreamingRequest = async (request, apiBaseUrl, organizationId) => {
8015
+ const sendStreamingRequest = async (request, apiBaseUrl, getAuthToken) => {
8015
8016
  const headers = {
8016
8017
  'Content-Type': 'application/json',
8017
8018
  Accept: 'text/event-stream'
8018
8019
  };
8019
8020
 
8020
- // Add organization ID header if provided
8021
- if (organizationId) {
8022
- headers['x-eshal-org'] = organizationId;
8021
+ // In-app JWT path: call getAuthToken() and set Authorization header
8022
+ // Mode B proxy: no auth header from widget; proxy injects x-eshal-sig + x-eshal-org server-side
8023
+ if (typeof getAuthToken === 'function') {
8024
+ const token = await getAuthToken();
8025
+ if (token) {
8026
+ headers['Authorization'] = "Bearer ".concat(token);
8027
+ }
8023
8028
  }
8024
8029
  const response = await fetch("".concat(apiBaseUrl.replace(/\/$/, ''), "/api/v1/support"), {
8025
8030
  method: 'POST',
@@ -8343,20 +8348,33 @@
8343
8348
  // Handle text_chunk events
8344
8349
  if (parsed.type === 'text_chunk') {
8345
8350
  var _parsed$choices;
8351
+ // ALWAYS create the skeleton on the first text_chunk, even when it
8352
+ // carries no content (a role-only "skeleton" chunk — delta.role
8353
+ // without delta.content — is the backend's "an assistant turn is
8354
+ // starting" signal used by the input/source-clarification short-
8355
+ // circuits in chat_utils.py). Without this, a clarification turn
8356
+ // that emits [text_chunk role-only] -> [complete content+
8357
+ // finalContent] never created the assistant bubble (this branch
8358
+ // skipped on empty content; the COMPLETE branch's updateFinalMessage
8359
+ // requires lastMessage.role === 'assistant' to render — see
8360
+ // updateFinalMessage line ~189) → the follow-up question was
8361
+ // silently dropped, even though the wire carried everything
8362
+ // correctly. Mirrors handleStreamEvent (line ~257) and packages/
8363
+ // frontend ChatService.ts (line ~213) which both create the
8364
+ // skeleton unconditionally on the first text_chunk.
8365
+ if (!hasReceivedFirstChunk.current) {
8366
+ hasReceivedFirstChunk.current = true;
8367
+ setMessages(prev => {
8368
+ const lastMessage = prev[prev.length - 1];
8369
+ if (!lastMessage || lastMessage.role !== 'assistant' || !lastMessage.isProcessing) {
8370
+ const skeletonMessage = createSkeletonMessage();
8371
+ return [...(prev || []), skeletonMessage];
8372
+ }
8373
+ return prev;
8374
+ });
8375
+ }
8346
8376
  const content = ((_parsed$choices = parsed.choices) === null || _parsed$choices === void 0 || (_parsed$choices = _parsed$choices[0]) === null || _parsed$choices === void 0 || (_parsed$choices = _parsed$choices.delta) === null || _parsed$choices === void 0 ? void 0 : _parsed$choices.content) || parsed.content;
8347
8377
  if (content) {
8348
- // Create skeleton on first chunk if not already created
8349
- if (!hasReceivedFirstChunk.current) {
8350
- hasReceivedFirstChunk.current = true;
8351
- setMessages(prev => {
8352
- const lastMessage = prev[prev.length - 1];
8353
- if (!lastMessage || lastMessage.role !== 'assistant' || !lastMessage.isProcessing) {
8354
- const skeletonMessage = createSkeletonMessage();
8355
- return [...(prev || []), skeletonMessage];
8356
- }
8357
- return prev;
8358
- });
8359
- }
8360
8378
  accumulatedText.current += content;
8361
8379
  updateMessage(accumulatedText.current);
8362
8380
  }
@@ -8759,31 +8777,27 @@
8759
8777
  };
8760
8778
 
8761
8779
  /**
8762
- * Constructs the voice WebSocket base URL — ALWAYS derived from the API
8763
- * base URL the widget is embedded with, as `wss://{host}/voice/ws`.
8780
+ * Constructs the voice WebSocket base URL.
8781
+ *
8782
+ * If wsBaseUrl is provided explicitly (via ChatWidget.init({ wsBaseUrl })),
8783
+ * use it directly. Required for Mode B external embeds where apiBaseUrl is
8784
+ * the customer server, not the eshal frontend.
8764
8785
  *
8765
- * `/voice/ws/{org}/{session}` is terminated by the frontend custom server
8766
- * (packages/frontend/server.js), which proxies it in-cluster to
8767
- * knowledge-api on `/ws`. The widget always talks to the same origin it
8768
- * loaded its config from, so the WS endpoint is fully determined by
8769
- * `apiBaseUrl`. There is intentionally NO override parameter: voice can
8770
- * never be pointed at the (no-longer-public) knowledge-api LoadBalancer by
8771
- * a stale embed option or backend config value.
8786
+ * For in-app use (apiBaseUrl IS the eshal frontend), derives from apiBaseUrl.
8772
8787
  *
8773
8788
  * @param {string} apiBaseUrl - Frontend base URL, e.g. https://demo.eshal.ai
8774
- * @returns {string} Voice WS base, e.g. wss://demo.eshal.ai/voice/ws
8789
+ * @param {string} [wsBaseUrl] - Explicit override, e.g. wss://dev.eshal.ai/voice/ws
8790
+ * @returns {string} Voice WS base URL
8775
8791
  */
8776
- const getWebSocketUrl = apiBaseUrl => {
8792
+ const getWebSocketUrl = (apiBaseUrl, wsBaseUrl) => {
8793
+ if (wsBaseUrl) return wsBaseUrl.replace(/\/$/, '');
8777
8794
  if (!apiBaseUrl) {
8778
- // No base URL yet (config still loading) — safe public default.
8779
8795
  return 'wss://dev.eshal.ai/voice/ws';
8780
8796
  }
8781
8797
  try {
8782
8798
  const url = new URL(apiBaseUrl);
8783
- // http→ws, https→wss; point at the frontend voice-proxy path.
8784
8799
  url.protocol = url.protocol.replace(/^http/, 'ws');
8785
8800
  url.pathname = '/voice/ws';
8786
- // Clean URL without a trailing slash.
8787
8801
  return url.toString().replace(/\/$/, '');
8788
8802
  } catch (error) {
8789
8803
  console.error("Invalid API base URL provided for WebSocket:", error);
@@ -8886,9 +8900,9 @@
8886
8900
  // rendered as a regular assistant message alongside the freshly-added one.
8887
8901
  function sanitizeMessagesForStorage(messages) {
8888
8902
  if (!Array.isArray(messages)) return [];
8889
- return messages.filter(m => m && !m.isWelcome && (m.content || Array.isArray(m.sources) && m.sources.length > 0)).map(m => {
8903
+ return messages.filter(m => m && !m.isWelcome && (m.content || Array.isArray(m.sources) && m.sources.length > 0 || Array.isArray(m.attachments) && m.attachments.length > 0)).map(m => {
8890
8904
  var _m$type;
8891
- return _objectSpread2(_objectSpread2(_objectSpread2({
8905
+ return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
8892
8906
  id: m.id,
8893
8907
  role: m.role,
8894
8908
  content: m.content,
@@ -8900,6 +8914,14 @@
8900
8914
  feedback: m.feedback
8901
8915
  } : {}), Array.isArray(m.prompts) && m.prompts.length > 0 ? {
8902
8916
  prompts: m.prompts
8917
+ } : {}), Array.isArray(m.attachments) && m.attachments.length > 0 ? {
8918
+ attachments: m.attachments.filter(a => a && (a.filename || a.storageKey)).map(a => ({
8919
+ filename: a.filename,
8920
+ mimeType: a.mimeType,
8921
+ size: a.size,
8922
+ storageKey: a.storageKey,
8923
+ url: a.url
8924
+ }))
8903
8925
  } : {});
8904
8926
  });
8905
8927
  }
@@ -9127,8 +9149,10 @@
9127
9149
  welcomeMessage,
9128
9150
  quickQuestions = [],
9129
9151
  apiBaseUrl,
9152
+ wsBaseUrl,
9130
9153
  apiKey,
9131
9154
  organizationId,
9155
+ getAuthToken,
9132
9156
  autoOpen,
9133
9157
  openDelay,
9134
9158
  darkMode,
@@ -9296,11 +9320,9 @@
9296
9320
  const visitorProfileRef = reactExports.useRef(null);
9297
9321
  const websocketUrl = reactExports.useMemo(() => {
9298
9322
  if (!organizationId) return null;
9299
- // Voice WS base is always derived from apiBaseUrl (the frontend origin
9300
- // the widget is embedded with) → wss://{host}/voice/ws. No override.
9301
- const resolvedWsBaseUrl = getWebSocketUrl(apiBaseUrl);
9323
+ const resolvedWsBaseUrl = getWebSocketUrl(apiBaseUrl, wsBaseUrl);
9302
9324
  return "".concat(resolvedWsBaseUrl, "/").concat(organizationId, "/").concat(bidiSessionId);
9303
- }, [apiBaseUrl, organizationId, bidiSessionId]);
9325
+ }, [apiBaseUrl, wsBaseUrl, organizationId, bidiSessionId]);
9304
9326
  const getNextMessageId = reactExports.useCallback(() => {
9305
9327
  const id = "msg-".concat(messageIdRef.current);
9306
9328
  messageIdRef.current += 1;
@@ -9605,8 +9627,12 @@
9605
9627
  });
9606
9628
  }, [getNextMessageId]);
9607
9629
  const sendMessage = reactExports.useCallback(async (rawText, fieldType, opts) => {
9608
- const trimmed = rawText.trim();
9609
- if (!trimmed) {
9630
+ const trimmed = String(rawText !== null && rawText !== void 0 ? rawText : '').trim();
9631
+ const attachmentsPayload = Array.isArray(opts === null || opts === void 0 ? void 0 : opts.attachments) ? opts.attachments : [];
9632
+ // Allow empty text when the user is sending attachments-only.
9633
+ // A single-file upload with no accompanying prompt is a valid
9634
+ // shape — the concierge treats the file as the whole intent.
9635
+ if (!trimmed && attachmentsPayload.length === 0) {
9610
9636
  return {
9611
9637
  success: false,
9612
9638
  error: 'Message cannot be empty'
@@ -9669,11 +9695,13 @@
9669
9695
 
9670
9696
  // Only add user message to UI for regular inquiries
9671
9697
  if (apiType === 'inquiry' || apiType === 'complaint' || apiType === 'technical') {
9672
- const userMessage = createMessage({
9698
+ const userMessage = createMessage(_objectSpread2({
9673
9699
  id: getNextMessageId(),
9674
9700
  role: "user",
9675
9701
  content: trimmed
9676
- });
9702
+ }, attachmentsPayload.length ? {
9703
+ attachments: attachmentsPayload
9704
+ } : {}));
9677
9705
  setMessages(prev => {
9678
9706
  const cleared = (prev || []).map(msg => {
9679
9707
  var _msg$prompts;
@@ -9695,7 +9723,7 @@
9695
9723
  }
9696
9724
  try {
9697
9725
  // Prepare chat request
9698
- const chatRequest = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
9726
+ const chatRequest = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
9699
9727
  message: trimmed,
9700
9728
  type: apiType,
9701
9729
  conversationId: bidiSessionId,
@@ -9726,6 +9754,8 @@
9726
9754
  filter: widgetFilter
9727
9755
  } : {}), routingChoiceRef.current ? {
9728
9756
  routing: routingChoiceRef.current
9757
+ } : {}), attachmentsPayload.length ? {
9758
+ attachments: attachmentsPayload
9729
9759
  } : {}), {}, {
9730
9760
  messageHistory: messages.filter(msg => {
9731
9761
  // Filter out processing messages, empty messages, and onboarding messages
@@ -9765,7 +9795,7 @@
9765
9795
  if (apiType === 'userName' || apiType === 'email' || apiType === 'phone') {
9766
9796
  // For onboarding fields, just consume the stream without processing.
9767
9797
  // Single attempt — no retry, no user-visible partial state to clean up.
9768
- const stream = await sendStreamingRequest(chatRequest, apiBaseUrl, organizationId);
9798
+ const stream = await sendStreamingRequest(chatRequest, apiBaseUrl, getAuthToken);
9769
9799
  const reader = stream.getReader();
9770
9800
  const decoder = new TextDecoder();
9771
9801
  while (true) {
@@ -9784,7 +9814,7 @@
9784
9814
  let lastErr;
9785
9815
  for (let attempt = 0; attempt <= STREAM_RETRY_DELAYS_MS.length; attempt += 1) {
9786
9816
  try {
9787
- const stream = await sendStreamingRequest(chatRequest, apiBaseUrl, organizationId);
9817
+ const stream = await sendStreamingRequest(chatRequest, apiBaseUrl, getAuthToken);
9788
9818
  await processStream(stream, setMessages);
9789
9819
  updateActivity(organizationId);
9790
9820
  return {
@@ -9812,7 +9842,7 @@
9812
9842
 
9813
9843
  // Non-chat, non-onboarding apiType (shouldn't currently happen):
9814
9844
  // fire and forget, single attempt.
9815
- await sendStreamingRequest(chatRequest, apiBaseUrl, organizationId);
9845
+ await sendStreamingRequest(chatRequest, apiBaseUrl, getAuthToken);
9816
9846
  updateActivity(organizationId);
9817
9847
  return {
9818
9848
  success: true
@@ -9848,7 +9878,7 @@
9848
9878
  // UX-M09: release the concurrency guard so the next send can proceed.
9849
9879
  isSendingRef.current = false;
9850
9880
  }
9851
- }, [apiBaseUrl, apiKey, getNextMessageId, organizationId, messages, bidiSessionId, routingChoice, widgetFilter, provideCitations]);
9881
+ }, [apiBaseUrl, apiKey, getNextMessageId, getAuthToken, messages, bidiSessionId, routingChoice, widgetFilter, provideCitations]);
9852
9882
  const handleOnboardingFormSubmit = reactExports.useCallback(async answers => {
9853
9883
  const questions = getOnboardingQuestions(onboardingQuestions);
9854
9884
  if (questions.length === 0) return;
@@ -9882,17 +9912,25 @@
9882
9912
  }, 500);
9883
9913
  }
9884
9914
  }, [onboardingQuestions, sendMessage, getNextMessageId, pendingUserIntent, organizationId]);
9885
- const handleSmartSubmit = reactExports.useCallback(async () => {
9886
- const trimmedInput = inputValue.trim();
9887
- if (!trimmedInput) return;
9915
+ const handleSmartSubmit = reactExports.useCallback(async (rawTextOverride, attachments) => {
9916
+ // Attachment-only send: when the user uploads a file and hits
9917
+ // Send without typing, the trimmed input is empty but committed
9918
+ // attachments count as a valid message. sendMessage tolerates an
9919
+ // empty string when opts.attachments is non-empty (see the
9920
+ // early-return in sendMessage).
9921
+ const trimmedInput = String(rawTextOverride !== null && rawTextOverride !== void 0 ? rawTextOverride : inputValue).trim();
9922
+ const hasAttachments = Array.isArray(attachments) && attachments.length > 0;
9923
+ if (!trimmedInput && !hasAttachments) return;
9888
9924
 
9889
9925
  // Onboarding is handled entirely by the OnboardingForm component.
9890
9926
  // The text input is hidden while onboarding is active, so any message
9891
9927
  // arriving here is a normal chat message.
9892
- await sendMessage(trimmedInput);
9928
+ await sendMessage(trimmedInput, undefined, hasAttachments ? {
9929
+ attachments
9930
+ } : undefined);
9893
9931
  }, [inputValue, sendMessage]);
9894
- const handleSend = reactExports.useCallback(async () => {
9895
- await handleSmartSubmit();
9932
+ const handleSend = reactExports.useCallback(async (rawTextOverride, attachments) => {
9933
+ await handleSmartSubmit(rawTextOverride, attachments);
9896
9934
  }, [handleSmartSubmit]);
9897
9935
  const toggleChat = () => {
9898
9936
  setIsOpen(prev => !prev);
@@ -11286,7 +11324,7 @@
11286
11324
  * See the LICENSE file in the root directory of this source tree.
11287
11325
  */
11288
11326
 
11289
- const __iconNode$i = [["path", {
11327
+ const __iconNode$k = [["path", {
11290
11328
  d: "M2 10v3",
11291
11329
  key: "1fnikh"
11292
11330
  }], ["path", {
@@ -11305,7 +11343,7 @@
11305
11343
  d: "M22 10v3",
11306
11344
  key: "154ddg"
11307
11345
  }]];
11308
- const AudioLines = createLucideIcon("audio-lines", __iconNode$i);
11346
+ const AudioLines = createLucideIcon("audio-lines", __iconNode$k);
11309
11347
 
11310
11348
  /**
11311
11349
  * @license lucide-react v0.575.0 - ISC
@@ -11314,11 +11352,11 @@
11314
11352
  * See the LICENSE file in the root directory of this source tree.
11315
11353
  */
11316
11354
 
11317
- const __iconNode$h = [["path", {
11355
+ const __iconNode$j = [["path", {
11318
11356
  d: "m15 18-6-6 6-6",
11319
11357
  key: "1wnfg3"
11320
11358
  }]];
11321
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$h);
11359
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$j);
11322
11360
 
11323
11361
  /**
11324
11362
  * @license lucide-react v0.575.0 - ISC
@@ -11327,11 +11365,11 @@
11327
11365
  * See the LICENSE file in the root directory of this source tree.
11328
11366
  */
11329
11367
 
11330
- const __iconNode$g = [["path", {
11368
+ const __iconNode$i = [["path", {
11331
11369
  d: "m9 18 6-6-6-6",
11332
11370
  key: "mthhwq"
11333
11371
  }]];
11334
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$g);
11372
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$i);
11335
11373
 
11336
11374
  /**
11337
11375
  * @license lucide-react v0.575.0 - ISC
@@ -11340,7 +11378,34 @@
11340
11378
  * See the LICENSE file in the root directory of this source tree.
11341
11379
  */
11342
11380
 
11343
- const __iconNode$f = [["rect", {
11381
+ const __iconNode$h = [["circle", {
11382
+ cx: "12",
11383
+ cy: "12",
11384
+ r: "10",
11385
+ key: "1mglay"
11386
+ }], ["line", {
11387
+ x1: "12",
11388
+ x2: "12",
11389
+ y1: "8",
11390
+ y2: "12",
11391
+ key: "1pkeuh"
11392
+ }], ["line", {
11393
+ x1: "12",
11394
+ x2: "12.01",
11395
+ y1: "16",
11396
+ y2: "16",
11397
+ key: "4dfq90"
11398
+ }]];
11399
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$h);
11400
+
11401
+ /**
11402
+ * @license lucide-react v0.575.0 - ISC
11403
+ *
11404
+ * This source code is licensed under the ISC license.
11405
+ * See the LICENSE file in the root directory of this source tree.
11406
+ */
11407
+
11408
+ const __iconNode$g = [["rect", {
11344
11409
  width: "14",
11345
11410
  height: "14",
11346
11411
  x: "8",
@@ -11352,7 +11417,7 @@
11352
11417
  d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",
11353
11418
  key: "zix9uf"
11354
11419
  }]];
11355
- const Copy = createLucideIcon("copy", __iconNode$f);
11420
+ const Copy = createLucideIcon("copy", __iconNode$g);
11356
11421
 
11357
11422
  /**
11358
11423
  * @license lucide-react v0.575.0 - ISC
@@ -11361,7 +11426,7 @@
11361
11426
  * See the LICENSE file in the root directory of this source tree.
11362
11427
  */
11363
11428
 
11364
- const __iconNode$e = [["path", {
11429
+ const __iconNode$f = [["path", {
11365
11430
  d: "M12 15V3",
11366
11431
  key: "m9g1x1"
11367
11432
  }], ["path", {
@@ -11371,7 +11436,7 @@
11371
11436
  d: "m7 10 5 5 5-5",
11372
11437
  key: "brsn70"
11373
11438
  }]];
11374
- const Download = createLucideIcon("download", __iconNode$e);
11439
+ const Download = createLucideIcon("download", __iconNode$f);
11375
11440
 
11376
11441
  /**
11377
11442
  * @license lucide-react v0.575.0 - ISC
@@ -11380,7 +11445,7 @@
11380
11445
  * See the LICENSE file in the root directory of this source tree.
11381
11446
  */
11382
11447
 
11383
- const __iconNode$d = [["circle", {
11448
+ const __iconNode$e = [["circle", {
11384
11449
  cx: "12",
11385
11450
  cy: "12",
11386
11451
  r: "1",
@@ -11396,7 +11461,7 @@
11396
11461
  r: "1",
11397
11462
  key: "1pcz8c"
11398
11463
  }]];
11399
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$d);
11464
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$e);
11400
11465
 
11401
11466
  /**
11402
11467
  * @license lucide-react v0.575.0 - ISC
@@ -11405,7 +11470,7 @@
11405
11470
  * See the LICENSE file in the root directory of this source tree.
11406
11471
  */
11407
11472
 
11408
- const __iconNode$c = [["path", {
11473
+ const __iconNode$d = [["path", {
11409
11474
  d: "M15 3h6v6",
11410
11475
  key: "1q9fwt"
11411
11476
  }], ["path", {
@@ -11415,7 +11480,7 @@
11415
11480
  d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",
11416
11481
  key: "a6xqqp"
11417
11482
  }]];
11418
- const ExternalLink = createLucideIcon("external-link", __iconNode$c);
11483
+ const ExternalLink = createLucideIcon("external-link", __iconNode$d);
11419
11484
 
11420
11485
  /**
11421
11486
  * @license lucide-react v0.575.0 - ISC
@@ -11424,7 +11489,7 @@
11424
11489
  * See the LICENSE file in the root directory of this source tree.
11425
11490
  */
11426
11491
 
11427
- const __iconNode$b = [["path", {
11492
+ const __iconNode$c = [["path", {
11428
11493
  d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
11429
11494
  key: "1oefj6"
11430
11495
  }], ["path", {
@@ -11440,7 +11505,7 @@
11440
11505
  d: "M16 17H8",
11441
11506
  key: "z1uh3a"
11442
11507
  }]];
11443
- const FileText = createLucideIcon("file-text", __iconNode$b);
11508
+ const FileText = createLucideIcon("file-text", __iconNode$c);
11444
11509
 
11445
11510
  /**
11446
11511
  * @license lucide-react v0.575.0 - ISC
@@ -11449,7 +11514,7 @@
11449
11514
  * See the LICENSE file in the root directory of this source tree.
11450
11515
  */
11451
11516
 
11452
- const __iconNode$a = [["circle", {
11517
+ const __iconNode$b = [["circle", {
11453
11518
  cx: "12",
11454
11519
  cy: "12",
11455
11520
  r: "10",
@@ -11461,7 +11526,7 @@
11461
11526
  d: "M2 12h20",
11462
11527
  key: "9i4pu4"
11463
11528
  }]];
11464
- const Globe = createLucideIcon("globe", __iconNode$a);
11529
+ const Globe = createLucideIcon("globe", __iconNode$b);
11465
11530
 
11466
11531
  /**
11467
11532
  * @license lucide-react v0.575.0 - ISC
@@ -11470,11 +11535,11 @@
11470
11535
  * See the LICENSE file in the root directory of this source tree.
11471
11536
  */
11472
11537
 
11473
- const __iconNode$9 = [["path", {
11538
+ const __iconNode$a = [["path", {
11474
11539
  d: "M21 12a9 9 0 1 1-6.219-8.56",
11475
11540
  key: "13zald"
11476
11541
  }]];
11477
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$9);
11542
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$a);
11478
11543
 
11479
11544
  /**
11480
11545
  * @license lucide-react v0.575.0 - ISC
@@ -11483,11 +11548,11 @@
11483
11548
  * See the LICENSE file in the root directory of this source tree.
11484
11549
  */
11485
11550
 
11486
- const __iconNode$8 = [["path", {
11551
+ const __iconNode$9 = [["path", {
11487
11552
  d: "M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",
11488
11553
  key: "1sd12s"
11489
11554
  }]];
11490
- const MessageCircle = createLucideIcon("message-circle", __iconNode$8);
11555
+ const MessageCircle = createLucideIcon("message-circle", __iconNode$9);
11491
11556
 
11492
11557
  /**
11493
11558
  * @license lucide-react v0.575.0 - ISC
@@ -11496,11 +11561,24 @@
11496
11561
  * See the LICENSE file in the root directory of this source tree.
11497
11562
  */
11498
11563
 
11499
- const __iconNode$7 = [["path", {
11564
+ const __iconNode$8 = [["path", {
11500
11565
  d: "M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",
11501
11566
  key: "kfwtm"
11502
11567
  }]];
11503
- const Moon = createLucideIcon("moon", __iconNode$7);
11568
+ const Moon = createLucideIcon("moon", __iconNode$8);
11569
+
11570
+ /**
11571
+ * @license lucide-react v0.575.0 - ISC
11572
+ *
11573
+ * This source code is licensed under the ISC license.
11574
+ * See the LICENSE file in the root directory of this source tree.
11575
+ */
11576
+
11577
+ const __iconNode$7 = [["path", {
11578
+ d: "m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551",
11579
+ key: "1miecu"
11580
+ }]];
11581
+ const Paperclip = createLucideIcon("paperclip", __iconNode$7);
11504
11582
 
11505
11583
  /**
11506
11584
  * @license lucide-react v0.575.0 - ISC
@@ -91749,6 +91827,31 @@
91749
91827
  return String(n);
91750
91828
  }
91751
91829
 
91830
+ // ── Currency-aware value formatting ──────────────────────────────────────
91831
+ // A2UI chart data is normalized to `{ label, value }` by A2uiBlock's
91832
+ // numericData(), which drops the original Y-column key. A2uiBlock now threads
91833
+ // that key through as `props.yKey` so these renderers can decide whether the
91834
+ // axis / tooltip values are money. Heuristic mirrors the frontend's
91835
+ // chartShared.tsx `isCurrencyKey` — keep the keyword list in lockstep.
91836
+ // `(^|[_\W])` (not `\b`) so "average_salary" / "total_expenses" still match —
91837
+ // JS `\b` doesn't fire next to `_`.
91838
+ const CURRENCY_KEY_RE$1 = /(^|[_\W])(price|salary|cost|amount|revenue|expense|total|value|budget|spend|income|sale|balance)/i;
91839
+ function isCurrencyKey$1(key) {
91840
+ return typeof key === 'string' && CURRENCY_KEY_RE$1.test(key);
91841
+ }
91842
+
91843
+ // Compact currency for axis ticks → "$120.0k". Full currency for tooltips →
91844
+ // "$87,600" (comma-grouped, up to 2 decimals, no forced trailing zeros so a
91845
+ // whole-dollar salary reads "$81,200" not "$81,200.00").
91846
+ function formatCurrencyCompact(v) {
91847
+ return "$".concat(formatCompactNumber(v));
91848
+ }
91849
+ function formatCurrencyFull(v) {
91850
+ return "$".concat(Number(v).toLocaleString('en-US', {
91851
+ maximumFractionDigits: 2
91852
+ }));
91853
+ }
91854
+
91752
91855
  /**
91753
91856
  * Recharts bar chart — mirrors agent-sdk's eshalRenderers.BarChart.
91754
91857
  *
@@ -91761,6 +91864,11 @@
91761
91864
  isDark = false
91762
91865
  } = _ref;
91763
91866
  const data = Array.isArray(props.data) ? props.data : [];
91867
+ // Whether the Y values are money — drives the `$` on axis ticks + tooltip.
91868
+ const currency = isCurrencyKey$1(props.yKey);
91869
+ // Human series name for the tooltip ("Average Salary"), so it no longer
91870
+ // reads the generic dataKey "value".
91871
+ const seriesName = props.valueLabel || undefined;
91764
91872
  const borderColor = isDark ? '#374151' : '#e2e8f0';
91765
91873
  const bgColor = isDark ? '#1f2937' : '#ffffff';
91766
91874
  const labelColor = isDark ? '#9ca3af' : '#64748b';
@@ -91835,6 +91943,9 @@
91835
91943
  fontSize: 11,
91836
91944
  fill: labelColor
91837
91945
  },
91946
+ angle: 0,
91947
+ textAnchor: "middle",
91948
+ interval: 0,
91838
91949
  label: props.xAxisLabel ? {
91839
91950
  value: props.xAxisLabel,
91840
91951
  position: 'insideBottom',
@@ -91855,9 +91966,9 @@
91855
91966
  fontSize: 11,
91856
91967
  fill: labelColor
91857
91968
  } : undefined,
91858
- tickFormatter: v => props.unit ? "".concat(formatCompactNumber(v), " ").concat(props.unit) : formatCompactNumber(v)
91969
+ tickFormatter: v => currency ? formatCurrencyCompact(v) : props.unit ? "".concat(formatCompactNumber(v), " ").concat(props.unit) : formatCompactNumber(v)
91859
91970
  }), /*#__PURE__*/jsxRuntimeExports.jsx(Tooltip, {
91860
- formatter: v => props.unit ? "".concat(Number(v).toLocaleString(), " ").concat(props.unit) : Number(v).toLocaleString(),
91971
+ formatter: v => currency ? formatCurrencyFull(v) : props.unit ? "".concat(Number(v).toLocaleString(), " ").concat(props.unit) : Number(v).toLocaleString(),
91861
91972
  contentStyle: {
91862
91973
  background: tooltipBg,
91863
91974
  border: "1px solid ".concat(borderColor),
@@ -91867,6 +91978,7 @@
91867
91978
  }
91868
91979
  }), /*#__PURE__*/jsxRuntimeExports.jsx(Bar, {
91869
91980
  dataKey: "value",
91981
+ name: seriesName,
91870
91982
  fill: "#3b82f6",
91871
91983
  radius: [2, 2, 0, 0]
91872
91984
  })]
@@ -91950,6 +92062,7 @@
91950
92062
  donut = false
91951
92063
  } = _ref3;
91952
92064
  const data = Array.isArray(props.data) ? props.data : [];
92065
+ const currency = isCurrencyKey$1(props.yKey);
91953
92066
  const borderColor = isDark ? '#374151' : '#e2e8f0';
91954
92067
  const bgColor = isDark ? '#1f2937' : '#ffffff';
91955
92068
  const titleColor = isDark ? '#f3f4f6' : '#0f172a';
@@ -92000,7 +92113,7 @@
92000
92113
  fill: PIE_COLORS[i % PIE_COLORS.length]
92001
92114
  }, i))
92002
92115
  }), /*#__PURE__*/jsxRuntimeExports.jsx(Tooltip, {
92003
- formatter: v => Number(v).toLocaleString(),
92116
+ formatter: v => currency ? formatCurrencyFull(v) : Number(v).toLocaleString(),
92004
92117
  contentStyle: {
92005
92118
  background: tooltipBg,
92006
92119
  border: "1px solid ".concat(borderColor),
@@ -92034,6 +92147,8 @@
92034
92147
  area = false
92035
92148
  } = _ref4;
92036
92149
  const data = Array.isArray(props.data) ? props.data : [];
92150
+ const currency = isCurrencyKey$1(props.yKey);
92151
+ const seriesName = props.valueLabel || undefined;
92037
92152
  const borderColor = isDark ? '#374151' : '#e2e8f0';
92038
92153
  const bgColor = isDark ? '#1f2937' : '#ffffff';
92039
92154
  const labelColor = isDark ? '#9ca3af' : '#64748b';
@@ -92109,6 +92224,9 @@
92109
92224
  fontSize: 11,
92110
92225
  fill: labelColor
92111
92226
  },
92227
+ angle: 0,
92228
+ textAnchor: "middle",
92229
+ interval: 0,
92112
92230
  label: props.xAxisLabel ? {
92113
92231
  value: props.xAxisLabel,
92114
92232
  position: 'insideBottom',
@@ -92122,9 +92240,9 @@
92122
92240
  fontSize: 11,
92123
92241
  fill: labelColor
92124
92242
  },
92125
- tickFormatter: v => props.unit ? "".concat(formatCompactNumber(v), " ").concat(props.unit) : formatCompactNumber(v)
92243
+ tickFormatter: v => currency ? formatCurrencyCompact(v) : props.unit ? "".concat(formatCompactNumber(v), " ").concat(props.unit) : formatCompactNumber(v)
92126
92244
  }), /*#__PURE__*/jsxRuntimeExports.jsx(Tooltip, {
92127
- formatter: v => props.unit ? "".concat(Number(v).toLocaleString(), " ").concat(props.unit) : Number(v).toLocaleString(),
92245
+ formatter: v => currency ? formatCurrencyFull(v) : props.unit ? "".concat(Number(v).toLocaleString(), " ").concat(props.unit) : Number(v).toLocaleString(),
92128
92246
  contentStyle: {
92129
92247
  background: tooltipBg,
92130
92248
  border: "1px solid ".concat(borderColor),
@@ -92135,6 +92253,7 @@
92135
92253
  }), area ? /*#__PURE__*/jsxRuntimeExports.jsx(Area, {
92136
92254
  type: "monotone",
92137
92255
  dataKey: "value",
92256
+ name: seriesName,
92138
92257
  stroke: "#3b82f6",
92139
92258
  fill: "#3b82f6",
92140
92259
  fillOpacity: 0.15,
@@ -92146,6 +92265,7 @@
92146
92265
  }) : /*#__PURE__*/jsxRuntimeExports.jsx(Line, {
92147
92266
  type: "monotone",
92148
92267
  dataKey: "value",
92268
+ name: seriesName,
92149
92269
  stroke: "#3b82f6",
92150
92270
  strokeWidth: 2,
92151
92271
  dot: {
@@ -92343,7 +92463,14 @@
92343
92463
  data: rows,
92344
92464
  unit: spec.unit,
92345
92465
  xAxisLabel: spec.xAxisLabel,
92346
- yAxisLabel: spec.yAxisLabel
92466
+ yAxisLabel: spec.yAxisLabel,
92467
+ // numericData() collapses the rows to { label, value }, dropping the
92468
+ // original Y-column key. Pass it through so the renderer can detect a
92469
+ // currency column (→ "$" on the Y-axis + tooltip) and label the tooltip
92470
+ // series with the human column name ("Average Salary") instead of the
92471
+ // generic dataKey "value".
92472
+ yKey: y,
92473
+ valueLabel: prettifyLabel(y)
92347
92474
  };
92348
92475
  if (t === 'pie') return /*#__PURE__*/jsxRuntimeExports.jsx(PieChartRenderer, {
92349
92476
  props: chartProps,
@@ -92670,10 +92797,12 @@
92670
92797
 
92671
92798
  // ISO date / datetime prefix — matches the typical SQL output the
92672
92799
  // agent's tools produce when GROUP BY-ing by month
92673
- // (`DATE_TRUNC('month', col)` → `YYYY-MM-DD`). Used by formatAxisTick
92674
- // below so a chart of monthly expenses shows "Jan '26" / "Feb '26"
92675
- // horizontally instead of "2026 01 01" slanted (EV-1187 follow-up).
92676
- const ISO_DATE_RE = /^(\d{4})-(\d{2})-(\d{2})(?:T|$)/;
92800
+ // (`DATE_TRUNC('month', col)` → `YYYY-MM-DD`, or `to_char(..,'YYYY-MM')`
92801
+ // → `YYYY-MM`). Used by formatAxisTick below so a chart of monthly
92802
+ // expenses shows "Jan '26" / "Feb '26" horizontally instead of
92803
+ // "2026 01 01" or "2026 01" slanted (EV-1187 follow-up + 2026-06-24
92804
+ // day-less variant fix).
92805
+ const ISO_DATE_RE = /^(\d{4})-(\d{2})(?:-\d{2})?(?:[T\s]|$)/;
92677
92806
  function formatIsoDateAsMonthTick(value) {
92678
92807
  if (typeof value !== 'string') return null;
92679
92808
  const m = value.match(ISO_DATE_RE);
@@ -92716,6 +92845,14 @@
92716
92845
  if (!SNAKE_CASE_CATEGORY_RE.test(value)) return value;
92717
92846
  return prettifyLabel(value);
92718
92847
  }
92848
+
92849
+ // Numeric string under a money column, e.g. "81,200" / "105444" / "-1,250.50".
92850
+ // Markdown tables (the common concierge path) arrive as text cells, so a
92851
+ // salary value is the STRING "81,200" — not a number — and skips the
92852
+ // USD_FORMATTER branch below. We prefix "$" while keeping the source's own
92853
+ // grouping/decimals so it reads "$81,200" (not "$81,200.00"). A leading "$"
92854
+ // already present makes the regex miss, so we never double-prefix.
92855
+ const _NUMERIC_STRING_RE = /^-?\d[\d,]*(\.\d+)?$/;
92719
92856
  function formatCell(v, columnKey) {
92720
92857
  if (v == null) return '';
92721
92858
  if (typeof v === 'number') {
@@ -92725,6 +92862,11 @@
92725
92862
  return Number.isInteger(v) ? String(v) : v.toFixed(2);
92726
92863
  }
92727
92864
  if (typeof v === 'object') return JSON.stringify(v);
92865
+ // Numeric string under a money-named column → prefix "$" (Bug: concierge
92866
+ // salary table showed "81,200" with no currency symbol).
92867
+ if (isCurrencyKey(columnKey) && _NUMERIC_STRING_RE.test(String(v).trim())) {
92868
+ return "$".concat(String(v).trim());
92869
+ }
92728
92870
  // String cells: prettify snake_case category labels (e.g.
92729
92871
  // `office_supplies` → "Office Supplies") so the table reads
92730
92872
  // consistently with the chart's X-axis ticks on the same data.
@@ -94302,7 +94444,7 @@
94302
94444
  let {
94303
94445
  sources = [],
94304
94446
  apiBaseUrl,
94305
- organizationId,
94447
+ getAuthToken,
94306
94448
  isDark,
94307
94449
  textColor,
94308
94450
  fontFamily,
@@ -94328,7 +94470,39 @@
94328
94470
  // corpora that have none of the above.
94329
94471
  const _downloadKey = s => s.url || s.source_id || s.source_name || "";
94330
94472
  const handleFileDownload = async source => {
94331
- if (!apiBaseUrl || !organizationId) return;
94473
+ if (!apiBaseUrl) return;
94474
+ // 2026-07-03 — RAG-attach-1 download path. Attachment source
94475
+ // cards carry a presigned READ URL as `source.url` (added by
94476
+ // citation_sources.build_source_obj + chat_utils inline loop
94477
+ // when the chunk has `_is_attachment_chunk: True`). Their
94478
+ // sourceid is `attachment:<storage_key>` — not resolvable by
94479
+ // the legacy /file-download endpoint, which expects a Milvus
94480
+ // Knowledge row id. Open the SAS URL directly instead — same
94481
+ // pattern SharePoint uses, but via the URL the backend already
94482
+ // handed us so no proxy round-trip is needed.
94483
+ const attachmentSourceId = String(source.source_id || source.sourceid || "");
94484
+ const isAttachment = attachmentSourceId.startsWith("attachment:");
94485
+ if (isAttachment) {
94486
+ if (!source.url) {
94487
+ console.warn("[widget] attachment source has no URL; download unavailable");
94488
+ return;
94489
+ }
94490
+ const downloadKey = _downloadKey(source) || "attachment";
94491
+ setDownloadingId(downloadKey);
94492
+ try {
94493
+ const a = document.createElement("a");
94494
+ a.href = source.url;
94495
+ a.download = source.source_name || "download";
94496
+ a.target = "_blank";
94497
+ a.rel = "noopener noreferrer";
94498
+ a.click();
94499
+ } catch (e) {
94500
+ console.error("Attachment download failed:", e);
94501
+ } finally {
94502
+ setDownloadingId(null);
94503
+ }
94504
+ return;
94505
+ }
94332
94506
  // SharePoint proxy URLs are GET endpoints that stream the file
94333
94507
  // directly via Microsoft Graph using the stored OAuth credential.
94334
94508
  // Bypass the legacy POST /file-download lookup (which expects an
@@ -94354,11 +94528,14 @@
94354
94528
  // set, or future deployments that set it) pass through
94355
94529
  // unchanged.
94356
94530
  const spUrl = source.url.startsWith("http") ? source.url : "".concat(apiBaseUrl.replace(/\/$/, "")).concat(source.url);
94531
+ const spHeaders = {};
94532
+ if (typeof getAuthToken === 'function') {
94533
+ const token = await getAuthToken();
94534
+ if (token) spHeaders['Authorization'] = "Bearer ".concat(token);
94535
+ }
94357
94536
  res = await fetch(spUrl, {
94358
94537
  method: "GET",
94359
- headers: {
94360
- "x-eshal-org": organizationId
94361
- },
94538
+ headers: spHeaders,
94362
94539
  credentials: "include"
94363
94540
  });
94364
94541
  } else {
@@ -94374,15 +94551,18 @@
94374
94551
  // - source.source_name (the user's original filename)
94375
94552
  // Sending both lets the server skip the Milvus resolution
94376
94553
  // AND advertise the readable name in Content-Disposition.
94554
+ const dlHeaders = {
94555
+ "Content-Type": "application/json"
94556
+ };
94557
+ if (typeof getAuthToken === 'function') {
94558
+ const token = await getAuthToken();
94559
+ if (token) dlHeaders['Authorization'] = "Bearer ".concat(token);
94560
+ }
94377
94561
  res = await fetch(url, {
94378
94562
  method: "POST",
94379
- headers: {
94380
- "Content-Type": "application/json",
94381
- "x-eshal-org": organizationId
94382
- },
94563
+ headers: dlHeaders,
94383
94564
  credentials: "include",
94384
94565
  body: JSON.stringify({
94385
- org_id: organizationId,
94386
94566
  source_id: source.source_id,
94387
94567
  file_name: source.url || "",
94388
94568
  source_name: source.source_name || ""
@@ -94567,7 +94747,7 @@
94567
94747
  conciergeName,
94568
94748
  companyName,
94569
94749
  apiBaseUrl,
94570
- organizationId,
94750
+ getAuthToken,
94571
94751
  onPromptSuggestionClick,
94572
94752
  allowFeedback = true,
94573
94753
  provideCitations = true,
@@ -94739,7 +94919,7 @@
94739
94919
  }), /*#__PURE__*/jsxRuntimeExports.jsx(MessageSources, {
94740
94920
  sources: message.sources,
94741
94921
  apiBaseUrl: apiBaseUrl,
94742
- organizationId: organizationId,
94922
+ getAuthToken: getAuthToken,
94743
94923
  isDark: isDark,
94744
94924
  textColor: messageTextColor,
94745
94925
  fontFamily: messageFontFamily,
@@ -94765,7 +94945,7 @@
94765
94945
  }), /*#__PURE__*/jsxRuntimeExports.jsx(MessageSources, {
94766
94946
  sources: message.sources,
94767
94947
  apiBaseUrl: apiBaseUrl,
94768
- organizationId: organizationId,
94948
+ getAuthToken: getAuthToken,
94769
94949
  isDark: isDark,
94770
94950
  textColor: messageTextColor,
94771
94951
  fontFamily: messageFontFamily,
@@ -94888,11 +95068,64 @@
94888
95068
  const messageFontFamily = userMessageBubbleFontFamily !== undefined && userMessageBubbleFontFamily !== null ? userMessageBubbleFontFamily : fontFamily !== undefined && fontFamily !== null ? fontFamily : "Inter";
94889
95069
  const messageFontSize = userMessageBubbleFontSize !== undefined && userMessageBubbleFontSize !== null ? userMessageBubbleFontSize : fontSize !== undefined && fontSize !== null ? fontSize : "14px";
94890
95070
  useGoogleFont(messageFontFamily);
95071
+
95072
+ // User attachments (RAG-attach-1) — rendered as small chips above
95073
+ // the text bubble so the reader can see what was uploaded alongside
95074
+ // the message. Image mime types get an inline thumbnail via the SAS
95075
+ // read URL when the backend chose to include it on the send payload;
95076
+ // non-images render a filename chip only. Absent = no chip row.
95077
+ const attachments = Array.isArray(message.attachments) ? message.attachments : [];
94891
95078
  return /*#__PURE__*/jsxRuntimeExports.jsx("div", {
94892
95079
  className: "flex gap-3 flex-row-reverse animate-in",
94893
95080
  children: /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
94894
95081
  className: "flex flex-col items-end max-w-[75%]",
94895
- children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
95082
+ children: [attachments.length > 0 && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
95083
+ className: "mb-1.5 flex flex-wrap justify-end gap-1.5",
95084
+ children: attachments.map((att, idx) => {
95085
+ const isImage = String(att.mimeType || "").startsWith("image/");
95086
+ if (isImage && att.url) {
95087
+ return /*#__PURE__*/jsxRuntimeExports.jsx("a", {
95088
+ href: att.url,
95089
+ target: "_blank",
95090
+ rel: "noopener noreferrer",
95091
+ className: "block rounded-md overflow-hidden",
95092
+ style: {
95093
+ maxWidth: 160
95094
+ },
95095
+ title: att.filename,
95096
+ children: /*#__PURE__*/jsxRuntimeExports.jsx("img", {
95097
+ src: att.url,
95098
+ alt: att.filename || "attachment",
95099
+ style: {
95100
+ maxWidth: 160,
95101
+ maxHeight: 160,
95102
+ display: "block"
95103
+ }
95104
+ })
95105
+ }, att.storageKey || idx);
95106
+ }
95107
+ return /*#__PURE__*/jsxRuntimeExports.jsxs("span", {
95108
+ className: "inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs",
95109
+ style: {
95110
+ backgroundColor: isDark ? "#1f2937" : "#f3f4f6",
95111
+ color: isDark ? "#e5e7eb" : "#374151",
95112
+ border: "1px solid ".concat(isDark ? "#374151" : "#e5e7eb"),
95113
+ maxWidth: 200
95114
+ },
95115
+ title: att.filename,
95116
+ children: [/*#__PURE__*/jsxRuntimeExports.jsx(FileText, {
95117
+ size: 12
95118
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("span", {
95119
+ className: "truncate",
95120
+ style: {
95121
+ maxWidth: 140,
95122
+ direction: "ltr"
95123
+ },
95124
+ children: att.filename
95125
+ })]
95126
+ }, att.storageKey || idx);
95127
+ })
95128
+ }), message.content && message.content.trim() !== "" && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
94896
95129
  className: "rounded-2xl px-4 py-2.5 shadow-lg ".concat(isRtl ? "rounded-tl-sm" : "rounded-tr-sm"),
94897
95130
  dir: "auto",
94898
95131
  style: {
@@ -94945,7 +95178,7 @@
94945
95178
  conciergeName,
94946
95179
  companyName,
94947
95180
  apiBaseUrl,
94948
- organizationId,
95181
+ getAuthToken,
94949
95182
  onPromptSuggestionClick,
94950
95183
  allowFeedback,
94951
95184
  provideCitations,
@@ -94989,7 +95222,7 @@
94989
95222
  conciergeName: conciergeName,
94990
95223
  companyName: companyName,
94991
95224
  apiBaseUrl: apiBaseUrl,
94992
- organizationId: organizationId,
95225
+ getAuthToken: getAuthToken,
94993
95226
  onPromptSuggestionClick: onPromptSuggestionClick,
94994
95227
  allowFeedback: allowFeedback,
94995
95228
  provideCitations: provideCitations,
@@ -95834,7 +96067,7 @@
95834
96067
  conciergeName,
95835
96068
  companyName,
95836
96069
  apiBaseUrl,
95837
- organizationId,
96070
+ getAuthToken,
95838
96071
  onPromptSuggestionClick,
95839
96072
  conversationResetKey,
95840
96073
  allowFeedback,
@@ -96016,7 +96249,7 @@
96016
96249
  conciergeName: conciergeName,
96017
96250
  companyName: companyName,
96018
96251
  apiBaseUrl: apiBaseUrl,
96019
- organizationId: organizationId,
96252
+ getAuthToken: getAuthToken,
96020
96253
  allowFeedback: allowFeedback,
96021
96254
  provideCitations: provideCitations,
96022
96255
  onFeedback: onFeedback,
@@ -96048,7 +96281,7 @@
96048
96281
  conciergeName: conciergeName,
96049
96282
  companyName: companyName,
96050
96283
  apiBaseUrl: apiBaseUrl,
96051
- organizationId: organizationId,
96284
+ getAuthToken: getAuthToken,
96052
96285
  headerTextColor: headerTextColor
96053
96286
  }, "skeleton-waiting");
96054
96287
  }
@@ -96102,6 +96335,343 @@
96102
96335
  });
96103
96336
  };
96104
96337
 
96338
+ function joinUrl(base, path) {
96339
+ const b = String(base || "").replace(/\/+$/, "");
96340
+ const p = path.startsWith("/") ? path : "/".concat(path);
96341
+ return b + p;
96342
+ }
96343
+ function mapBackendCode(code) {
96344
+ switch (code) {
96345
+ case "feature_disabled":
96346
+ case "size_exceeded":
96347
+ case "mime_not_allowed":
96348
+ case "storage_unavailable":
96349
+ return code;
96350
+ default:
96351
+ return "unknown";
96352
+ }
96353
+ }
96354
+ function putWithProgress(_ref) {
96355
+ let {
96356
+ url,
96357
+ file,
96358
+ onProgress,
96359
+ registerXhr
96360
+ } = _ref;
96361
+ return new Promise((resolve, reject) => {
96362
+ const xhr = new XMLHttpRequest();
96363
+ registerXhr(xhr);
96364
+ xhr.open("PUT", url, true);
96365
+ // Required by Azure Blob SAS PUT; harmless on S3 pre-signed URLs.
96366
+ xhr.setRequestHeader("x-ms-blob-type", "BlockBlob");
96367
+ if (file.type) {
96368
+ xhr.setRequestHeader("Content-Type", file.type);
96369
+ }
96370
+ xhr.upload.onprogress = ev => {
96371
+ if (ev.lengthComputable) {
96372
+ onProgress(Math.round(ev.loaded / ev.total * 100));
96373
+ }
96374
+ };
96375
+ xhr.onload = () => {
96376
+ if (xhr.status >= 200 && xhr.status < 300) resolve();else reject(new Error("upload_status_".concat(xhr.status)));
96377
+ };
96378
+ xhr.onerror = () => reject(new Error("network"));
96379
+ xhr.onabort = () => reject({
96380
+ aborted: true
96381
+ });
96382
+ xhr.send(file);
96383
+ });
96384
+ }
96385
+
96386
+ // Node-proxied multipart fallback for NFS-backed deployments (no
96387
+ // direct-PUT endpoint). Resolves with the parsed response body — only
96388
+ // `url` is consumed today (READ SAS URL that knowledge-api's
96389
+ // attachment_ingest fetches bytes from). Malformed / empty JSON
96390
+ // resolves to `{}` — the upload succeeded, the read URL is best-effort.
96391
+ function postMultipartWithProgress(_ref2) {
96392
+ let {
96393
+ url,
96394
+ file,
96395
+ conversationId,
96396
+ authHeader,
96397
+ onProgress,
96398
+ registerXhr
96399
+ } = _ref2;
96400
+ return new Promise((resolve, reject) => {
96401
+ const xhr = new XMLHttpRequest();
96402
+ registerXhr(xhr);
96403
+ xhr.open("POST", url, true);
96404
+ // /multipart is protected by resolveWidgetOrg — the same auth the
96405
+ // presign call used must accompany this POST.
96406
+ if (authHeader) {
96407
+ xhr.setRequestHeader("Authorization", authHeader);
96408
+ }
96409
+ xhr.withCredentials = true;
96410
+ const form = new FormData();
96411
+ // Field names match multer.single('file') and the handler's body
96412
+ // read of `conversationId`. Extra fields are ignored by multer.
96413
+ form.append("conversationId", conversationId);
96414
+ form.append("file", file, file.name);
96415
+ xhr.upload.onprogress = ev => {
96416
+ if (ev.lengthComputable) {
96417
+ onProgress(Math.round(ev.loaded / ev.total * 100));
96418
+ }
96419
+ };
96420
+ xhr.onload = () => {
96421
+ if (xhr.status >= 200 && xhr.status < 300) {
96422
+ try {
96423
+ const parsed = JSON.parse(xhr.responseText);
96424
+ resolve({
96425
+ url: typeof (parsed === null || parsed === void 0 ? void 0 : parsed.url) === "string" ? parsed.url : undefined
96426
+ });
96427
+ } catch (_unused) {
96428
+ resolve({});
96429
+ }
96430
+ } else {
96431
+ reject(new Error("upload_status_".concat(xhr.status)));
96432
+ }
96433
+ };
96434
+ xhr.onerror = () => reject(new Error("network"));
96435
+ xhr.onabort = () => reject({
96436
+ aborted: true
96437
+ });
96438
+ xhr.send(form);
96439
+ });
96440
+ }
96441
+ function useFileUpload(_ref3) {
96442
+ let {
96443
+ orgId,
96444
+ conversationId,
96445
+ config,
96446
+ apiEndpoint,
96447
+ authHeader,
96448
+ onError
96449
+ } = _ref3;
96450
+ const [attachments, setAttachments] = reactExports.useState([]);
96451
+ const inflightRef = reactExports.useRef(new Map());
96452
+ const idCounterRef = reactExports.useRef(0);
96453
+ const attachmentsRef = reactExports.useRef(attachments);
96454
+ attachmentsRef.current = attachments;
96455
+ const nextId = reactExports.useCallback(() => {
96456
+ idCounterRef.current += 1;
96457
+ return "att-".concat(Date.now(), "-").concat(idCounterRef.current);
96458
+ }, []);
96459
+ const patchAttachment = reactExports.useCallback((id, patch) => {
96460
+ setAttachments(prev => prev.map(a => a.id === id ? _objectSpread2(_objectSpread2({}, a), patch) : a));
96461
+ }, []);
96462
+ const errorPatch = reactExports.useCallback((id, code, message) => {
96463
+ const patch = {
96464
+ status: "error",
96465
+ error: {
96466
+ code,
96467
+ message
96468
+ }
96469
+ };
96470
+ setAttachments(prev => {
96471
+ const patched = prev.map(a => a.id === id ? _objectSpread2(_objectSpread2({}, a), patch) : a);
96472
+ const target = patched.find(a => a.id === id);
96473
+ if (target && onError) onError(target);
96474
+ return patched;
96475
+ });
96476
+ }, [onError]);
96477
+ const validateFile = reactExports.useCallback((file, currentCount) => {
96478
+ if (!(config !== null && config !== void 0 && config.fileUploadEnabled)) {
96479
+ return {
96480
+ ok: false,
96481
+ code: "feature_disabled",
96482
+ message: "File uploads are not enabled for this organization."
96483
+ };
96484
+ }
96485
+ if (currentCount >= config.fileUploadMaxFiles) {
96486
+ return {
96487
+ ok: false,
96488
+ code: "too_many_files",
96489
+ message: "Max ".concat(config.fileUploadMaxFiles, " files per message.")
96490
+ };
96491
+ }
96492
+ const maxBytes = config.fileUploadMaxSizeMB * 1024 * 1024;
96493
+ if (file.size > maxBytes) {
96494
+ return {
96495
+ ok: false,
96496
+ code: "size_exceeded",
96497
+ message: "File exceeds the ".concat(config.fileUploadMaxSizeMB, " MB limit.")
96498
+ };
96499
+ }
96500
+ const mime = (file.type || "").toLowerCase();
96501
+ const allowed = new Set((config.fileUploadAllowedMimes || []).map(m => String(m).toLowerCase()));
96502
+ if (allowed.size > 0 && !allowed.has(mime)) {
96503
+ return {
96504
+ ok: false,
96505
+ code: "mime_not_allowed",
96506
+ message: "File type \"".concat(file.type || "unknown", "\" is not allowed.")
96507
+ };
96508
+ }
96509
+ return {
96510
+ ok: true
96511
+ };
96512
+ }, [config]);
96513
+ const doUpload = reactExports.useCallback(async (attachmentId, file) => {
96514
+ // Step A — presign
96515
+ let presignRes;
96516
+ try {
96517
+ presignRes = await fetch(joinUrl(apiEndpoint, "/api/v1/chat-attachments/presign"), {
96518
+ method: "POST",
96519
+ credentials: "include",
96520
+ headers: _objectSpread2({
96521
+ "Content-Type": "application/json"
96522
+ }, authHeader ? {
96523
+ Authorization: authHeader
96524
+ } : {}),
96525
+ body: JSON.stringify({
96526
+ filename: file.name,
96527
+ mimeType: file.type,
96528
+ size: file.size,
96529
+ conversationId
96530
+ })
96531
+ });
96532
+ } catch (err) {
96533
+ errorPatch(attachmentId, "network", "Network error while requesting upload.");
96534
+ return;
96535
+ }
96536
+ if (!presignRes.ok) {
96537
+ let backendMsg = "Upload rejected by the server.";
96538
+ let backendCode = "unknown";
96539
+ try {
96540
+ const body = await presignRes.json();
96541
+ if (body !== null && body !== void 0 && body.error) backendMsg = body.error;
96542
+ if (body !== null && body !== void 0 && body.code) backendCode = mapBackendCode(body.code);
96543
+ } catch (_unused2) {
96544
+ /* body not JSON — keep defaults */
96545
+ }
96546
+ errorPatch(attachmentId, backendCode, backendMsg);
96547
+ return;
96548
+ }
96549
+ let presign;
96550
+ try {
96551
+ presign = await presignRes.json();
96552
+ } catch (_unused3) {
96553
+ errorPatch(attachmentId, "unknown", "Malformed presign response.");
96554
+ return;
96555
+ }
96556
+
96557
+ // Step B — upload bytes. Two paths:
96558
+ // * useMultipart=true → POST FormData to /multipart (NFS + any
96559
+ // backend without a direct-PUT endpoint).
96560
+ // * uploadUrl present → XHR PUT direct to blob storage (Azure/S3).
96561
+ // Multipart response carries a READ SAS URL — knowledge-api's
96562
+ // attachment_ingest needs it to fetch bytes back. Without it,
96563
+ // ingest hits `if not url: skip` and the file is never
96564
+ // extracted into the retrieval union.
96565
+ let uploadedReadUrl;
96566
+ try {
96567
+ if (presign.useMultipart) {
96568
+ const multipartResp = await postMultipartWithProgress({
96569
+ url: joinUrl(apiEndpoint, "/api/v1/chat-attachments/multipart"),
96570
+ file,
96571
+ conversationId,
96572
+ authHeader,
96573
+ onProgress: pct => patchAttachment(attachmentId, {
96574
+ progress: pct
96575
+ }),
96576
+ registerXhr: xhr => inflightRef.current.set(attachmentId, xhr)
96577
+ });
96578
+ uploadedReadUrl = multipartResp.url;
96579
+ } else if (presign.uploadUrl) {
96580
+ await putWithProgress({
96581
+ url: presign.uploadUrl,
96582
+ file,
96583
+ onProgress: pct => patchAttachment(attachmentId, {
96584
+ progress: pct
96585
+ }),
96586
+ registerXhr: xhr => inflightRef.current.set(attachmentId, xhr)
96587
+ });
96588
+ } else {
96589
+ throw new Error("presign_missing_target");
96590
+ }
96591
+ } catch (err) {
96592
+ inflightRef.current.delete(attachmentId);
96593
+ if (err && err.aborted) return;
96594
+ errorPatch(attachmentId, "network", "Upload failed. Please retry.");
96595
+ return;
96596
+ }
96597
+ inflightRef.current.delete(attachmentId);
96598
+ patchAttachment(attachmentId, _objectSpread2({
96599
+ status: "ready",
96600
+ progress: 100,
96601
+ storageKey: presign.storageKey
96602
+ }, uploadedReadUrl ? {
96603
+ url: uploadedReadUrl
96604
+ } : {}));
96605
+ }, [apiEndpoint, authHeader, conversationId, errorPatch, patchAttachment]);
96606
+ const addFiles = reactExports.useCallback(async input => {
96607
+ const files = Array.from(input);
96608
+ for (const file of files) {
96609
+ const currentCount = attachmentsRef.current.filter(a => a.status !== "error").length;
96610
+ const check = validateFile(file, currentCount);
96611
+ const id = nextId();
96612
+ if (!check.ok) {
96613
+ const rejected = {
96614
+ id,
96615
+ filename: file.name,
96616
+ size: file.size,
96617
+ mimeType: file.type,
96618
+ status: "error",
96619
+ error: {
96620
+ code: check.code,
96621
+ message: check.message
96622
+ }
96623
+ };
96624
+ setAttachments(prev => {
96625
+ if (onError) onError(rejected);
96626
+ return [...prev, rejected];
96627
+ });
96628
+ continue;
96629
+ }
96630
+ const entry = {
96631
+ id,
96632
+ filename: file.name,
96633
+ size: file.size,
96634
+ mimeType: file.type,
96635
+ status: "uploading",
96636
+ progress: 0
96637
+ };
96638
+ setAttachments(prev => [...prev, entry]);
96639
+ void doUpload(id, file);
96640
+ }
96641
+ }, [validateFile, doUpload, nextId, onError]);
96642
+ const removeAttachment = reactExports.useCallback(id => {
96643
+ const xhr = inflightRef.current.get(id);
96644
+ if (xhr) {
96645
+ xhr.abort();
96646
+ inflightRef.current.delete(id);
96647
+ }
96648
+ setAttachments(prev => prev.filter(a => a.id !== id));
96649
+ }, []);
96650
+ const clearAll = reactExports.useCallback(() => {
96651
+ for (const xhr of inflightRef.current.values()) xhr.abort();
96652
+ inflightRef.current.clear();
96653
+ setAttachments([]);
96654
+ }, []);
96655
+ const isBusy = reactExports.useMemo(() => attachments.some(a => a.status === "validating" || a.status === "uploading"), [attachments]);
96656
+ const toSendPayload = reactExports.useCallback(() => {
96657
+ return attachments.filter(a => a.status === "ready" && typeof a.storageKey === "string").map(a => ({
96658
+ filename: a.filename,
96659
+ mimeType: a.mimeType,
96660
+ size: a.size,
96661
+ storageKey: a.storageKey,
96662
+ url: a.url
96663
+ }));
96664
+ }, [attachments]);
96665
+ return {
96666
+ attachments,
96667
+ addFiles,
96668
+ removeAttachment,
96669
+ clearAll,
96670
+ isBusy,
96671
+ toSendPayload
96672
+ };
96673
+ }
96674
+
96105
96675
  // Lightweight i18n for the embeddable chat widget.
96106
96676
  // Translations are bundled so the widget stays dependency-free.
96107
96677
  // Locale is resolved from `defaultLanguage` (e.g. "zh", "ar") configured
@@ -96163,7 +96733,18 @@
96163
96733
  copyChat: "Copy Chat",
96164
96734
  startChat: "Start Chat",
96165
96735
  startingVoiceSession: "Starting voice session...",
96166
- allowMicAccess: "Allow microphone access"
96736
+ allowMicAccess: "Allow microphone access",
96737
+ // Onboarding-form validation messages. These are the English fallback for
96738
+ // every locale (translate() falls back to EN[key]); without them the form
96739
+ // rendered the raw key strings ("emailInvalid", etc.). `fieldRequiredSuffix`
96740
+ // is appended after a field label: `${label} ${fieldRequiredSuffix}`.
96741
+ emailRequired: "Please enter your email address",
96742
+ nameRequired: "Please enter your name",
96743
+ phoneRequired: "Please enter your phone number",
96744
+ fieldRequiredSuffix: "is required",
96745
+ emailInvalid: "Please enter a valid email address",
96746
+ nameInvalid: "Please enter a valid name",
96747
+ phoneInvalid: "Please enter a valid phone number"
96167
96748
  };
96168
96749
  const DICTIONARIES = {
96169
96750
  en: EN,
@@ -98102,6 +98683,83 @@
98102
98683
  };
98103
98684
  }
98104
98685
 
98686
+ function formatBytes(bytes) {
98687
+ if (!bytes || bytes < 1024) return "".concat(bytes || 0, " B");
98688
+ const units = ["KB", "MB", "GB"];
98689
+ let val = bytes / 1024;
98690
+ let unit = 0;
98691
+ while (val >= 1024 && unit < units.length - 1) {
98692
+ val /= 1024;
98693
+ unit += 1;
98694
+ }
98695
+ return "".concat(val.toFixed(val >= 10 ? 0 : 1), " ").concat(units[unit]);
98696
+ }
98697
+ function AttachmentChip(_ref) {
98698
+ var _attachment$error;
98699
+ let {
98700
+ attachment,
98701
+ onRemove,
98702
+ isDark
98703
+ } = _ref;
98704
+ const isError = attachment.status === "error";
98705
+ const isUploading = attachment.status === "uploading";
98706
+ const isReady = attachment.status === "ready";
98707
+ const bg = isError ? isDark ? "rgba(239,68,68,0.15)" : "#fee2e2" : isDark ? "#1f2937" : "#f3f4f6";
98708
+ const border = isError ? isDark ? "#b91c1c" : "#fca5a5" : isDark ? "#374151" : "#e5e7eb";
98709
+ const textColor = isError ? isDark ? "#fca5a5" : "#b91c1c" : isDark ? "#e5e7eb" : "#374151";
98710
+ return /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
98711
+ className: "inline-flex items-center gap-2 rounded-full pl-2 pr-1 py-1 text-xs",
98712
+ style: {
98713
+ backgroundColor: bg,
98714
+ border: "1px solid ".concat(border),
98715
+ color: textColor,
98716
+ maxWidth: 240
98717
+ },
98718
+ title: isError ? (_attachment$error = attachment.error) === null || _attachment$error === void 0 ? void 0 : _attachment$error.message : attachment.filename,
98719
+ children: [isError ? /*#__PURE__*/jsxRuntimeExports.jsx(CircleAlert, {
98720
+ size: 12
98721
+ }) : isUploading ? /*#__PURE__*/jsxRuntimeExports.jsx(LoaderCircle, {
98722
+ size: 12,
98723
+ className: "animate-spin"
98724
+ }) : /*#__PURE__*/jsxRuntimeExports.jsx(FileText, {
98725
+ size: 12
98726
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("span", {
98727
+ className: "truncate",
98728
+ style: {
98729
+ maxWidth: 140,
98730
+ direction: "ltr"
98731
+ },
98732
+ children: attachment.filename
98733
+ }), isReady && /*#__PURE__*/jsxRuntimeExports.jsx("span", {
98734
+ className: "opacity-70",
98735
+ style: {
98736
+ fontSize: 10
98737
+ },
98738
+ children: formatBytes(attachment.size)
98739
+ }), isUploading && typeof attachment.progress === "number" && /*#__PURE__*/jsxRuntimeExports.jsxs("span", {
98740
+ className: "opacity-70",
98741
+ style: {
98742
+ fontSize: 10
98743
+ },
98744
+ children: [attachment.progress, "%"]
98745
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
98746
+ type: "button",
98747
+ onClick: () => onRemove(attachment.id),
98748
+ className: "w-4 h-4 rounded-full inline-flex items-center justify-center",
98749
+ style: {
98750
+ backgroundColor: "transparent",
98751
+ border: "none",
98752
+ color: textColor,
98753
+ cursor: "pointer"
98754
+ },
98755
+ "aria-label": "Remove attachment",
98756
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(X, {
98757
+ size: 12
98758
+ })
98759
+ })]
98760
+ });
98761
+ }
98762
+
98105
98763
  var img$1 = "data:image/svg+xml,%3csvg width='219' height='54' xmlns='http://www.w3.org/2000/svg' version='1.0'%3e%3cg class='layer'%3e%3ctitle%3eEshal Logo%3c/title%3e%3cg clip-path='url(%23a)' transform='translate(-.708 -1.076)'%3e%3cg clip-path='url(%23b)'%3e%3cpath d='M21.79 54.75h4.5l3.93-.56 4.49-1.4 3.38-1.97 2.81-2.25 2.24-2.81 2.25-3.93 1.13-3.09v-.85l-3.65-1.12h-.57l-1.96 4.5-1.97 3.09-2.81 2.53-3.93 1.96-3.38.85-2.81.28h-2.81l-4.21-.57-3.94-1.4-2.81-1.97-2.25-2.24-1.96-3.38-1.41-4.21-.56-3.37-.28-3.1v-3.65l.56-5.06 1.12-4.21 1.97-3.94 2.53-2.81 2.25-1.68 2.81-1.41 3.37-.84 2.25-.28H26l4.78.84 4.5 2.25 2.53 2.53 1.4 2.53.56 2.53-.28 3.65-1.12 2.25-1.41 1.69-1.4.55-1.13-4.21-1.68-2.81-1.97-1.97-3.09-1.4-1.12-.28h-5.34l-3.09 1.12-2.25 1.69-1.41 1.97-.84 3.09.28 3.08 1.4 2.82 1.97 1.96 2.81 1.41 2.25.56 4.78.28 3.09-.28.84-.28-1.12 3.09-1.69 1.97-2.25.84h-3.65l-2.81-1.12-1.68-1.41-3.38 2.25.56 1.13 1.13 1.4 2.81 1.69 2.81.84h4.78l2.81-.84 2.53-1.69 1.96-2.25L35 34.8l.84-4.5 3.65-2.24 2.53-2.53 1.69-3.09.56-2.25.28-2.81-.56-3.93-1.12-2.82-2.25-3.09-3.09-2.81-4.22-2.25-4.5-1.12-2.52-.28h-4.5l-3.93.56-4.5 1.41-3.38 1.96-3.37 3.1-2.52 3.65-1.97 4.49-1.13 4.78-.28 2.25v9.27l.84 5.06 1.69 4.78 1.69 3.09 2.25 2.81 2.8 2.53 2.82 1.69 5.06 1.68zm1.12-27.54-2.53-.84-1.4-1.12-.84-1.69.28-2.53 1.12-1.4 2.25-1.13H26l2.81 1.41 1.41 1.97.84 2.8v2.25l-1.12.28zm0 0' fill='black'/%3e%3c/g%3e%3c/g%3e%3cpath d='M82.381 38.435v6.48h-27.06V9.965h26.41v6.5h-18.36v7.57h16.22v6.3h-16.22v8.1zm16.432 7.07c-2.77 0-5.44-.37-8.02-1.11-2.57-.75-4.65-1.72-6.22-2.92l2.75-6.09c1.5 1.09 3.28 1.98 5.34 2.64 2.07.67 4.13 1 6.19 1q3.45 0 5.1-1.02t1.65-2.73c0-.83-.33-1.52-.98-2.06-.65-.55-1.48-1-2.5-1.33-1.01-.33-2.39-.7-4.11-1.1-2.67-.63-4.85-1.26-6.55-1.89s-3.15-1.64-4.37-3.04c-1.21-1.41-1.82-3.27-1.82-5.6 0-2.03.55-3.86 1.64-5.51 1.11-1.66 2.76-2.96 4.97-3.92 2.22-.97 4.93-1.46 8.13-1.46 2.22 0 4.4.27 6.53.8s4 1.3 5.59 2.3l-2.5 6.14c-3.23-1.82-6.45-2.74-9.67-2.74-2.27 0-3.95.37-5.03 1.1-1.07.73-1.61 1.69-1.61 2.89q0 1.8 1.86 2.67c1.25.59 3.16 1.16 5.72 1.72 2.66.63 4.85 1.27 6.55 1.9 1.69.63 3.14 1.63 4.36 2.99 1.21 1.37 1.82 3.21 1.82 5.55 0 2-.56 3.82-1.67 5.46q-1.68 2.475-5.01 3.93c-2.23.95-4.95 1.43-8.14 1.43m50.913-35.54v34.95h-8.08v-14.33h-15.88v14.33h-8.09V9.965h8.09v13.78h15.88V9.965zm29.811 27.47h-16.22l-3.1 7.48h-8.29l15.58-34.95h7.98l15.62 34.95h-8.48zm-2.55-6.15-5.55-13.37-5.53 13.37zm16.274-21.32h8.09v28.36h17.52v6.59h-25.61zm0 0' fill='black'/%3e%3c/g%3e%3c/svg%3e";
98106
98764
 
98107
98765
  var img = "data:image/svg+xml,%3csvg width='219' height='54' xmlns='http://www.w3.org/2000/svg' version='1.0'%3e%3cg class='layer'%3e%3ctitle%3eEshal Logo%3c/title%3e%3cg clip-path='url(%23a)' transform='translate(-.708 -1.076)'%3e%3cg clip-path='url(%23b)'%3e%3cpath d='M21.79 54.75h4.5l3.93-.56 4.49-1.4 3.38-1.97 2.81-2.25 2.24-2.81 2.25-3.93 1.13-3.09v-.85l-3.65-1.12h-.57l-1.96 4.5-1.97 3.09-2.81 2.53-3.93 1.96-3.38.85-2.81.28h-2.81l-4.21-.57-3.94-1.4-2.81-1.97-2.25-2.24-1.96-3.38-1.41-4.21-.56-3.37-.28-3.1v-3.65l.56-5.06 1.12-4.21 1.97-3.94 2.53-2.81 2.25-1.68 2.81-1.41 3.37-.84 2.25-.28H26l4.78.84 4.5 2.25 2.53 2.53 1.4 2.53.56 2.53-.28 3.65-1.12 2.25-1.41 1.69-1.4.55-1.13-4.21-1.68-2.81-1.97-1.97-3.09-1.4-1.12-.28h-5.34l-3.09 1.12-2.25 1.69-1.41 1.97-.84 3.09.28 3.08 1.4 2.82 1.97 1.96 2.81 1.41 2.25.56 4.78.28 3.09-.28.84-.28-1.12 3.09-1.69 1.97-2.25.84h-3.65l-2.81-1.12-1.68-1.41-3.38 2.25.56 1.13 1.13 1.4 2.81 1.69 2.81.84h4.78l2.81-.84 2.53-1.69 1.96-2.25L35 34.8l.84-4.5 3.65-2.24 2.53-2.53 1.69-3.09.56-2.25.28-2.81-.56-3.93-1.12-2.82-2.25-3.09-3.09-2.81-4.22-2.25-4.5-1.12-2.52-.28h-4.5l-3.93.56-4.5 1.41-3.38 1.96-3.37 3.1-2.52 3.65-1.97 4.49-1.13 4.78-.28 2.25v9.27l.84 5.06 1.69 4.78 1.69 3.09 2.25 2.81 2.8 2.53 2.82 1.69 5.06 1.68zm1.12-27.54-2.53-.84-1.4-1.12-.84-1.69.28-2.53 1.12-1.4 2.25-1.13H26l2.81 1.41 1.41 1.97.84 2.8v2.25l-1.12.28zm0 0' fill='white'/%3e%3c/g%3e%3c/g%3e%3cpath d='M82.381 38.435v6.48h-27.06V9.965h26.41v6.5h-18.36v7.57h16.22v6.3h-16.22v8.1zm16.432 7.07c-2.77 0-5.44-.37-8.02-1.11-2.57-.75-4.65-1.72-6.22-2.92l2.75-6.09c1.5 1.09 3.28 1.98 5.34 2.64 2.07.67 4.13 1 6.19 1q3.45 0 5.1-1.02t1.65-2.73c0-.83-.33-1.52-.98-2.06-.65-.55-1.48-1-2.5-1.33-1.01-.33-2.39-.7-4.11-1.1-2.67-.63-4.85-1.26-6.55-1.89s-3.15-1.64-4.37-3.04c-1.21-1.41-1.82-3.27-1.82-5.6 0-2.03.55-3.86 1.64-5.51 1.11-1.66 2.76-2.96 4.97-3.92 2.22-.97 4.93-1.46 8.13-1.46 2.22 0 4.4.27 6.53.8s4 1.3 5.59 2.3l-2.5 6.14c-3.23-1.82-6.45-2.74-9.67-2.74-2.27 0-3.95.37-5.03 1.1-1.07.73-1.61 1.69-1.61 2.89q0 1.8 1.86 2.67c1.25.59 3.16 1.16 5.72 1.72 2.66.63 4.85 1.27 6.55 1.9 1.69.63 3.14 1.63 4.36 2.99 1.21 1.37 1.82 3.21 1.82 5.55 0 2-.56 3.82-1.67 5.46q-1.68 2.475-5.01 3.93c-2.23.95-4.95 1.43-8.14 1.43m50.913-35.54v34.95h-8.08v-14.33h-15.88v14.33h-8.09V9.965h8.09v13.78h15.88V9.965zm29.811 27.47h-16.22l-3.1 7.48h-8.29l15.58-34.95h7.98l15.62 34.95h-8.48zm-2.55-6.15-5.55-13.37-5.53 13.37zm16.274-21.32h8.09v28.36h17.52v6.59h-25.61zm0 0' fill='white'/%3e%3c/g%3e%3c/svg%3e";
@@ -98266,12 +98924,52 @@
98266
98924
  tagSelectorNode = null,
98267
98925
  showResolveButton = false,
98268
98926
  onResolve,
98269
- defaultLanguage = "en"
98927
+ defaultLanguage = "en",
98928
+ // ─── Attachments (RAG-attach-1) ────────────────────────────────
98929
+ // When the operator enables chatFeatures.fileUploadEnabled, these
98930
+ // three props power the paperclip button + chip stack. Off by
98931
+ // default so a widget with no config still renders exactly as
98932
+ // before (paperclip hidden, no extra network calls).
98933
+ chatFeatures,
98934
+ apiEndpoint,
98935
+ organizationId,
98936
+ conversationId
98270
98937
  } = _ref2;
98271
98938
  const t = reactExports.useMemo(() => createTranslator(defaultLanguage), [defaultLanguage]);
98272
98939
  const poweredByParts = reactExports.useMemo(() => getPoweredByParts(defaultLanguage), [defaultLanguage]);
98273
98940
  const [isFocused, setIsFocused] = reactExports.useState(false);
98274
98941
  const [showTooltip, setShowTooltip] = reactExports.useState(false);
98942
+
98943
+ // ─── Attachments hook ────────────────────────────────────────────
98944
+ // Reads the effective operator policy (already clamped server-side)
98945
+ // out of chatFeatures. Absent config = feature off → paperclip
98946
+ // hidden → hook never fires a network request.
98947
+ const uploadConfig = reactExports.useMemo(() => {
98948
+ var _chatFeatures$fileUpl, _chatFeatures$fileUpl2, _chatFeatures$fileUpl3, _chatFeatures$fileUpl4;
98949
+ return {
98950
+ fileUploadEnabled: (_chatFeatures$fileUpl = chatFeatures === null || chatFeatures === void 0 ? void 0 : chatFeatures.fileUploadEnabled) !== null && _chatFeatures$fileUpl !== void 0 ? _chatFeatures$fileUpl : false,
98951
+ fileUploadMaxSizeMB: (_chatFeatures$fileUpl2 = chatFeatures === null || chatFeatures === void 0 ? void 0 : chatFeatures.fileUploadMaxSizeMB) !== null && _chatFeatures$fileUpl2 !== void 0 ? _chatFeatures$fileUpl2 : 10,
98952
+ fileUploadMaxFiles: (_chatFeatures$fileUpl3 = chatFeatures === null || chatFeatures === void 0 ? void 0 : chatFeatures.fileUploadMaxFiles) !== null && _chatFeatures$fileUpl3 !== void 0 ? _chatFeatures$fileUpl3 : 3,
98953
+ fileUploadAllowedMimes: (_chatFeatures$fileUpl4 = chatFeatures === null || chatFeatures === void 0 ? void 0 : chatFeatures.fileUploadAllowedMimes) !== null && _chatFeatures$fileUpl4 !== void 0 ? _chatFeatures$fileUpl4 : []
98954
+ };
98955
+ }, [chatFeatures]);
98956
+ const {
98957
+ attachments,
98958
+ addFiles,
98959
+ removeAttachment,
98960
+ clearAll,
98961
+ isBusy: isUploadBusy,
98962
+ toSendPayload
98963
+ } = useFileUpload({
98964
+ orgId: organizationId,
98965
+ conversationId,
98966
+ config: uploadConfig,
98967
+ apiEndpoint,
98968
+ authHeader: undefined
98969
+ });
98970
+ const fileInputRef = reactExports.useRef(null);
98971
+ const showPaperclip = !!uploadConfig.fileUploadEnabled && !!apiEndpoint;
98972
+ const acceptAttr = reactExports.useMemo(() => uploadConfig.fileUploadAllowedMimes.length > 0 ? uploadConfig.fileUploadAllowedMimes.join(",") : undefined, [uploadConfig.fileUploadAllowedMimes]);
98275
98973
  const [tooltipPosition, setTooltipPosition] = reactExports.useState({
98276
98974
  top: 0,
98277
98975
  left: 0,
@@ -98306,20 +99004,38 @@
98306
99004
  textarea.style.height = "".concat(newHeight, "px");
98307
99005
  }
98308
99006
  }, [inputValue]);
99007
+
99008
+ // Send handler with attachment splicing. When chatFeatures is off,
99009
+ // toSendPayload() returns [] and onSend is called with a single
99010
+ // argument (matches the pre-attachments contract exactly).
99011
+ const sendWithAttachments = reactExports.useCallback(() => {
99012
+ const committed = toSendPayload();
99013
+ if (committed.length > 0) {
99014
+ onSend(undefined, committed);
99015
+ clearAll();
99016
+ } else {
99017
+ onSend();
99018
+ }
99019
+ }, [toSendPayload, clearAll, onSend]);
98309
99020
  const handleKeyPress = event => {
98310
99021
  if (event.key === "Enter" && !event.shiftKey) {
98311
99022
  event.preventDefault();
98312
99023
  if (isVoiceSessionActive && onBidiSubmit) {
98313
99024
  onBidiSubmit();
98314
99025
  } else {
98315
- onSend();
99026
+ sendWithAttachments();
98316
99027
  }
98317
99028
  }
98318
99029
  };
98319
99030
  const handleChange = event => {
98320
99031
  setInputValue(event.target.value);
98321
99032
  };
98322
- const isDisabled = !inputValue.trim() || isLoading || isConversationLoading;
99033
+
99034
+ // Send is enabled if there's text OR at least one ready attachment
99035
+ // (so a user can upload a file and hit Send without typing). When
99036
+ // uploads are in flight we block Send to prevent partial payloads.
99037
+ const hasReadyAttachment = attachments.some(a => a.status === "ready");
99038
+ const isDisabled = !inputValue.trim() && !hasReadyAttachment || isLoading || isConversationLoading || isUploadBusy;
98323
99039
  const separatorColor = isDark ? "#374151" : "#e5e7eb";
98324
99040
 
98325
99041
  // Check if onboarding flow exists and is not completed
@@ -98482,6 +99198,13 @@
98482
99198
  height: "1px",
98483
99199
  backgroundColor: separatorColor
98484
99200
  }
99201
+ }), showPaperclip && attachments.length > 0 && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
99202
+ className: "px-5 mb-2 flex flex-wrap gap-1.5",
99203
+ children: attachments.map(att => /*#__PURE__*/jsxRuntimeExports.jsx(AttachmentChip, {
99204
+ attachment: att,
99205
+ onRemove: removeAttachment,
99206
+ isDark: isDark
99207
+ }, att.id))
98485
99208
  }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
98486
99209
  className: "flex items-center px-5 gap-1.5",
98487
99210
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
@@ -98615,8 +99338,39 @@
98615
99338
  })]
98616
99339
  })]
98617
99340
  }), document.body)]
99341
+ }), showPaperclip && /*#__PURE__*/jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
99342
+ children: [/*#__PURE__*/jsxRuntimeExports.jsx("input", {
99343
+ ref: fileInputRef,
99344
+ type: "file",
99345
+ multiple: true,
99346
+ accept: acceptAttr,
99347
+ className: "hidden",
99348
+ style: {
99349
+ display: "none"
99350
+ },
99351
+ onChange: e => {
99352
+ const files = e.target.files;
99353
+ if (files && files.length) void addFiles(files);
99354
+ // Reset so re-selecting the same file after removal
99355
+ // still fires the change event.
99356
+ e.currentTarget.value = "";
99357
+ }
99358
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
99359
+ type: "button",
99360
+ onClick: () => fileInputRef.current && fileInputRef.current.click(),
99361
+ disabled: csatVisible || isConversationLoading || isLoading,
99362
+ "aria-label": "Attach file",
99363
+ title: "Attach file",
99364
+ className: "h-10 w-10 rounded-xl flex items-center justify-center transition-all duration-200 ".concat(isDark ? "bg-gray-800 text-gray-200 hover:bg-gray-700" : "bg-white text-gray-600 hover:bg-gray-100", " disabled:opacity-40 disabled:cursor-not-allowed"),
99365
+ style: {
99366
+ border: "none"
99367
+ },
99368
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(Paperclip, {
99369
+ className: "w-4 h-4"
99370
+ })
99371
+ })]
98618
99372
  }), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
98619
- onClick: isVoiceSessionActive && onBidiSubmit ? onBidiSubmit : onSend,
99373
+ onClick: isVoiceSessionActive && onBidiSubmit ? onBidiSubmit : sendWithAttachments,
98620
99374
  disabled: csatVisible || isDisabled || isVoiceSessionActive && voiceStatus !== "connected",
98621
99375
  className: "h-10 w-10 rounded-xl transition-all duration-200 flex items-center justify-center shadow-md disabled:opacity-40 disabled:cursor-not-allowed disabled:shadow-none ".concat(inputValue.trim() ? "scale-100" : "scale-95"),
98622
99376
  style: {
@@ -99552,7 +100306,7 @@
99552
100306
  showPoweredBy = true,
99553
100307
  apiBaseUrl,
99554
100308
  apiKey,
99555
- organizationId,
100309
+ getAuthToken,
99556
100310
  conversationId,
99557
100311
  conciergeId,
99558
100312
  onboardingQuestions = [],
@@ -99586,7 +100340,12 @@
99586
100340
  // Used by the category picker to acknowledge a selection with a
99587
100341
  // localized "topics under X" message in the initial state.
99588
100342
  onSynthesizeAssistantMessage,
99589
- launcherPosition = "bottom-right"
100343
+ launcherPosition = "bottom-right",
100344
+ // File attachments (RAG-attach-1) — chatFeatures is the effective
100345
+ // operator config already clamped server-side. When absent or
100346
+ // fileUploadEnabled=false the paperclip stays hidden.
100347
+ chatFeatures,
100348
+ organizationId
99590
100349
  } = _ref;
99591
100350
  useGoogleFont(fontFamily);
99592
100351
  const messagesContainerRef = reactExports.useRef(null);
@@ -99700,7 +100459,7 @@
99700
100459
  setCsatSubmitted(submitted);
99701
100460
  if (submitted) setShowCsat(false);
99702
100461
  } catch (_unused4) {}
99703
- }, [conversationId, organizationId]);
100462
+ }, [conversationId]);
99704
100463
 
99705
100464
  // Auto-scroll hook
99706
100465
  useAutoScroll(messagesContainerRef, [messages, isLoading], {
@@ -99838,14 +100597,15 @@
99838
100597
  const handleCsatRating = async (rating, format) => {
99839
100598
  setCsatSubmitted(true); // optimistic UI
99840
100599
  setShowCsat(false);
99841
- markCsatSubmitted(organizationId); // persist so page refresh doesn't re-show CSAT
100600
+ markCsatSubmitted(undefined); // persist so page refresh doesn't re-show CSAT
99842
100601
 
99843
100602
  try {
99844
100603
  const headers = {
99845
100604
  "Content-Type": "application/json"
99846
100605
  };
99847
- if (organizationId) {
99848
- headers["x-eshal-org"] = organizationId;
100606
+ if (typeof getAuthToken === 'function') {
100607
+ const token = await getAuthToken();
100608
+ if (token) headers['Authorization'] = "Bearer ".concat(token);
99849
100609
  }
99850
100610
  const response = await fetch("".concat(apiBaseUrl.replace(/\/$/, ""), "/api/v1/support/csat"), {
99851
100611
  method: "POST",
@@ -99855,7 +100615,6 @@
99855
100615
  conversationId,
99856
100616
  rating,
99857
100617
  ratingFormat: format,
99858
- organizationId,
99859
100618
  conciergeId
99860
100619
  })
99861
100620
  });
@@ -99879,8 +100638,9 @@
99879
100638
  const headers = {
99880
100639
  "Content-Type": "application/json"
99881
100640
  };
99882
- if (organizationId) {
99883
- headers["x-eshal-org"] = organizationId;
100641
+ if (typeof getAuthToken === 'function') {
100642
+ const token = await getAuthToken();
100643
+ if (token) headers['Authorization'] = "Bearer ".concat(token);
99884
100644
  }
99885
100645
  const ratingFormat = normalizeCsatFormat(csatFormat);
99886
100646
  const response = await fetch("".concat(apiBaseUrl.replace(/\/$/, ""), "/api/v1/support/csat"), {
@@ -99891,7 +100651,6 @@
99891
100651
  conversationId,
99892
100652
  rating: String(resolveRating),
99893
100653
  ratingFormat,
99894
- organizationId,
99895
100654
  conciergeId,
99896
100655
  feedback: resolveFeedbackText || undefined
99897
100656
  })
@@ -99925,7 +100684,7 @@
99925
100684
  } finally {
99926
100685
  setIsSubmittingResolve(false);
99927
100686
  }
99928
- }, [isCsatEnabled, isSubmittingResolve, isConversationResolved, resolveRating, resolveFeedbackText, conversationId, organizationId, conciergeId, apiBaseUrl, csatFormat, onResetConversation, onRefreshChat, onWidgetFilterChange]);
100687
+ }, [isCsatEnabled, isSubmittingResolve, isConversationResolved, resolveRating, resolveFeedbackText, conversationId, getAuthToken, conciergeId, apiBaseUrl, csatFormat, onResetConversation, onRefreshChat, onWidgetFilterChange]);
99929
100688
 
99930
100689
  // Handle X button: first click shows form, second click closes
99931
100690
  const handleCloseClick = reactExports.useCallback(() => {
@@ -100263,7 +101022,7 @@
100263
101022
  conciergeName: conciergeName,
100264
101023
  companyName: companyName,
100265
101024
  apiBaseUrl: apiBaseUrl,
100266
- organizationId: organizationId,
101025
+ getAuthToken: getAuthToken,
100267
101026
  conversationResetKey: conversationId,
100268
101027
  allowFeedback: allowFeedback,
100269
101028
  provideCitations: provideCitations,
@@ -100338,6 +101097,14 @@
100338
101097
  if (!isCsatEnabled) return;
100339
101098
  setShowResolveForm(true);
100340
101099
  }
101100
+ // Attachments (RAG-attach-1) — paperclip stays hidden
101101
+ // unless the operator explicitly opted in via
101102
+ // MasterAgent.config.chatFeatures.
101103
+ ,
101104
+ chatFeatures: chatFeatures,
101105
+ apiEndpoint: apiBaseUrl,
101106
+ organizationId: organizationId,
101107
+ conversationId: conversationId
100341
101108
  })]
100342
101109
  })]
100343
101110
  })]
@@ -100348,7 +101115,7 @@
100348
101115
 
100349
101116
  /**
100350
101117
  * @param {string|undefined|null} apiBaseUrl
100351
- * @param {string|undefined|null} orgId
101118
+ * @param {Function|undefined|null} getAuthToken - async fn returning a Bearer token (in-app JWT path), or undefined/null (Mode B proxy)
100352
101119
  * @returns {{
100353
101120
  * categories: Array<{id:string,label:string,count:number,tags:string[]}>,
100354
101121
  * loading: boolean,
@@ -100356,14 +101123,15 @@
100356
101123
  * hasFilters: boolean,
100357
101124
  * }}
100358
101125
  */
100359
- function useFilterCatalog(apiBaseUrl, orgId) {
101126
+ function useFilterCatalog(apiBaseUrl, getAuthToken) {
101127
+ const hasAuth = !!apiBaseUrl;
100360
101128
  const [state, setState] = reactExports.useState({
100361
101129
  categories: [],
100362
- loading: !!(apiBaseUrl && orgId),
101130
+ loading: hasAuth,
100363
101131
  error: null
100364
101132
  });
100365
101133
  reactExports.useEffect(() => {
100366
- if (!apiBaseUrl || !orgId) {
101134
+ if (!apiBaseUrl) {
100367
101135
  setState({
100368
101136
  categories: [],
100369
101137
  loading: false,
@@ -100371,8 +101139,8 @@
100371
101139
  });
100372
101140
  return;
100373
101141
  }
100374
- const key = "".concat(apiBaseUrl, "|").concat(orgId);
100375
- const cached = _PROCESS_CACHE.get(key);
101142
+ const cacheKey = getAuthToken ? "".concat(apiBaseUrl, "|__session__") : "".concat(apiBaseUrl, "|__proxy__");
101143
+ const cached = _PROCESS_CACHE.get(cacheKey);
100376
101144
  if (cached) {
100377
101145
  setState({
100378
101146
  categories: cached,
@@ -100386,43 +101154,55 @@
100386
101154
  loading: true,
100387
101155
  error: null
100388
101156
  }));
100389
- const url = "".concat(apiBaseUrl.replace(/\/$/, ""), "/api/v1/widget/filters/").concat(encodeURIComponent(orgId));
100390
- fetch(url, {
100391
- method: "GET",
100392
- headers: {
100393
- Accept: "application/json"
100394
- }
100395
- }).then(async res => {
100396
- if (!res.ok) {
100397
- throw new Error("filter catalog HTTP ".concat(res.status));
101157
+ const base = apiBaseUrl.replace(/\/$/, "");
101158
+ const url = "".concat(base, "/api/v1/widget/filters");
101159
+ (async () => {
101160
+ try {
101161
+ const headers = {
101162
+ Accept: "application/json"
101163
+ };
101164
+ // In-app JWT path: set Authorization header
101165
+ // Mode B proxy: no auth header; proxy handles org resolution
101166
+ if (typeof getAuthToken === 'function') {
101167
+ const token = await getAuthToken();
101168
+ if (token) {
101169
+ headers['Authorization'] = "Bearer ".concat(token);
101170
+ }
101171
+ }
101172
+ const res = await fetch(url, {
101173
+ method: "GET",
101174
+ headers
101175
+ });
101176
+ if (!res.ok) {
101177
+ throw new Error("filter catalog HTTP ".concat(res.status));
101178
+ }
101179
+ const body = await res.json();
101180
+ const categories = Array.isArray(body === null || body === void 0 ? void 0 : body.categories) ? body.categories : [];
101181
+ if (cancelled) return;
101182
+ _PROCESS_CACHE.set(cacheKey, categories);
101183
+ setState({
101184
+ categories,
101185
+ loading: false,
101186
+ error: null
101187
+ });
101188
+ } catch (err) {
101189
+ if (cancelled) return;
101190
+ // Fail-soft: log and present empty so the UI hides itself.
101191
+ // We do NOT bubble the error to the caller because chat
101192
+ // should keep working even if the catalog is unreachable.
101193
+ // eslint-disable-next-line no-console
101194
+ console.warn("[useFilterCatalog] catalog fetch failed:", err);
101195
+ setState({
101196
+ categories: [],
101197
+ loading: false,
101198
+ error: err
101199
+ });
100398
101200
  }
100399
- const body = await res.json();
100400
- return Array.isArray(body === null || body === void 0 ? void 0 : body.categories) ? body.categories : [];
100401
- }).then(categories => {
100402
- if (cancelled) return;
100403
- _PROCESS_CACHE.set(key, categories);
100404
- setState({
100405
- categories,
100406
- loading: false,
100407
- error: null
100408
- });
100409
- }).catch(err => {
100410
- if (cancelled) return;
100411
- // Fail-soft: log and present empty so the UI hides itself.
100412
- // We do NOT bubble the error to the caller because chat
100413
- // should keep working even if the catalog is unreachable.
100414
- // eslint-disable-next-line no-console
100415
- console.warn("[useFilterCatalog] catalog fetch failed:", err);
100416
- setState({
100417
- categories: [],
100418
- loading: false,
100419
- error: err
100420
- });
100421
- });
101201
+ })();
100422
101202
  return () => {
100423
101203
  cancelled = true;
100424
101204
  };
100425
- }, [apiBaseUrl, orgId]);
101205
+ }, [apiBaseUrl, getAuthToken]);
100426
101206
  const hasFilters = reactExports.useMemo(() => Array.isArray(state.categories) && state.categories.length > 0, [state.categories]);
100427
101207
  return _objectSpread2(_objectSpread2({}, state), {}, {
100428
101208
  hasFilters
@@ -100501,20 +101281,31 @@
100501
101281
  /**
100502
101282
  * Fetches agent configuration from the deploy-agent endpoint
100503
101283
  * @param {string} apiBaseUrl - Base URL for the API
100504
- * @param {string} orgId - Organization ID
101284
+ * @param {Function|undefined} getAuthToken - async fn returning a Bearer token (in-app JWT path), or undefined (Mode B proxy)
100505
101285
  * @returns {Promise<object>} Agent configuration object
100506
101286
  */
100507
- const fetchAgentConfig = async (apiBaseUrl, orgId) => {
100508
- if (!apiBaseUrl || !orgId) {
100509
- throw new Error("apiBaseUrl and orgId are required");
101287
+ const fetchAgentConfig = async (apiBaseUrl, getAuthToken) => {
101288
+ if (!apiBaseUrl) {
101289
+ throw new Error("apiBaseUrl is required");
100510
101290
  }
100511
101291
  try {
100512
- const url = "".concat(apiBaseUrl.replace(/\/$/, ''), "/api/v1/deploy-agent/").concat(orgId);
101292
+ const base = apiBaseUrl.replace(/\/$/, '');
101293
+ const url = "".concat(base, "/api/v1/deploy-agent");
101294
+ const headers = {
101295
+ "Content-Type": "application/json"
101296
+ };
101297
+
101298
+ // In-app JWT path: set Authorization header
101299
+ // Mode B proxy: no auth header; proxy handles org resolution
101300
+ if (typeof getAuthToken === 'function') {
101301
+ const token = await getAuthToken();
101302
+ if (token) {
101303
+ headers['Authorization'] = "Bearer ".concat(token);
101304
+ }
101305
+ }
100513
101306
  const response = await fetch(url, {
100514
101307
  method: "GET",
100515
- headers: {
100516
- "Content-Type": "application/json"
100517
- },
101308
+ headers,
100518
101309
  credentials: "include"
100519
101310
  });
100520
101311
  if (!response.ok) {
@@ -100531,8 +101322,10 @@
100531
101322
  const ChatWidget = _ref => {
100532
101323
  var _agentConfig$concierg;
100533
101324
  let {
100534
- // Required props for dynamic config
100535
- orgId,
101325
+ /**
101326
+ * @param {Function|undefined} getAuthToken - async fn returning a Keycloak Bearer token (in-app JWT path)
101327
+ */
101328
+ getAuthToken,
100536
101329
  apiBaseUrl,
100537
101330
  // Optional override props (will override fetched config if provided)
100538
101331
  darkMode,
@@ -100574,7 +101367,8 @@
100574
101367
  onboardingQuestions,
100575
101368
  collectionPrompt,
100576
101369
  allowedDomains,
100577
- onboardingEnabled
101370
+ onboardingEnabled,
101371
+ wsBaseUrl
100578
101372
  } = _ref;
100579
101373
  const [agentConfig, setAgentConfig] = reactExports.useState(null);
100580
101374
  const [isLoadingConfig, setIsLoadingConfig] = reactExports.useState(true);
@@ -100583,14 +101377,14 @@
100583
101377
  // Fetch agent configuration on mount
100584
101378
  reactExports.useEffect(() => {
100585
101379
  const loadAgentConfig = async () => {
100586
- if (!orgId || !apiBaseUrl) {
100587
- setConfigError("orgId and apiBaseUrl are required");
101380
+ if (!apiBaseUrl) {
101381
+ setConfigError("apiBaseUrl is required");
100588
101382
  setIsLoadingConfig(false);
100589
101383
  return;
100590
101384
  }
100591
101385
  try {
100592
101386
  setIsLoadingConfig(true);
100593
- const config = await fetchAgentConfig(apiBaseUrl, orgId);
101387
+ const config = await fetchAgentConfig(apiBaseUrl, getAuthToken);
100594
101388
  setAgentConfig(config);
100595
101389
  setConfigError(null);
100596
101390
  } catch (error) {
@@ -100601,11 +101395,11 @@
100601
101395
  }
100602
101396
  };
100603
101397
  loadAgentConfig();
100604
- }, [orgId, apiBaseUrl]);
101398
+ }, [apiBaseUrl, getAuthToken]);
100605
101399
 
100606
101400
  // Map API response to widget props (use props as overrides if provided)
100607
101401
  const widgetConfig = reactExports.useMemo(() => {
100608
- var _agentConfig$config, _cfg$identity, _cfg$branding, _cfg$typography, _cfg$messages, _cfg$voice, _cfg$onboarding, _cfg$disclaimer, _cfg$csat, _cfg$inactivity, _cfg$behavior, _cfg$security, _cfg$layout, _ref2, _messages$bundles$loc, _messages$bundles, _messages$bundles$en, _messages$bundles2, _ref3, _ref4, _ref5, _ref6, _branding$chatbotAvat, _branding$chatbotAvat2, _ref7, _ref8, _ref9, _ref0, _ref1, _ref10, _ref11, _ref12, _typography$headerTex, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _inactivity$timeoutVa, _inactivity$timeoutUn, _ref19, _ref20, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26, _csat$enabled, _csat$format, _csat$prompt, _csat$triggerType, _csat$idleTimeoutMins, _csat$followUpEnabled, _csat$followUpPrompt, _behavior$autoPromptE, _behavior$allowFeedba, _behavior$provideCita;
101402
+ var _agentConfig$config, _cfg$identity, _cfg$branding, _cfg$typography, _cfg$messages, _cfg$voice, _cfg$onboarding, _cfg$disclaimer, _cfg$csat, _cfg$inactivity, _cfg$behavior, _cfg$security, _cfg$layout, _ref2, _messages$bundles$loc, _messages$bundles, _messages$bundles$en, _messages$bundles2, _ref3, _ref4, _ref5, _ref6, _branding$chatbotAvat, _branding$chatbotAvat2, _ref7, _ref8, _ref9, _ref0, _ref1, _ref10, _ref11, _ref12, _typography$headerTex, _ref13, _ref14, _ref15, _ref16, _ref17, _ref18, _inactivity$timeoutVa, _inactivity$timeoutUn, _ref19, _ref20, _ref21, _ref22, _ref23, _ref24, _ref25, _ref26, _csat$enabled, _csat$format, _csat$prompt, _csat$triggerType, _csat$idleTimeoutMins, _csat$followUpEnabled, _csat$followUpPrompt, _behavior$autoPromptE, _behavior$allowFeedba, _behavior$provideCita, _agentConfig$organiza, _cfg$chatFeatures;
100609
101403
  if (!agentConfig) {
100610
101404
  return null;
100611
101405
  }
@@ -100664,7 +101458,6 @@
100664
101458
  fontFamily: (_ref1 = fontFamily !== null && fontFamily !== void 0 ? fontFamily : typography.agentMessageBubbleFontFamily) !== null && _ref1 !== void 0 ? _ref1 : "Inter",
100665
101459
  fontSize: (_ref10 = fontSize !== null && fontSize !== void 0 ? fontSize : typography.agentMessageBubbleFontSize) !== null && _ref10 !== void 0 ? _ref10 : "14px",
100666
101460
  defaultLanguage: locale,
100667
- organizationId: orgId,
100668
101461
  headerTextBold: (_ref11 = headerTextBold !== null && headerTextBold !== void 0 ? headerTextBold : typography.headerTextBold) !== null && _ref11 !== void 0 ? _ref11 : false,
100669
101462
  headerTextItalic: (_ref12 = headerTextItalic !== null && headerTextItalic !== void 0 ? headerTextItalic : typography.headerTextItalic) !== null && _ref12 !== void 0 ? _ref12 : false,
100670
101463
  headerTextColor: (_typography$headerTex = typography.headerTextColor) !== null && _typography$headerTex !== void 0 ? _typography$headerTex : "#FFFFFF",
@@ -100701,9 +101494,16 @@
100701
101494
  // every message and tell the backend to skip citation generation.
100702
101495
  // Defaults to true so agents that haven't set the field keep showing
100703
101496
  // citations (matches the testing-lab / chatbot-preview default).
100704
- provideCitations: (_behavior$provideCita = behavior.provideCitations) !== null && _behavior$provideCita !== void 0 ? _behavior$provideCita : true
101497
+ provideCitations: (_behavior$provideCita = behavior.provideCitations) !== null && _behavior$provideCita !== void 0 ? _behavior$provideCita : true,
101498
+ // organizationId from the backend response — used internally for
101499
+ // session isolation (localStorage keys) and WS paths. Not a user prop.
101500
+ organizationId: (_agentConfig$organiza = agentConfig.organizationId) !== null && _agentConfig$organiza !== void 0 ? _agentConfig$organiza : null,
101501
+ // Chat features (RAG-attach-1) — surfaces the operator's
101502
+ // file-upload toggle to the input row. Absent config = feature
101503
+ // off → paperclip hidden.
101504
+ chatFeatures: (_cfg$chatFeatures = cfg.chatFeatures) !== null && _cfg$chatFeatures !== void 0 ? _cfg$chatFeatures : null
100705
101505
  };
100706
- }, [agentConfig, darkMode, primaryColor, position, companyName, conciergeName, companyLogo, welcomeMessage, quickQuestions, quickQuestionsEnabled, textColor, agentMessageBubbleColor, userMessageBoxColor, assistantTextColor, userTextColor, fontFamily, fontSize, defaultLanguage, orgId, headerTextBold, headerTextItalic, enableVoiceInteraction, disclaimerEnabled, disclaimerText, disclaimerPosition, disclaimerLinkLabel, disclaimerLinkUrl, showPoweredBy, onboardingQuestions, onboardingEnabled, collectionPrompt, allowedDomains, agentMessageBubbleFontFamily, agentMessageBubbleFontSize, userMessageBubbleFontFamily, userMessageBubbleFontSize
101506
+ }, [agentConfig, darkMode, primaryColor, position, companyName, conciergeName, companyLogo, welcomeMessage, quickQuestions, quickQuestionsEnabled, textColor, agentMessageBubbleColor, userMessageBoxColor, assistantTextColor, userTextColor, fontFamily, fontSize, defaultLanguage, headerTextBold, headerTextItalic, enableVoiceInteraction, disclaimerEnabled, disclaimerText, disclaimerPosition, disclaimerLinkLabel, disclaimerLinkUrl, showPoweredBy, onboardingQuestions, onboardingEnabled, collectionPrompt, allowedDomains, agentMessageBubbleFontFamily, agentMessageBubbleFontSize, userMessageBubbleFontFamily, userMessageBubbleFontSize
100707
101507
  // CSAT dependencies
100708
101508
  // (kept minimal because these come from agentConfig)
100709
101509
  ]);
@@ -100722,7 +101522,7 @@
100722
101522
  quickQuestions: [],
100723
101523
  apiBaseUrl: apiBaseUrl || "",
100724
101524
  apiKey: apiKey || "",
100725
- organizationId: orgId || "",
101525
+ getAuthToken,
100726
101526
  autoOpen: false,
100727
101527
  openDelay: 0,
100728
101528
  darkMode: false,
@@ -100730,7 +101530,7 @@
100730
101530
  onboardingQuestions: [],
100731
101531
  onboardingEnabled: false,
100732
101532
  collectionPrompt: undefined
100733
- }), [apiBaseUrl, apiKey, orgId]);
101533
+ }), [apiBaseUrl, apiKey, getAuthToken]);
100734
101534
 
100735
101535
  // ALWAYS call hooks before any early returns (Rules of Hooks)
100736
101536
  const {
@@ -100772,13 +101572,10 @@
100772
101572
  welcomeMessage: widgetConfig.welcomeMessage,
100773
101573
  quickQuestions: widgetConfig.quickQuestions,
100774
101574
  apiBaseUrl,
100775
- // Voice WS endpoint is derived entirely from apiBaseUrl inside
100776
- // useChatState (→ wss://{host}/voice/ws, the frontend voice proxy).
100777
- // Nothing is forwarded/overridable here, so a stale backend or embed
100778
- // wsBaseUrl can't point voice at the old (now non-public)
100779
- // knowledge-api LoadBalancer.
101575
+ wsBaseUrl,
100780
101576
  apiKey,
100781
101577
  organizationId: widgetConfig.organizationId,
101578
+ getAuthToken,
100782
101579
  autoOpen,
100783
101580
  openDelay,
100784
101581
  darkMode: widgetConfig.darkMode,
@@ -100805,24 +101602,33 @@
100805
101602
  // navigation (but not a page refresh — feedback is not written to
100806
101603
  // localStorage so it resets on reload as intended).
100807
101604
  updateMessageFeedback(messageContent, feedback);
100808
- if (!orgId || !conversationId || !apiBaseUrl) return;
101605
+ if (!conversationId || !apiBaseUrl) return;
100809
101606
  const base = apiBaseUrl.replace(/\/$/, "");
100810
- fetch("".concat(base, "/api/v1/support/feedback"), {
100811
- method: "POST",
100812
- headers: {
100813
- "Content-Type": "application/json",
100814
- "x-eshal-org": orgId
100815
- },
100816
- credentials: "include",
100817
- body: JSON.stringify({
100818
- messageContent,
100819
- conversationId,
100820
- organizationId: orgId,
100821
- feedback,
100822
- feedbackText
100823
- })
100824
- }).catch(err => console.error("Feedback submission error:", err));
100825
- }, [orgId, conversationId, apiBaseUrl, updateMessageFeedback]);
101607
+ (async () => {
101608
+ try {
101609
+ const feedbackHeaders = {
101610
+ "Content-Type": "application/json"
101611
+ };
101612
+ if (typeof getAuthToken === 'function') {
101613
+ const token = await getAuthToken();
101614
+ if (token) feedbackHeaders['Authorization'] = "Bearer ".concat(token);
101615
+ }
101616
+ await fetch("".concat(base, "/api/v1/support/feedback"), {
101617
+ method: "POST",
101618
+ headers: feedbackHeaders,
101619
+ credentials: "include",
101620
+ body: JSON.stringify({
101621
+ messageContent,
101622
+ conversationId,
101623
+ feedback,
101624
+ feedbackText
101625
+ })
101626
+ });
101627
+ } catch (err) {
101628
+ console.error("Feedback submission error:", err);
101629
+ }
101630
+ })();
101631
+ }, [conversationId, apiBaseUrl, getAuthToken, updateMessageFeedback]);
100826
101632
 
100827
101633
  // Refresh chat handler — reset conversation
100828
101634
  const handleRefreshChat = reactExports.useCallback(() => {
@@ -100838,7 +101644,7 @@
100838
101644
  const {
100839
101645
  categories: filterCategories,
100840
101646
  hasFilters: showFilterStep
100841
- } = useFilterCatalog(apiBaseUrl, orgId);
101647
+ } = useFilterCatalog(apiBaseUrl, getAuthToken);
100842
101648
 
100843
101649
  // Copy chat handler — copy all messages to clipboard
100844
101650
  const handleCopyChat = reactExports.useCallback(() => {
@@ -100943,7 +101749,7 @@
100943
101749
  showPoweredBy: widgetConfig.showPoweredBy,
100944
101750
  apiBaseUrl: apiBaseUrl,
100945
101751
  apiKey: apiKey,
100946
- organizationId: widgetConfig.organizationId,
101752
+ getAuthToken: getAuthToken,
100947
101753
  conversationId: conversationId,
100948
101754
  conciergeId: (_agentConfig$concierg = agentConfig === null || agentConfig === void 0 ? void 0 : agentConfig.conciergeId) !== null && _agentConfig$concierg !== void 0 ? _agentConfig$concierg : agentConfig === null || agentConfig === void 0 ? void 0 : agentConfig.id,
100949
101755
  onboardingQuestions: widgetConfig.onboardingQuestions,
@@ -100974,6 +101780,10 @@
100974
101780
  widgetFilter: widgetFilter,
100975
101781
  onWidgetFilterChange: setWidgetFilter,
100976
101782
  onSynthesizeAssistantMessage: addAssistantMessage
101783
+ // Chat features (RAG-attach-1) — file-upload paperclip.
101784
+ ,
101785
+ chatFeatures: widgetConfig.chatFeatures,
101786
+ organizationId: widgetConfig.organizationId
100977
101787
  }), !isOpen && /*#__PURE__*/jsxRuntimeExports.jsx(ToggleButton, {
100978
101788
  isOpen: isOpen,
100979
101789
  isDark: isDark,
@@ -101091,11 +101901,10 @@
101091
101901
  }
101092
101902
 
101093
101903
  // Render component
101094
- // If orgId and apiBaseUrl are provided, use dynamic config
101095
- // Otherwise, use the old static config approach for backward compatibility
101096
- const widgetProps = config.orgId && config.apiBaseUrl ? _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
101097
- // Required props
101098
- orgId: config.orgId,
101904
+ // Mode B proxy: apiBaseUrl alone is enough — no key or orgId in browser
101905
+ // In-app JWT: getAuthToken fn passed via config
101906
+ const hasNewAuth = config.apiBaseUrl;
101907
+ const widgetProps = hasNewAuth ? _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
101099
101908
  apiBaseUrl: config.apiBaseUrl
101100
101909
  }, options.wsBaseUrl !== undefined && {
101101
101910
  wsBaseUrl: config.wsBaseUrl