@eshal-bot/chat-widget 0.1.73 → 0.1.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-widget.esm.js +7 -7
- package/dist/chat-widget.js +1020 -211
- package/dist/chat-widget.min.js +5 -5
- package/dist/chat-widget.umd.js +7 -7
- package/package.json +1 -1
- package/dist/chat-widget.esm.js.map +0 -1
- package/dist/chat-widget.js.map +0 -1
- package/dist/chat-widget.umd.js.map +0 -1
package/dist/chat-widget.js
CHANGED
|
@@ -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,
|
|
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
|
-
//
|
|
8021
|
-
|
|
8022
|
-
|
|
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
|
|
8763
|
-
*
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
9887
|
-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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`)
|
|
92674
|
-
// below so a chart of monthly
|
|
92675
|
-
//
|
|
92676
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99026
|
+
sendWithAttachments();
|
|
98316
99027
|
}
|
|
98317
99028
|
}
|
|
98318
99029
|
};
|
|
98319
99030
|
const handleChange = event => {
|
|
98320
99031
|
setInputValue(event.target.value);
|
|
98321
99032
|
};
|
|
98322
|
-
|
|
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 :
|
|
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
|
-
|
|
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
|
|
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(
|
|
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 (
|
|
99848
|
-
|
|
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 (
|
|
99883
|
-
|
|
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,
|
|
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
|
-
|
|
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 {
|
|
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,
|
|
101126
|
+
function useFilterCatalog(apiBaseUrl, getAuthToken) {
|
|
101127
|
+
const hasAuth = !!apiBaseUrl;
|
|
100360
101128
|
const [state, setState] = reactExports.useState({
|
|
100361
101129
|
categories: [],
|
|
100362
|
-
loading:
|
|
101130
|
+
loading: hasAuth,
|
|
100363
101131
|
error: null
|
|
100364
101132
|
});
|
|
100365
101133
|
reactExports.useEffect(() => {
|
|
100366
|
-
if (!apiBaseUrl
|
|
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
|
|
100375
|
-
const cached = _PROCESS_CACHE.get(
|
|
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
|
|
100390
|
-
|
|
100391
|
-
|
|
100392
|
-
|
|
100393
|
-
|
|
100394
|
-
|
|
100395
|
-
|
|
100396
|
-
|
|
100397
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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,
|
|
100508
|
-
if (!apiBaseUrl
|
|
100509
|
-
throw new Error("apiBaseUrl
|
|
101287
|
+
const fetchAgentConfig = async (apiBaseUrl, getAuthToken) => {
|
|
101288
|
+
if (!apiBaseUrl) {
|
|
101289
|
+
throw new Error("apiBaseUrl is required");
|
|
100510
101290
|
}
|
|
100511
101291
|
try {
|
|
100512
|
-
const
|
|
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
|
-
|
|
100535
|
-
|
|
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 (!
|
|
100587
|
-
setConfigError("
|
|
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,
|
|
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
|
-
}, [
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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: wsBaseUrl !== null && wsBaseUrl !== void 0 ? wsBaseUrl : agentConfig === null || agentConfig === void 0 ? void 0 : agentConfig.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 (!
|
|
101605
|
+
if (!conversationId || !apiBaseUrl) return;
|
|
100809
101606
|
const base = apiBaseUrl.replace(/\/$/, "");
|
|
100810
|
-
|
|
100811
|
-
|
|
100812
|
-
|
|
100813
|
-
|
|
100814
|
-
|
|
100815
|
-
|
|
100816
|
-
|
|
100817
|
-
|
|
100818
|
-
|
|
100819
|
-
|
|
100820
|
-
|
|
100821
|
-
|
|
100822
|
-
|
|
100823
|
-
|
|
100824
|
-
|
|
100825
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
//
|
|
101095
|
-
//
|
|
101096
|
-
const
|
|
101097
|
-
|
|
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
|