@eshal-bot/chat-widget 0.2.28 → 0.2.30

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.
@@ -7803,7 +7803,7 @@
7803
7803
  m$1.hydrateRoot;
7804
7804
  }
7805
7805
 
7806
- 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:#1d4ed8;--cw-primary-hover:#1e40af;--cw-status-success:160 84% 39%;--cw-status-success-bg:152 81% 96%;--cw-status-warning:35 100% 50%;--cw-status-warning-bg:34 100% 95%;--cw-status-error:350 89% 60%;--cw-status-error-bg:356 100% 97%;--cw-status-info:199 89% 48%;--cw-status-info-bg:204 100% 97%;-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}.chat-widget-root.dark{--cw-status-success:158 64% 52%;--cw-status-success-bg:152 36% 14%;--cw-status-warning:38 92% 60%;--cw-status-warning-bg:36 33% 14%;--cw-status-error:350 89% 65%;--cw-status-error-bg:356 33% 16%;--cw-status-info:199 89% 58%;--cw-status-info-bg:204 33% 14%}.\\!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 .sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}#chat-widget-root .pointer-events-none{pointer-events:none}#chat-widget-root .visible{visibility:visible}#chat-widget-root .invisible{visibility:hidden}#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 .mx-3{margin-left:.75rem;margin-right:.75rem}#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-1{margin-left:.25rem}#chat-widget-root .ms-0\\.5{margin-inline-start:.125rem}#chat-widget-root .mt-0\\.5{margin-top:.125rem}#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-11{height:2.75rem}#chat-widget-root .h-12{height:3rem}#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-\\[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-11{width:2.75rem}#chat-widget-root .w-12{width:3rem}#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-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,#chat-widget-root .shrink-0{flex-shrink:0}#chat-widget-root .grow{flex-grow:1}#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-90{--tw-rotate:-90deg}#chat-widget-root .-rotate-90,#chat-widget-root .rotate-180{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-180{--tw-rotate:180deg}#chat-widget-root .rotate-90{--tw-rotate:90deg}#chat-widget-root .rotate-90,#chat-widget-root .scale-0{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-0{--tw-scale-x:0;--tw-scale-y:0}#chat-widget-root .scale-100{--tw-scale-x:1;--tw-scale-y:1}#chat-widget-root .scale-100,#chat-widget-root .scale-110{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-110{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}#chat-widget-root .scale-125,#chat-widget-root .scale-95{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-95{--tw-scale-x:.95;--tw-scale-y:.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-nesw-resize{cursor:nesw-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-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 .break-all{word-break:break-all}#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-status-error{border-color:hsl(var(--cw-status-error))!important}#chat-widget-root .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}#chat-widget-root .border-amber-700\\/50{border-color:rgba(180,83,9,.5)}#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 .border-transparent{border-color:transparent}#chat-widget-root .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}#chat-widget-root .bg-amber-900\\/40{background-color:rgba(120,53,15,.4)}#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-50\\/30{background-color:rgba(249,250,251,.3)}#chat-widget-root .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/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-800\\/50{background-color:rgba(31,41,55,.5)}#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-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-contain{-o-object-fit:contain;object-fit:contain}#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-1{padding-left:.25rem}#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 .text-start{text-align:start}#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-base{font-size:1rem;line-height:1.5rem}#chat-widget-root .text-chip{font-size:11px;letter-spacing:0;line-height:1.4}#chat-widget-root .text-h4{font-size:18px;letter-spacing:0;line-height:1.3}#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-snug{line-height:1.375}#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-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}#chat-widget-root .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/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-status-error{color:hsl(var(--cw-status-error))}#chat-widget-root .text-status-success{color:hsl(var(--cw-status-success))}#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 .underline{text-decoration-line:underline}#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-75{opacity:.75}#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-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-sm,#chat-widget-root .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#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)}#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 .outline{outline-style:solid}#chat-widget-root .ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .ring,#chat-widget-root .ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#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)}#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 .ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/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-\\[\\#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 .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/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-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-status-error:focus{border-color:hsl(var(--cw-status-error))!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\\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-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}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active,#chat-widget-root .active\\:scale-\\[0\\.99\\]: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\\.99\\]:active{--tw-scale-x:0.99;--tw-scale-y:0.99}#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))}@media (min-width:768px){#chat-widget-root .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}#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}";
7806
+ 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:#1d4ed8;--cw-primary-hover:#1e40af;--cw-status-success:160 84% 39%;--cw-status-success-bg:152 81% 96%;--cw-status-warning:35 100% 50%;--cw-status-warning-bg:34 100% 95%;--cw-status-error:350 89% 60%;--cw-status-error-bg:356 100% 97%;--cw-status-info:199 89% 48%;--cw-status-info-bg:204 100% 97%;-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}.chat-widget-root.dark{--cw-status-success:158 64% 52%;--cw-status-success-bg:152 36% 14%;--cw-status-warning:38 92% 60%;--cw-status-warning-bg:36 33% 14%;--cw-status-error:350 89% 65%;--cw-status-error-bg:356 33% 16%;--cw-status-info:199 89% 58%;--cw-status-info-bg:204 33% 14%}.\\!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 .sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}#chat-widget-root .pointer-events-none{pointer-events:none}#chat-widget-root .visible{visibility:visible}#chat-widget-root .invisible{visibility:hidden}#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 .mx-3{margin-left:.75rem;margin-right:.75rem}#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-1{margin-left:.25rem}#chat-widget-root .ms-0\\.5{margin-inline-start:.125rem}#chat-widget-root .mt-0\\.5{margin-top:.125rem}#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-11{height:2.75rem}#chat-widget-root .h-12{height:3rem}#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-\\[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-11{width:2.75rem}#chat-widget-root .w-12{width:3rem}#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-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,#chat-widget-root .shrink-0{flex-shrink:0}#chat-widget-root .grow{flex-grow:1}#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-90{--tw-rotate:-90deg}#chat-widget-root .-rotate-90,#chat-widget-root .rotate-180{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-180{--tw-rotate:180deg}#chat-widget-root .rotate-90{--tw-rotate:90deg}#chat-widget-root .rotate-90,#chat-widget-root .scale-0{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-0{--tw-scale-x:0;--tw-scale-y:0}#chat-widget-root .scale-100{--tw-scale-x:1;--tw-scale-y:1}#chat-widget-root .scale-100,#chat-widget-root .scale-110{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-110{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}#chat-widget-root .scale-125,#chat-widget-root .scale-95{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-95{--tw-scale-x:.95;--tw-scale-y:.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-nesw-resize{cursor:nesw-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-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 .break-all{word-break:break-all}#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-status-error{border-color:hsl(var(--cw-status-error))!important}#chat-widget-root .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}#chat-widget-root .border-amber-700\\/50{border-color:rgba(180,83,9,.5)}#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 .border-transparent{border-color:transparent}#chat-widget-root .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}#chat-widget-root .bg-amber-900\\/40{background-color:rgba(120,53,15,.4)}#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-50\\/30{background-color:rgba(249,250,251,.3)}#chat-widget-root .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/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-800\\/50{background-color:rgba(31,41,55,.5)}#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-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-contain{-o-object-fit:contain;object-fit:contain}#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-1{padding-left:.25rem}#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 .text-start{text-align:start}#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-base{font-size:1rem;line-height:1.5rem}#chat-widget-root .text-chip{font-size:11px;letter-spacing:0;line-height:1.4}#chat-widget-root .text-h4{font-size:18px;letter-spacing:0;line-height:1.3}#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-snug{line-height:1.375}#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-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}#chat-widget-root .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/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-status-error{color:hsl(var(--cw-status-error))}#chat-widget-root .text-status-success{color:hsl(var(--cw-status-success))}#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 .underline{text-decoration-line:underline}#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-75{opacity:.75}#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-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-sm,#chat-widget-root .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#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)}#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 .outline{outline-style:solid}#chat-widget-root .ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .ring,#chat-widget-root .ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#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)}#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 .ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/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-\\[\\#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 .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/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-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-status-error:focus{border-color:hsl(var(--cw-status-error))!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\\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-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-blue-700:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(29 78 216/var(--tw-ring-opacity,1))}#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}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active,#chat-widget-root .active\\:scale-\\[0\\.99\\]: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\\.99\\]:active{--tw-scale-x:0.99;--tw-scale-y:0.99}#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))}@media (min-width:768px){#chat-widget-root .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}#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}";
7807
7807
 
7808
7808
  var css_248z = ".chat-widget-root{position:fixed;z-index:999999}.chat-widget-container{color:var(--cw-text-color,inherit);font-family:var(\n --cw-font-family,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Roboto\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif\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}#chat-widget-root .slim-scrollbar-x{scrollbar-width:thin}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar{height:3px!important}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar-track{background:transparent!important}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar-thumb{background:#d1d5db!important;border-radius:2px!important}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar-thumb:hover{background:#9ca3af!important}@media print{.chat-widget-root{display:none!important}}";
7809
7809
 
@@ -8890,112 +8890,38 @@
8890
8890
  }
8891
8891
 
8892
8892
  /**
8893
- * Bootstraps the PCM recorder audio worklet, captures mic audio at 16kHz
8894
- * mono, and forwards buffers through the provided handler.
8895
- */
8896
- async function startAudioRecorderWorklet(onPcmChunk) {
8897
- if (typeof window === 'undefined') {
8898
- throw new Error('Audio recorder can only run in the browser');
8899
- }
8900
- const audioRecorderContext = new AudioContext({
8901
- sampleRate: 16000
8902
- });
8903
-
8904
- // Use inline worklet code with Blob URL (works reliably with all bundlers)
8905
- // This approach is more compatible than using import.meta.url which may not resolve
8906
- // correctly in bundled builds (especially with Rollup)
8907
- const workletCode = `
8908
- class PCMRecorderProcessor extends AudioWorkletProcessor {
8909
- process(inputs) {
8910
- if (!inputs.length || !inputs[0].length) {
8911
- return true;
8912
- }
8913
- const inputChannel = inputs[0][0];
8914
- this.port.postMessage(new Float32Array(inputChannel));
8915
- return true;
8916
- }
8917
- }
8918
- registerProcessor('pcm-recorder-processor', PCMRecorderProcessor);
8919
- `;
8920
- const blob = new Blob([workletCode], {
8921
- type: 'application/javascript'
8922
- });
8923
- const workletUrl = URL.createObjectURL(blob);
8924
- await audioRecorderContext.audioWorklet.addModule(workletUrl);
8925
-
8926
- // Clean up the Blob URL after the worklet is loaded
8927
- URL.revokeObjectURL(workletUrl);
8928
-
8929
- // The reply plays through the speakers while the mic is open: without echo
8930
- // cancellation it comes back in, and the voice gate takes it for the caller
8931
- // barging in (dev, 16 Oct 2026).
8932
- const micStream = await navigator.mediaDevices.getUserMedia({
8933
- audio: {
8934
- channelCount: 1,
8935
- echoCancellation: true,
8936
- noiseSuppression: true,
8937
- autoGainControl: true
8938
- }
8939
- });
8940
- const source = audioRecorderContext.createMediaStreamSource(micStream);
8941
- const audioRecorderNode = new AudioWorkletNode(audioRecorderContext, 'pcm-recorder-processor');
8942
- audioRecorderNode.port.onmessage = event => {
8943
- const pcmData = convertFloat32ToPCM(event.data);
8944
- onPcmChunk(pcmData);
8945
- };
8946
- source.connect(audioRecorderNode);
8947
- return [audioRecorderNode, audioRecorderContext, micStream];
8948
- }
8949
-
8950
- /**
8951
- * Stops all microphone tracks.
8952
- */
8953
- function stopMicrophone(stream) {
8954
- if (!stream) {
8955
- return;
8956
- }
8957
- stream.getTracks().forEach(track => track.stop());
8958
- }
8959
- const INT16_MAX = 0x7fff;
8960
- function convertFloat32ToPCM(float32Array) {
8961
- const pcm16Array = new Int16Array(float32Array.length);
8962
- for (let i = 0; i < float32Array.length; i += 1) {
8963
- pcm16Array[i] = Math.max(-1, Math.min(1, float32Array[i])) * INT16_MAX;
8964
- }
8965
- return pcm16Array.buffer;
8966
- }
8967
-
8968
- /**
8969
- * Client-side Voice-Activity gate for the widget's voice (Bidi) session.
8893
+ * Client-side voice-activity gate and PCM helpers for Bidi voice sessions,
8894
+ * shared by the agent-sdk, the widget and the frontend (EV-4798 MERN-19).
8970
8895
  *
8971
- * Ported from packages/agent-sdk/src/voice/audio/vad.ts (`createSpeechGate`),
8972
- * which was itself originally derived from this widget. The gate sits between
8973
- * the mic worklet and the WebSocket: it forwards PCM ONLY inside a confirmed
8974
- * speech turn and fires `onSpeechEnd` when the turn closes, so the caller can
8975
- * tell the backend the utterance is done (an `audio_end` signal).
8896
+ * The mic worklet emits a PCM frame every few milliseconds whether or not
8897
+ * anyone is speaking. Streaming all of it handed the server's STT model
8898
+ * near-silent audio, which it turned into hallucinated filler turns ("Thank
8899
+ * you", "Bye") that were auto-submitted and could even end the chat. The gate
8900
+ * is a small energy-based state machine between the mic and the socket: it
8901
+ * forwards audio ONLY inside a confirmed speech turn.
8976
8902
  *
8977
- * Why the widget needs this: knowledge-api's non-streaming voice path only
8978
- * transcribes a turn when it receives `audio_end` (or its flaky energy-VAD
8979
- * backstop trips). Without a client gate the widget streamed mic audio forever
8980
- * and the backend just buffered it ("Collecting Audio…") without ever
8981
- * transcribing - so voice connected but never replied. The agent-sdk already
8982
- * gates this way; this brings the widget to parity.
8903
+ * - idle -> speech needs sustained voiced energy (`speechStartMs`), so a
8904
+ * click, breath or keyboard tap never arms a turn;
8905
+ * - on open it fires `onSpeechStart` (barge-in: stop assistant TTS), then
8906
+ * flushes `preRollMs` of buffered audio so the first word is not clipped;
8907
+ * - while speaking it forwards every frame, including short pauses;
8908
+ * - speech -> idle after `hangoverMs` of continuous silence, firing
8909
+ * `onSpeechEnd` so the caller can send `audio_end`.
8983
8910
  *
8984
- * Framework-free and side-effect-free (only calls the two callbacks) so it can
8985
- * be reasoned about / tested in isolation.
8911
+ * Framework-free and side-effect-free (it only calls the callbacks). Plain
8912
+ * JavaScript (types in speechGate.d.ts), conservative syntax: the widget's
8913
+ * Rollup/Babel build compiles neither TypeScript nor this file.
8986
8914
  */
8987
8915
 
8988
8916
  const DEFAULT_SPEECH_GATE_CONFIG = {
8989
8917
  // RMS energy (0..1) at/above which a frame counts as voiced. Speech is
8990
- // typically 0.05–0.3; quiet room tone sits well under 0.02.
8918
+ // typically 0.05-0.3; quiet room tone sits well under 0.02.
8991
8919
  energyThreshold: 0.025,
8992
8920
  // Continuous voiced audio (ms) required to OPEN a turn - rejects coughs/clicks.
8993
8921
  speechStartMs: 200,
8994
- // Continuous silence (ms) after speech that CLOSES the turn. Long enough to
8995
- // ride over natural mid-sentence pauses, short enough to feel responsive.
8922
+ // Continuous silence (ms) after speech that CLOSES the turn.
8996
8923
  hangoverMs: 1000,
8997
- // How much audio (ms) preceding turn-open to retain + flush so the leading
8998
- // phoneme of the first word survives the start-detection delay.
8924
+ // Audio (ms) preceding turn-open to retain and flush.
8999
8925
  preRollMs: 300
9000
8926
  };
9001
8927
 
@@ -9005,81 +8931,78 @@
9005
8931
  if (samples.length === 0) return 0;
9006
8932
  let sumSquares = 0;
9007
8933
  for (let i = 0; i < samples.length; i += 1) {
9008
- const v = samples[i] / 0x8000; // normalise Int16 → -1..1
8934
+ const v = samples[i] / 0x8000; // normalise Int16 to -1..1
9009
8935
  sumSquares += v * v;
9010
8936
  }
9011
8937
  return Math.sqrt(sumSquares / samples.length);
9012
8938
  }
8939
+ function pick(value, fallback) {
8940
+ return value !== null && value !== undefined ? value : fallback;
8941
+ }
9013
8942
 
9014
8943
  /**
9015
8944
  * Create a stateful speech gate. Returns `{ process, reset, isSpeaking }`.
9016
8945
  * `config.sampleRate` is required; everything else falls back to
9017
8946
  * DEFAULT_SPEECH_GATE_CONFIG.
9018
- *
9019
- * @param {{ sampleRate: number, energyThreshold?: number, speechStartMs?: number, hangoverMs?: number, preRollMs?: number }} config
9020
- * @param {{ onSpeechStart?: () => void, onVoiceFrame: (pcm: ArrayBuffer) => void, onSpeechEnd: () => void }} callbacks
9021
- * onSpeechStart fires the instant a turn opens - use it for barge-in
9022
- * (stop any assistant TTS still playing). onVoiceFrame emits each voiced
9023
- * PCM frame; onSpeechEnd fires when the turn closes after the hangover.
9024
8947
  */
9025
8948
  function createSpeechGate(config, callbacks) {
9026
8949
  const cfg = {
9027
8950
  sampleRate: config.sampleRate,
9028
- energyThreshold: config.energyThreshold ?? DEFAULT_SPEECH_GATE_CONFIG.energyThreshold,
9029
- speechStartMs: config.speechStartMs ?? DEFAULT_SPEECH_GATE_CONFIG.speechStartMs,
9030
- hangoverMs: config.hangoverMs ?? DEFAULT_SPEECH_GATE_CONFIG.hangoverMs,
9031
- preRollMs: config.preRollMs ?? DEFAULT_SPEECH_GATE_CONFIG.preRollMs
8951
+ energyThreshold: pick(config.energyThreshold, DEFAULT_SPEECH_GATE_CONFIG.energyThreshold),
8952
+ speechStartMs: pick(config.speechStartMs, DEFAULT_SPEECH_GATE_CONFIG.speechStartMs),
8953
+ hangoverMs: pick(config.hangoverMs, DEFAULT_SPEECH_GATE_CONFIG.hangoverMs),
8954
+ preRollMs: pick(config.preRollMs, DEFAULT_SPEECH_GATE_CONFIG.preRollMs)
9032
8955
  };
9033
8956
  let speaking = false;
9034
- // While idle: how much consecutive voiced audio we've seen (to open).
8957
+ // While idle: how much consecutive voiced audio has been seen (to open).
9035
8958
  let voicedRunMs = 0;
9036
- // While speaking: how much consecutive silence we've seen (to close).
8959
+ // While speaking: how much consecutive silence has been seen (to close).
9037
8960
  let silenceRunMs = 0;
9038
8961
  // Ring of recent frames kept only while idle, for pre-roll on open.
9039
8962
  let preRoll = [];
9040
8963
  let preRollMsBuffered = 0;
9041
8964
 
9042
- // Int16 → 2 bytes/sample; ms = samples / sampleRate * 1000.
9043
- const frameDurationMs = pcm => pcm.byteLength / 2 / cfg.sampleRate * 1000;
9044
- const reset = () => {
8965
+ // Int16 is 2 bytes/sample; ms = samples / sampleRate * 1000.
8966
+ const frameDurationMs = function (pcm) {
8967
+ return pcm.byteLength / 2 / cfg.sampleRate * 1000;
8968
+ };
8969
+ const reset = function () {
9045
8970
  speaking = false;
9046
8971
  voicedRunMs = 0;
9047
8972
  silenceRunMs = 0;
9048
8973
  preRoll = [];
9049
8974
  preRollMsBuffered = 0;
9050
8975
  };
9051
- const process = pcm => {
8976
+ const process = function (pcm) {
9052
8977
  const durationMs = frameDurationMs(pcm);
9053
8978
  const voiced = computeRms(pcm) >= cfg.energyThreshold;
9054
8979
  if (!speaking) {
9055
- // Keep a bounded pre-roll of the most recent audio so we don't clip the
9056
- // onset once we decide this is speech.
8980
+ // Keep a bounded pre-roll of the most recent audio so the onset is not
8981
+ // clipped once this is confirmed as speech.
9057
8982
  preRoll.push({
9058
- pcm,
9059
- durationMs
8983
+ pcm: pcm,
8984
+ durationMs: durationMs
9060
8985
  });
9061
8986
  preRollMsBuffered += durationMs;
9062
8987
  while (preRollMsBuffered > cfg.preRollMs && preRoll.length > 1) {
9063
8988
  const dropped = preRoll.shift();
9064
- preRollMsBuffered -= dropped?.durationMs ?? 0;
8989
+ preRollMsBuffered -= dropped ? dropped.durationMs : 0;
9065
8990
  }
9066
8991
  if (voiced) {
9067
8992
  voicedRunMs += durationMs;
9068
8993
  if (voicedRunMs >= cfg.speechStartMs) {
9069
- // Confirmed speech - open the turn. Fire onSpeechStart FIRST so the
9070
- // caller can barge in (stop assistant TTS still playing) before we
9071
- // start streaming this utterance, then flush the pre-roll (which
9072
- // contains the voiced onset) and go live.
8994
+ // Confirmed speech: open the turn. onSpeechStart first so the
8995
+ // caller can barge in, then flush the pre-roll and go live.
9073
8996
  speaking = true;
9074
8997
  silenceRunMs = 0;
9075
- callbacks.onSpeechStart?.();
9076
- for (const frame of preRoll) callbacks.onVoiceFrame(frame.pcm);
8998
+ if (typeof callbacks.onSpeechStart === 'function') callbacks.onSpeechStart();
8999
+ for (let i = 0; i < preRoll.length; i += 1) callbacks.onVoiceFrame(preRoll[i].pcm);
9077
9000
  preRoll = [];
9078
9001
  preRollMsBuffered = 0;
9079
9002
  }
9080
9003
  } else {
9081
- // Need *sustained* energy - reset on any silent frame so a brief
9082
- // transient can't accumulate its way over the threshold.
9004
+ // Sustained energy only: any silent frame resets the run so a brief
9005
+ // transient cannot accumulate its way over the threshold.
9083
9006
  voicedRunMs = 0;
9084
9007
  }
9085
9008
  return;
@@ -9101,11 +9024,89 @@
9101
9024
  }
9102
9025
  };
9103
9026
  return {
9104
- process,
9105
- reset,
9106
- isSpeaking: () => speaking
9027
+ process: process,
9028
+ reset: reset,
9029
+ isSpeaking: function () {
9030
+ return speaking;
9031
+ }
9107
9032
  };
9108
9033
  }
9034
+ const INT16_MAX = 0x7fff;
9035
+
9036
+ /** Float32 worklet samples (-1..1) to a 16-bit PCM ArrayBuffer. */
9037
+ function convertFloat32ToPCM(float32Array) {
9038
+ const pcm16 = new Int16Array(float32Array.length);
9039
+ for (let i = 0; i < float32Array.length; i += 1) {
9040
+ pcm16[i] = Math.max(-1, Math.min(1, float32Array[i])) * INT16_MAX;
9041
+ }
9042
+ return pcm16.buffer;
9043
+ }
9044
+
9045
+ /** Stop every track of a microphone stream; a no-op without one. */
9046
+ function stopMicrophone(stream) {
9047
+ if (!stream) return;
9048
+ stream.getTracks().forEach(function (track) {
9049
+ track.stop();
9050
+ });
9051
+ }
9052
+
9053
+ /**
9054
+ * Bootstraps the PCM recorder audio worklet, captures mic audio at 16kHz
9055
+ * mono, and forwards buffers through the provided handler.
9056
+ */
9057
+ async function startAudioRecorderWorklet(onPcmChunk) {
9058
+ if (typeof window === 'undefined') {
9059
+ throw new Error('Audio recorder can only run in the browser');
9060
+ }
9061
+ const audioRecorderContext = new AudioContext({
9062
+ sampleRate: 16000
9063
+ });
9064
+
9065
+ // Use inline worklet code with Blob URL (works reliably with all bundlers)
9066
+ // This approach is more compatible than using import.meta.url which may not resolve
9067
+ // correctly in bundled builds (especially with Rollup)
9068
+ const workletCode = `
9069
+ class PCMRecorderProcessor extends AudioWorkletProcessor {
9070
+ process(inputs) {
9071
+ if (!inputs.length || !inputs[0].length) {
9072
+ return true;
9073
+ }
9074
+ const inputChannel = inputs[0][0];
9075
+ this.port.postMessage(new Float32Array(inputChannel));
9076
+ return true;
9077
+ }
9078
+ }
9079
+ registerProcessor('pcm-recorder-processor', PCMRecorderProcessor);
9080
+ `;
9081
+ const blob = new Blob([workletCode], {
9082
+ type: 'application/javascript'
9083
+ });
9084
+ const workletUrl = URL.createObjectURL(blob);
9085
+ await audioRecorderContext.audioWorklet.addModule(workletUrl);
9086
+
9087
+ // Clean up the Blob URL after the worklet is loaded
9088
+ URL.revokeObjectURL(workletUrl);
9089
+
9090
+ // The reply plays through the speakers while the mic is open: without echo
9091
+ // cancellation it comes back in, and the voice gate takes it for the caller
9092
+ // barging in (dev, 16 Oct 2026).
9093
+ const micStream = await navigator.mediaDevices.getUserMedia({
9094
+ audio: {
9095
+ channelCount: 1,
9096
+ echoCancellation: true,
9097
+ noiseSuppression: true,
9098
+ autoGainControl: true
9099
+ }
9100
+ });
9101
+ const source = audioRecorderContext.createMediaStreamSource(micStream);
9102
+ const audioRecorderNode = new AudioWorkletNode(audioRecorderContext, 'pcm-recorder-processor');
9103
+ audioRecorderNode.port.onmessage = event => {
9104
+ const pcmData = convertFloat32ToPCM(event.data);
9105
+ onPcmChunk(pcmData);
9106
+ };
9107
+ source.connect(audioRecorderNode);
9108
+ return [audioRecorderNode, audioRecorderContext, micStream];
9109
+ }
9109
9110
 
9110
9111
  /**
9111
9112
  * What becomes of a reply's audio when the caller may be speaking over it.
@@ -11114,6 +11115,689 @@
11114
11115
  allowMicAccess: "Cho phép truy cập micrô"
11115
11116
  }
11116
11117
  };
11118
+
11119
+ // EV-4798 (MERN-21): accessible names for icon-only controls and labelled
11120
+ // regions that used to be hardcoded English. Kept as its own table, like
11121
+ // ONBOARDING_PLACEHOLDERS below, so every supported locale carries the full
11122
+ // set in one place. translate() reads it after the locale's main dictionary
11123
+ // and before the English fallback. `{count}` is substituted at the call site.
11124
+ const A11Y_LABELS = {
11125
+ en: {
11126
+ removeAttachment: "Remove attachment",
11127
+ categoryFilter: "Category filter",
11128
+ filterByCategory: "Filter by category",
11129
+ scrollCategoriesLeft: "Scroll categories left",
11130
+ scrollCategoriesRight: "Scroll categories right",
11131
+ scrollTagsLeft: "Scroll tags left",
11132
+ scrollTagsRight: "Scroll tags right",
11133
+ copyMessage: "Copy message",
11134
+ copied: "Copied",
11135
+ like: "Like",
11136
+ dislike: "Dislike",
11137
+ sourcesCited: "{count} sources cited",
11138
+ moreSources: "+{count} more"
11139
+ },
11140
+ ar: {
11141
+ removeAttachment: "إزالة المرفق",
11142
+ categoryFilter: "تصفية الفئات",
11143
+ filterByCategory: "التصفية حسب الفئة",
11144
+ scrollCategoriesLeft: "تمرير الفئات لليسار",
11145
+ scrollCategoriesRight: "تمرير الفئات لليمين",
11146
+ scrollTagsLeft: "تمرير الوسوم لليسار",
11147
+ scrollTagsRight: "تمرير الوسوم لليمين",
11148
+ copyMessage: "نسخ الرسالة",
11149
+ copied: "تم النسخ",
11150
+ like: "أعجبني",
11151
+ dislike: "لم يعجبني",
11152
+ sourcesCited: "{count} مصادر مستشهد بها",
11153
+ moreSources: "+{count} أخرى"
11154
+ },
11155
+ es: {
11156
+ removeAttachment: "Quitar archivo adjunto",
11157
+ categoryFilter: "Filtro de categoría",
11158
+ filterByCategory: "Filtrar por categoría",
11159
+ scrollCategoriesLeft: "Desplazar categorías a la izquierda",
11160
+ scrollCategoriesRight: "Desplazar categorías a la derecha",
11161
+ scrollTagsLeft: "Desplazar etiquetas a la izquierda",
11162
+ scrollTagsRight: "Desplazar etiquetas a la derecha",
11163
+ copyMessage: "Copiar mensaje",
11164
+ copied: "Copiado",
11165
+ like: "Me gusta",
11166
+ dislike: "No me gusta",
11167
+ sourcesCited: "{count} fuentes citadas",
11168
+ moreSources: "+{count} más"
11169
+ },
11170
+ be: {
11171
+ removeAttachment: "Выдаліць улажэнне",
11172
+ categoryFilter: "Фільтр катэгорый",
11173
+ filterByCategory: "Фільтраваць па катэгорыі",
11174
+ scrollCategoriesLeft: "Пракруціць катэгорыі ўлева",
11175
+ scrollCategoriesRight: "Пракруціць катэгорыі ўправа",
11176
+ scrollTagsLeft: "Пракруціць тэгі ўлева",
11177
+ scrollTagsRight: "Пракруціць тэгі ўправа",
11178
+ copyMessage: "Капіраваць паведамленне",
11179
+ copied: "Скапіравана",
11180
+ like: "Падабаецца",
11181
+ dislike: "Не падабаецца",
11182
+ sourcesCited: "Цытаваныя крыніцы: {count}",
11183
+ moreSources: "+{count} яшчэ"
11184
+ },
11185
+ bs: {
11186
+ removeAttachment: "Ukloni prilog",
11187
+ categoryFilter: "Filter kategorija",
11188
+ filterByCategory: "Filtriraj po kategoriji",
11189
+ scrollCategoriesLeft: "Pomjeri kategorije lijevo",
11190
+ scrollCategoriesRight: "Pomjeri kategorije desno",
11191
+ scrollTagsLeft: "Pomjeri oznake lijevo",
11192
+ scrollTagsRight: "Pomjeri oznake desno",
11193
+ copyMessage: "Kopiraj poruku",
11194
+ copied: "Kopirano",
11195
+ like: "Sviđa mi se",
11196
+ dislike: "Ne sviđa mi se",
11197
+ sourcesCited: "Citirani izvori: {count}",
11198
+ moreSources: "+{count} više"
11199
+ },
11200
+ bg: {
11201
+ removeAttachment: "Премахване на прикачения файл",
11202
+ categoryFilter: "Филтър по категория",
11203
+ filterByCategory: "Филтриране по категория",
11204
+ scrollCategoriesLeft: "Превъртане на категориите наляво",
11205
+ scrollCategoriesRight: "Превъртане на категориите надясно",
11206
+ scrollTagsLeft: "Превъртане на етикетите наляво",
11207
+ scrollTagsRight: "Превъртане на етикетите надясно",
11208
+ copyMessage: "Копиране на съобщението",
11209
+ copied: "Копирано",
11210
+ like: "Харесва ми",
11211
+ dislike: "Не ми харесва",
11212
+ sourcesCited: "Цитирани източници: {count}",
11213
+ moreSources: "+{count} още"
11214
+ },
11215
+ my: {
11216
+ removeAttachment: "ပူးတွဲဖိုင်ကို ဖယ်ရှားပါ",
11217
+ categoryFilter: "အမျိုးအစား စစ်ထုတ်မှု",
11218
+ filterByCategory: "အမျိုးအစားအလိုက် စစ်ထုတ်ပါ",
11219
+ scrollCategoriesLeft: "အမျိုးအစားများကို ဘယ်ဘက်သို့ ရွှေ့ပါ",
11220
+ scrollCategoriesRight: "အမျိုးအစားများကို ညာဘက်သို့ ရွှေ့ပါ",
11221
+ scrollTagsLeft: "တဂ်များကို ဘယ်ဘက်သို့ ရွှေ့ပါ",
11222
+ scrollTagsRight: "တဂ်များကို ညာဘက်သို့ ရွှေ့ပါ",
11223
+ copyMessage: "မက်ဆေ့ချ်ကို ကူးယူပါ",
11224
+ copied: "ကူးယူပြီးပါပြီ",
11225
+ like: "နှစ်သက်သည်",
11226
+ dislike: "မနှစ်သက်ပါ",
11227
+ sourcesCited: "ကိုးကားထားသော ရင်းမြစ် {count} ခု",
11228
+ moreSources: "နောက်ထပ် +{count}"
11229
+ },
11230
+ ca: {
11231
+ removeAttachment: "Elimina el fitxer adjunt",
11232
+ categoryFilter: "Filtre de categoria",
11233
+ filterByCategory: "Filtra per categoria",
11234
+ scrollCategoriesLeft: "Desplaça les categories a l'esquerra",
11235
+ scrollCategoriesRight: "Desplaça les categories a la dreta",
11236
+ scrollTagsLeft: "Desplaça les etiquetes a l'esquerra",
11237
+ scrollTagsRight: "Desplaça les etiquetes a la dreta",
11238
+ copyMessage: "Copia el missatge",
11239
+ copied: "Copiat",
11240
+ like: "M'agrada",
11241
+ dislike: "No m'agrada",
11242
+ sourcesCited: "{count} fonts citades",
11243
+ moreSources: "+{count} més"
11244
+ },
11245
+ zh: {
11246
+ removeAttachment: "移除附件",
11247
+ categoryFilter: "类别筛选",
11248
+ filterByCategory: "按类别筛选",
11249
+ scrollCategoriesLeft: "向左滚动类别",
11250
+ scrollCategoriesRight: "向右滚动类别",
11251
+ scrollTagsLeft: "向左滚动标签",
11252
+ scrollTagsRight: "向右滚动标签",
11253
+ copyMessage: "复制消息",
11254
+ copied: "已复制",
11255
+ like: "赞",
11256
+ dislike: "踩",
11257
+ sourcesCited: "引用了 {count} 个来源",
11258
+ moreSources: "另外 {count} 个"
11259
+ },
11260
+ hr: {
11261
+ removeAttachment: "Ukloni privitak",
11262
+ categoryFilter: "Filtar kategorija",
11263
+ filterByCategory: "Filtriraj po kategoriji",
11264
+ scrollCategoriesLeft: "Pomakni kategorije ulijevo",
11265
+ scrollCategoriesRight: "Pomakni kategorije udesno",
11266
+ scrollTagsLeft: "Pomakni oznake ulijevo",
11267
+ scrollTagsRight: "Pomakni oznake udesno",
11268
+ copyMessage: "Kopiraj poruku",
11269
+ copied: "Kopirano",
11270
+ like: "Sviđa mi se",
11271
+ dislike: "Ne sviđa mi se",
11272
+ sourcesCited: "Citirani izvori: {count}",
11273
+ moreSources: "+{count} više"
11274
+ },
11275
+ cs: {
11276
+ removeAttachment: "Odebrat přílohu",
11277
+ categoryFilter: "Filtr kategorií",
11278
+ filterByCategory: "Filtrovat podle kategorie",
11279
+ scrollCategoriesLeft: "Posunout kategorie doleva",
11280
+ scrollCategoriesRight: "Posunout kategorie doprava",
11281
+ scrollTagsLeft: "Posunout štítky doleva",
11282
+ scrollTagsRight: "Posunout štítky doprava",
11283
+ copyMessage: "Kopírovat zprávu",
11284
+ copied: "Zkopírováno",
11285
+ like: "Líbí se mi",
11286
+ dislike: "Nelíbí se mi",
11287
+ sourcesCited: "Citované zdroje: {count}",
11288
+ moreSources: "+{count} další"
11289
+ },
11290
+ da: {
11291
+ removeAttachment: "Fjern vedhæftet fil",
11292
+ categoryFilter: "Kategorifilter",
11293
+ filterByCategory: "Filtrer efter kategori",
11294
+ scrollCategoriesLeft: "Rul kategorier til venstre",
11295
+ scrollCategoriesRight: "Rul kategorier til højre",
11296
+ scrollTagsLeft: "Rul tags til venstre",
11297
+ scrollTagsRight: "Rul tags til højre",
11298
+ copyMessage: "Kopiér besked",
11299
+ copied: "Kopieret",
11300
+ like: "Synes godt om",
11301
+ dislike: "Synes ikke om",
11302
+ sourcesCited: "{count} kilder citeret",
11303
+ moreSources: "+{count} mere"
11304
+ },
11305
+ nl: {
11306
+ removeAttachment: "Bijlage verwijderen",
11307
+ categoryFilter: "Categoriefilter",
11308
+ filterByCategory: "Filteren op categorie",
11309
+ scrollCategoriesLeft: "Categorieën naar links scrollen",
11310
+ scrollCategoriesRight: "Categorieën naar rechts scrollen",
11311
+ scrollTagsLeft: "Tags naar links scrollen",
11312
+ scrollTagsRight: "Tags naar rechts scrollen",
11313
+ copyMessage: "Bericht kopiëren",
11314
+ copied: "Gekopieerd",
11315
+ like: "Vind ik leuk",
11316
+ dislike: "Vind ik niet leuk",
11317
+ sourcesCited: "{count} bronnen geciteerd",
11318
+ moreSources: "+{count} meer"
11319
+ },
11320
+ et: {
11321
+ removeAttachment: "Eemalda manus",
11322
+ categoryFilter: "Kategooriafilter",
11323
+ filterByCategory: "Filtreeri kategooria järgi",
11324
+ scrollCategoriesLeft: "Keri kategooriaid vasakule",
11325
+ scrollCategoriesRight: "Keri kategooriaid paremale",
11326
+ scrollTagsLeft: "Keri silte vasakule",
11327
+ scrollTagsRight: "Keri silte paremale",
11328
+ copyMessage: "Kopeeri sõnum",
11329
+ copied: "Kopeeritud",
11330
+ like: "Meeldib",
11331
+ dislike: "Ei meeldi",
11332
+ sourcesCited: "Viidatud allikaid: {count}",
11333
+ moreSources: "+{count} veel"
11334
+ },
11335
+ fi: {
11336
+ removeAttachment: "Poista liite",
11337
+ categoryFilter: "Luokkasuodatin",
11338
+ filterByCategory: "Suodata luokan mukaan",
11339
+ scrollCategoriesLeft: "Vieritä luokkia vasemmalle",
11340
+ scrollCategoriesRight: "Vieritä luokkia oikealle",
11341
+ scrollTagsLeft: "Vieritä tunnisteita vasemmalle",
11342
+ scrollTagsRight: "Vieritä tunnisteita oikealle",
11343
+ copyMessage: "Kopioi viesti",
11344
+ copied: "Kopioitu",
11345
+ like: "Tykkää",
11346
+ dislike: "En tykkää",
11347
+ sourcesCited: "Lähteitä viitattu: {count}",
11348
+ moreSources: "+{count} lisää"
11349
+ },
11350
+ fr: {
11351
+ removeAttachment: "Supprimer la pièce jointe",
11352
+ categoryFilter: "Filtre de catégorie",
11353
+ filterByCategory: "Filtrer par catégorie",
11354
+ scrollCategoriesLeft: "Faire défiler les catégories vers la gauche",
11355
+ scrollCategoriesRight: "Faire défiler les catégories vers la droite",
11356
+ scrollTagsLeft: "Faire défiler les étiquettes vers la gauche",
11357
+ scrollTagsRight: "Faire défiler les étiquettes vers la droite",
11358
+ copyMessage: "Copier le message",
11359
+ copied: "Copié",
11360
+ like: "J'aime",
11361
+ dislike: "Je n'aime pas",
11362
+ sourcesCited: "{count} sources citées",
11363
+ moreSources: "+{count} de plus"
11364
+ },
11365
+ de: {
11366
+ removeAttachment: "Anhang entfernen",
11367
+ categoryFilter: "Kategoriefilter",
11368
+ filterByCategory: "Nach Kategorie filtern",
11369
+ scrollCategoriesLeft: "Kategorien nach links scrollen",
11370
+ scrollCategoriesRight: "Kategorien nach rechts scrollen",
11371
+ scrollTagsLeft: "Tags nach links scrollen",
11372
+ scrollTagsRight: "Tags nach rechts scrollen",
11373
+ copyMessage: "Nachricht kopieren",
11374
+ copied: "Kopiert",
11375
+ like: "Gefällt mir",
11376
+ dislike: "Gefällt mir nicht",
11377
+ sourcesCited: "{count} Quellen zitiert",
11378
+ moreSources: "+{count} weitere"
11379
+ },
11380
+ el: {
11381
+ removeAttachment: "Αφαίρεση συνημμένου",
11382
+ categoryFilter: "Φίλτρο κατηγορίας",
11383
+ filterByCategory: "Φιλτράρισμα κατά κατηγορία",
11384
+ scrollCategoriesLeft: "Κύλιση κατηγοριών αριστερά",
11385
+ scrollCategoriesRight: "Κύλιση κατηγοριών δεξιά",
11386
+ scrollTagsLeft: "Κύλιση ετικετών αριστερά",
11387
+ scrollTagsRight: "Κύλιση ετικετών δεξιά",
11388
+ copyMessage: "Αντιγραφή μηνύματος",
11389
+ copied: "Αντιγράφηκε",
11390
+ like: "Μου αρέσει",
11391
+ dislike: "Δεν μου αρέσει",
11392
+ sourcesCited: "{count} πηγές αναφέρονται",
11393
+ moreSources: "+{count} ακόμη"
11394
+ },
11395
+ hi: {
11396
+ removeAttachment: "अनुलग्नक हटाएँ",
11397
+ categoryFilter: "श्रेणी फ़िल्टर",
11398
+ filterByCategory: "श्रेणी के अनुसार फ़िल्टर करें",
11399
+ scrollCategoriesLeft: "श्रेणियों को बाईं ओर स्क्रॉल करें",
11400
+ scrollCategoriesRight: "श्रेणियों को दाईं ओर स्क्रॉल करें",
11401
+ scrollTagsLeft: "टैग को बाईं ओर स्क्रॉल करें",
11402
+ scrollTagsRight: "टैग को दाईं ओर स्क्रॉल करें",
11403
+ copyMessage: "संदेश कॉपी करें",
11404
+ copied: "कॉपी किया गया",
11405
+ like: "पसंद",
11406
+ dislike: "नापसंद",
11407
+ sourcesCited: "{count} स्रोत उद्धृत",
11408
+ moreSources: "+{count} और"
11409
+ },
11410
+ mr: {
11411
+ removeAttachment: "संलग्नक काढा",
11412
+ categoryFilter: "श्रेणी फिल्टर",
11413
+ filterByCategory: "श्रेणीनुसार फिल्टर करा",
11414
+ scrollCategoriesLeft: "श्रेण्या डावीकडे स्क्रोल करा",
11415
+ scrollCategoriesRight: "श्रेण्या उजवीकडे स्क्रोल करा",
11416
+ scrollTagsLeft: "टॅग डावीकडे स्क्रोल करा",
11417
+ scrollTagsRight: "टॅग उजवीकडे स्क्रोल करा",
11418
+ copyMessage: "संदेश कॉपी करा",
11419
+ copied: "कॉपी केले",
11420
+ like: "आवडले",
11421
+ dislike: "आवडले नाही",
11422
+ sourcesCited: "{count} स्रोत उद्धृत",
11423
+ moreSources: "+{count} अधिक"
11424
+ },
11425
+ hu: {
11426
+ removeAttachment: "Melléklet eltávolítása",
11427
+ categoryFilter: "Kategóriaszűrő",
11428
+ filterByCategory: "Szűrés kategória szerint",
11429
+ scrollCategoriesLeft: "Kategóriák görgetése balra",
11430
+ scrollCategoriesRight: "Kategóriák görgetése jobbra",
11431
+ scrollTagsLeft: "Címkék görgetése balra",
11432
+ scrollTagsRight: "Címkék görgetése jobbra",
11433
+ copyMessage: "Üzenet másolása",
11434
+ copied: "Másolva",
11435
+ like: "Tetszik",
11436
+ dislike: "Nem tetszik",
11437
+ sourcesCited: "{count} hivatkozott forrás",
11438
+ moreSources: "+{count} további"
11439
+ },
11440
+ is: {
11441
+ removeAttachment: "Fjarlægja viðhengi",
11442
+ categoryFilter: "Flokkasía",
11443
+ filterByCategory: "Sía eftir flokki",
11444
+ scrollCategoriesLeft: "Fletta flokkum til vinstri",
11445
+ scrollCategoriesRight: "Fletta flokkum til hægri",
11446
+ scrollTagsLeft: "Fletta merkjum til vinstri",
11447
+ scrollTagsRight: "Fletta merkjum til hægri",
11448
+ copyMessage: "Afrita skilaboð",
11449
+ copied: "Afritað",
11450
+ like: "Líkar",
11451
+ dislike: "Líkar ekki",
11452
+ sourcesCited: "Heimildir vísað í: {count}",
11453
+ moreSources: "+{count} í viðbót"
11454
+ },
11455
+ id: {
11456
+ removeAttachment: "Hapus lampiran",
11457
+ categoryFilter: "Filter kategori",
11458
+ filterByCategory: "Filter menurut kategori",
11459
+ scrollCategoriesLeft: "Gulir kategori ke kiri",
11460
+ scrollCategoriesRight: "Gulir kategori ke kanan",
11461
+ scrollTagsLeft: "Gulir tag ke kiri",
11462
+ scrollTagsRight: "Gulir tag ke kanan",
11463
+ copyMessage: "Salin pesan",
11464
+ copied: "Disalin",
11465
+ like: "Suka",
11466
+ dislike: "Tidak suka",
11467
+ sourcesCited: "{count} sumber dikutip",
11468
+ moreSources: "+{count} lainnya"
11469
+ },
11470
+ it: {
11471
+ removeAttachment: "Rimuovi allegato",
11472
+ categoryFilter: "Filtro categoria",
11473
+ filterByCategory: "Filtra per categoria",
11474
+ scrollCategoriesLeft: "Scorri le categorie a sinistra",
11475
+ scrollCategoriesRight: "Scorri le categorie a destra",
11476
+ scrollTagsLeft: "Scorri i tag a sinistra",
11477
+ scrollTagsRight: "Scorri i tag a destra",
11478
+ copyMessage: "Copia messaggio",
11479
+ copied: "Copiato",
11480
+ like: "Mi piace",
11481
+ dislike: "Non mi piace",
11482
+ sourcesCited: "{count} fonti citate",
11483
+ moreSources: "+{count} altre"
11484
+ },
11485
+ ja: {
11486
+ removeAttachment: "添付ファイルを削除",
11487
+ categoryFilter: "カテゴリフィルター",
11488
+ filterByCategory: "カテゴリで絞り込む",
11489
+ scrollCategoriesLeft: "カテゴリを左にスクロール",
11490
+ scrollCategoriesRight: "カテゴリを右にスクロール",
11491
+ scrollTagsLeft: "タグを左にスクロール",
11492
+ scrollTagsRight: "タグを右にスクロール",
11493
+ copyMessage: "メッセージをコピー",
11494
+ copied: "コピーしました",
11495
+ like: "いいね",
11496
+ dislike: "よくないね",
11497
+ sourcesCited: "{count} 件の出典",
11498
+ moreSources: "他 {count} 件"
11499
+ },
11500
+ ko: {
11501
+ removeAttachment: "첨부 파일 제거",
11502
+ categoryFilter: "카테고리 필터",
11503
+ filterByCategory: "카테고리별 필터",
11504
+ scrollCategoriesLeft: "카테고리를 왼쪽으로 스크롤",
11505
+ scrollCategoriesRight: "카테고리를 오른쪽으로 스크롤",
11506
+ scrollTagsLeft: "태그를 왼쪽으로 스크롤",
11507
+ scrollTagsRight: "태그를 오른쪽으로 스크롤",
11508
+ copyMessage: "메시지 복사",
11509
+ copied: "복사됨",
11510
+ like: "좋아요",
11511
+ dislike: "싫어요",
11512
+ sourcesCited: "인용된 출처 {count}개",
11513
+ moreSources: "외 {count}개"
11514
+ },
11515
+ lv: {
11516
+ removeAttachment: "Noņemt pielikumu",
11517
+ categoryFilter: "Kategoriju filtrs",
11518
+ filterByCategory: "Filtrēt pēc kategorijas",
11519
+ scrollCategoriesLeft: "Ritināt kategorijas pa kreisi",
11520
+ scrollCategoriesRight: "Ritināt kategorijas pa labi",
11521
+ scrollTagsLeft: "Ritināt birkas pa kreisi",
11522
+ scrollTagsRight: "Ritināt birkas pa labi",
11523
+ copyMessage: "Kopēt ziņojumu",
11524
+ copied: "Nokopēts",
11525
+ like: "Patīk",
11526
+ dislike: "Nepatīk",
11527
+ sourcesCited: "Citēti avoti: {count}",
11528
+ moreSources: "+{count} vēl"
11529
+ },
11530
+ lt: {
11531
+ removeAttachment: "Pašalinti priedą",
11532
+ categoryFilter: "Kategorijų filtras",
11533
+ filterByCategory: "Filtruoti pagal kategoriją",
11534
+ scrollCategoriesLeft: "Slinkti kategorijas į kairę",
11535
+ scrollCategoriesRight: "Slinkti kategorijas į dešinę",
11536
+ scrollTagsLeft: "Slinkti žymes į kairę",
11537
+ scrollTagsRight: "Slinkti žymes į dešinę",
11538
+ copyMessage: "Kopijuoti žinutę",
11539
+ copied: "Nukopijuota",
11540
+ like: "Patinka",
11541
+ dislike: "Nepatinka",
11542
+ sourcesCited: "Cituoti šaltiniai: {count}",
11543
+ moreSources: "+{count} daugiau"
11544
+ },
11545
+ mk: {
11546
+ removeAttachment: "Отстрани прилог",
11547
+ categoryFilter: "Филтер за категории",
11548
+ filterByCategory: "Филтрирај по категорија",
11549
+ scrollCategoriesLeft: "Лизгај ги категориите налево",
11550
+ scrollCategoriesRight: "Лизгај ги категориите надесно",
11551
+ scrollTagsLeft: "Лизгај ги ознаките налево",
11552
+ scrollTagsRight: "Лизгај ги ознаките надесно",
11553
+ copyMessage: "Копирај порака",
11554
+ copied: "Копирано",
11555
+ like: "Ми се допаѓа",
11556
+ dislike: "Не ми се допаѓа",
11557
+ sourcesCited: "Цитирани извори: {count}",
11558
+ moreSources: "+{count} уште"
11559
+ },
11560
+ ms: {
11561
+ removeAttachment: "Alih keluar lampiran",
11562
+ categoryFilter: "Penapis kategori",
11563
+ filterByCategory: "Tapis mengikut kategori",
11564
+ scrollCategoriesLeft: "Tatal kategori ke kiri",
11565
+ scrollCategoriesRight: "Tatal kategori ke kanan",
11566
+ scrollTagsLeft: "Tatal tag ke kiri",
11567
+ scrollTagsRight: "Tatal tag ke kanan",
11568
+ copyMessage: "Salin mesej",
11569
+ copied: "Disalin",
11570
+ like: "Suka",
11571
+ dislike: "Tidak suka",
11572
+ sourcesCited: "{count} sumber dipetik",
11573
+ moreSources: "+{count} lagi"
11574
+ },
11575
+ no: {
11576
+ removeAttachment: "Fjern vedlegg",
11577
+ categoryFilter: "Kategorifilter",
11578
+ filterByCategory: "Filtrer etter kategori",
11579
+ scrollCategoriesLeft: "Bla kategorier til venstre",
11580
+ scrollCategoriesRight: "Bla kategorier til høyre",
11581
+ scrollTagsLeft: "Bla emneknagger til venstre",
11582
+ scrollTagsRight: "Bla emneknagger til høyre",
11583
+ copyMessage: "Kopier melding",
11584
+ copied: "Kopiert",
11585
+ like: "Liker",
11586
+ dislike: "Liker ikke",
11587
+ sourcesCited: "{count} kilder sitert",
11588
+ moreSources: "+{count} til"
11589
+ },
11590
+ fa: {
11591
+ removeAttachment: "حذف پیوست",
11592
+ categoryFilter: "فیلتر دسته‌بندی",
11593
+ filterByCategory: "فیلتر بر اساس دسته‌بندی",
11594
+ scrollCategoriesLeft: "پیمایش دسته‌بندی‌ها به چپ",
11595
+ scrollCategoriesRight: "پیمایش دسته‌بندی‌ها به راست",
11596
+ scrollTagsLeft: "پیمایش برچسب‌ها به چپ",
11597
+ scrollTagsRight: "پیمایش برچسب‌ها به راست",
11598
+ copyMessage: "کپی پیام",
11599
+ copied: "کپی شد",
11600
+ like: "پسندیدم",
11601
+ dislike: "نپسندیدم",
11602
+ sourcesCited: "{count} منبع ذکر شده",
11603
+ moreSources: "+{count} مورد دیگر"
11604
+ },
11605
+ pl: {
11606
+ removeAttachment: "Usuń załącznik",
11607
+ categoryFilter: "Filtr kategorii",
11608
+ filterByCategory: "Filtruj według kategorii",
11609
+ scrollCategoriesLeft: "Przewiń kategorie w lewo",
11610
+ scrollCategoriesRight: "Przewiń kategorie w prawo",
11611
+ scrollTagsLeft: "Przewiń tagi w lewo",
11612
+ scrollTagsRight: "Przewiń tagi w prawo",
11613
+ copyMessage: "Kopiuj wiadomość",
11614
+ copied: "Skopiowano",
11615
+ like: "Lubię to",
11616
+ dislike: "Nie lubię tego",
11617
+ sourcesCited: "Cytowane źródła: {count}",
11618
+ moreSources: "+{count} więcej"
11619
+ },
11620
+ pt: {
11621
+ removeAttachment: "Remover anexo",
11622
+ categoryFilter: "Filtro de categoria",
11623
+ filterByCategory: "Filtrar por categoria",
11624
+ scrollCategoriesLeft: "Rolar categorias para a esquerda",
11625
+ scrollCategoriesRight: "Rolar categorias para a direita",
11626
+ scrollTagsLeft: "Rolar etiquetas para a esquerda",
11627
+ scrollTagsRight: "Rolar etiquetas para a direita",
11628
+ copyMessage: "Copiar mensagem",
11629
+ copied: "Copiado",
11630
+ like: "Gostei",
11631
+ dislike: "Não gostei",
11632
+ sourcesCited: "{count} fontes citadas",
11633
+ moreSources: "+{count} mais"
11634
+ },
11635
+ ro: {
11636
+ removeAttachment: "Elimină atașamentul",
11637
+ categoryFilter: "Filtru de categorie",
11638
+ filterByCategory: "Filtrează după categorie",
11639
+ scrollCategoriesLeft: "Derulează categoriile la stânga",
11640
+ scrollCategoriesRight: "Derulează categoriile la dreapta",
11641
+ scrollTagsLeft: "Derulează etichetele la stânga",
11642
+ scrollTagsRight: "Derulează etichetele la dreapta",
11643
+ copyMessage: "Copiază mesajul",
11644
+ copied: "Copiat",
11645
+ like: "Îmi place",
11646
+ dislike: "Nu îmi place",
11647
+ sourcesCited: "Surse citate: {count}",
11648
+ moreSources: "+{count} în plus"
11649
+ },
11650
+ ru: {
11651
+ removeAttachment: "Удалить вложение",
11652
+ categoryFilter: "Фильтр категорий",
11653
+ filterByCategory: "Фильтровать по категории",
11654
+ scrollCategoriesLeft: "Прокрутить категории влево",
11655
+ scrollCategoriesRight: "Прокрутить категории вправо",
11656
+ scrollTagsLeft: "Прокрутить теги влево",
11657
+ scrollTagsRight: "Прокрутить теги вправо",
11658
+ copyMessage: "Копировать сообщение",
11659
+ copied: "Скопировано",
11660
+ like: "Нравится",
11661
+ dislike: "Не нравится",
11662
+ sourcesCited: "Цитируемые источники: {count}",
11663
+ moreSources: "+{count} ещё"
11664
+ },
11665
+ sr: {
11666
+ removeAttachment: "Уклони прилог",
11667
+ categoryFilter: "Филтер категорија",
11668
+ filterByCategory: "Филтрирај по категорији",
11669
+ scrollCategoriesLeft: "Скролуј категорије лево",
11670
+ scrollCategoriesRight: "Скролуј категорије десно",
11671
+ scrollTagsLeft: "Скролуј ознаке лево",
11672
+ scrollTagsRight: "Скролуј ознаке десно",
11673
+ copyMessage: "Копирај поруку",
11674
+ copied: "Копирано",
11675
+ like: "Свиђа ми се",
11676
+ dislike: "Не свиђа ми се",
11677
+ sourcesCited: "Цитирани извори: {count}",
11678
+ moreSources: "+{count} још"
11679
+ },
11680
+ sk: {
11681
+ removeAttachment: "Odstrániť prílohu",
11682
+ categoryFilter: "Filter kategórií",
11683
+ filterByCategory: "Filtrovať podľa kategórie",
11684
+ scrollCategoriesLeft: "Posunúť kategórie doľava",
11685
+ scrollCategoriesRight: "Posunúť kategórie doprava",
11686
+ scrollTagsLeft: "Posunúť štítky doľava",
11687
+ scrollTagsRight: "Posunúť štítky doprava",
11688
+ copyMessage: "Kopírovať správu",
11689
+ copied: "Skopírované",
11690
+ like: "Páči sa mi",
11691
+ dislike: "Nepáči sa mi",
11692
+ sourcesCited: "Citované zdroje: {count}",
11693
+ moreSources: "+{count} ďalšie"
11694
+ },
11695
+ sl: {
11696
+ removeAttachment: "Odstrani prilogo",
11697
+ categoryFilter: "Filter kategorij",
11698
+ filterByCategory: "Filtriraj po kategoriji",
11699
+ scrollCategoriesLeft: "Pomakni kategorije levo",
11700
+ scrollCategoriesRight: "Pomakni kategorije desno",
11701
+ scrollTagsLeft: "Pomakni oznake levo",
11702
+ scrollTagsRight: "Pomakni oznake desno",
11703
+ copyMessage: "Kopiraj sporočilo",
11704
+ copied: "Kopirano",
11705
+ like: "Všeč mi je",
11706
+ dislike: "Ni mi všeč",
11707
+ sourcesCited: "Navedeni viri: {count}",
11708
+ moreSources: "+{count} več"
11709
+ },
11710
+ sv: {
11711
+ removeAttachment: "Ta bort bilaga",
11712
+ categoryFilter: "Kategorifilter",
11713
+ filterByCategory: "Filtrera efter kategori",
11714
+ scrollCategoriesLeft: "Bläddra kategorier åt vänster",
11715
+ scrollCategoriesRight: "Bläddra kategorier åt höger",
11716
+ scrollTagsLeft: "Bläddra taggar åt vänster",
11717
+ scrollTagsRight: "Bläddra taggar åt höger",
11718
+ copyMessage: "Kopiera meddelande",
11719
+ copied: "Kopierat",
11720
+ like: "Gilla",
11721
+ dislike: "Gilla inte",
11722
+ sourcesCited: "{count} källor citerade",
11723
+ moreSources: "+{count} till"
11724
+ },
11725
+ th: {
11726
+ removeAttachment: "นำไฟล์แนบออก",
11727
+ categoryFilter: "ตัวกรองหมวดหมู่",
11728
+ filterByCategory: "กรองตามหมวดหมู่",
11729
+ scrollCategoriesLeft: "เลื่อนหมวดหมู่ไปทางซ้าย",
11730
+ scrollCategoriesRight: "เลื่อนหมวดหมู่ไปทางขวา",
11731
+ scrollTagsLeft: "เลื่อนแท็กไปทางซ้าย",
11732
+ scrollTagsRight: "เลื่อนแท็กไปทางขวา",
11733
+ copyMessage: "คัดลอกข้อความ",
11734
+ copied: "คัดลอกแล้ว",
11735
+ like: "ถูกใจ",
11736
+ dislike: "ไม่ถูกใจ",
11737
+ sourcesCited: "อ้างอิง {count} แหล่ง",
11738
+ moreSources: "อีก +{count}"
11739
+ },
11740
+ tr: {
11741
+ removeAttachment: "Eki kaldır",
11742
+ categoryFilter: "Kategori filtresi",
11743
+ filterByCategory: "Kategoriye göre filtrele",
11744
+ scrollCategoriesLeft: "Kategorileri sola kaydır",
11745
+ scrollCategoriesRight: "Kategorileri sağa kaydır",
11746
+ scrollTagsLeft: "Etiketleri sola kaydır",
11747
+ scrollTagsRight: "Etiketleri sağa kaydır",
11748
+ copyMessage: "Mesajı kopyala",
11749
+ copied: "Kopyalandı",
11750
+ like: "Beğen",
11751
+ dislike: "Beğenme",
11752
+ sourcesCited: "{count} kaynak alıntılandı",
11753
+ moreSources: "+{count} daha"
11754
+ },
11755
+ uk: {
11756
+ removeAttachment: "Видалити вкладення",
11757
+ categoryFilter: "Фільтр категорій",
11758
+ filterByCategory: "Фільтрувати за категорією",
11759
+ scrollCategoriesLeft: "Прокрутити категорії ліворуч",
11760
+ scrollCategoriesRight: "Прокрутити категорії праворуч",
11761
+ scrollTagsLeft: "Прокрутити теги ліворуч",
11762
+ scrollTagsRight: "Прокрутити теги праворуч",
11763
+ copyMessage: "Копіювати повідомлення",
11764
+ copied: "Скопійовано",
11765
+ like: "Подобається",
11766
+ dislike: "Не подобається",
11767
+ sourcesCited: "Цитовані джерела: {count}",
11768
+ moreSources: "+{count} ще"
11769
+ },
11770
+ ur: {
11771
+ removeAttachment: "منسلکہ ہٹائیں",
11772
+ categoryFilter: "زمرہ فلٹر",
11773
+ filterByCategory: "زمرے کے لحاظ سے فلٹر کریں",
11774
+ scrollCategoriesLeft: "زمرے بائیں طرف اسکرول کریں",
11775
+ scrollCategoriesRight: "زمرے دائیں طرف اسکرول کریں",
11776
+ scrollTagsLeft: "ٹیگز بائیں طرف اسکرول کریں",
11777
+ scrollTagsRight: "ٹیگز دائیں طرف اسکرول کریں",
11778
+ copyMessage: "پیغام کاپی کریں",
11779
+ copied: "کاپی ہو گیا",
11780
+ like: "پسند",
11781
+ dislike: "ناپسند",
11782
+ sourcesCited: "{count} حوالہ جاتی ذرائع",
11783
+ moreSources: "+{count} مزید"
11784
+ },
11785
+ vi: {
11786
+ removeAttachment: "Xóa tệp đính kèm",
11787
+ categoryFilter: "Bộ lọc danh mục",
11788
+ filterByCategory: "Lọc theo danh mục",
11789
+ scrollCategoriesLeft: "Cuộn danh mục sang trái",
11790
+ scrollCategoriesRight: "Cuộn danh mục sang phải",
11791
+ scrollTagsLeft: "Cuộn thẻ sang trái",
11792
+ scrollTagsRight: "Cuộn thẻ sang phải",
11793
+ copyMessage: "Sao chép tin nhắn",
11794
+ copied: "Đã sao chép",
11795
+ like: "Thích",
11796
+ dislike: "Không thích",
11797
+ sourcesCited: "Đã trích dẫn {count} nguồn",
11798
+ moreSources: "+{count} nữa"
11799
+ }
11800
+ };
11117
11801
  const ONBOARDING_PLACEHOLDERS = {
11118
11802
  en: {
11119
11803
  onboardingNamePlaceholder: "Please enter your name",
@@ -11398,7 +12082,7 @@
11398
12082
  const normalized = normalizeLocale(locale);
11399
12083
  const dict = DICTIONARIES[normalized] || EN;
11400
12084
  const onboarding = ONBOARDING_PLACEHOLDERS[normalized];
11401
- return onboarding?.[key] ?? dict[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? EN[key] ?? key;
12085
+ return onboarding?.[key] ?? dict[key] ?? A11Y_LABELS[normalized]?.[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? A11Y_LABELS.en[key] ?? EN[key] ?? key;
11402
12086
  }
11403
12087
  function createTranslator(locale) {
11404
12088
  const normalized = normalizeLocale(locale);
@@ -11911,81 +12595,99 @@
11911
12595
  };
11912
12596
 
11913
12597
  /**
11914
- * Greeting personalisation using the onboarding-collected name.
12598
+ * Greeting personalisation using the onboarding-collected name, shared by
12599
+ * the agent-sdk, the widget and the frontend Testing Lab (EV-4798 MERN-19).
11915
12600
  *
11916
12601
  * Product (2026-07-20): once onboarding captures the user's name, every
11917
- * greeting (initial / follow-up / re-entry) should address them by it -
11918
- * "Hi, how can I help you?" → "Hi Rishabh, how can I help you?" - and a name
11919
- * typed all-lowercase is title-cased first ("rishabh" → "Rishabh").
12602
+ * greeting (initial / follow-up / re-entry) addresses them by it - "Hi, how
12603
+ * can I help you?" -> "Hi Rishabh, how can I help you?" - and a name typed
12604
+ * all-lowercase is title-cased first ("rishabh" -> "Rishabh"). The name is
12605
+ * injected after the greeting's leading salutation so the org's configured
12606
+ * wording is kept. No name, no change, so callers apply it unconditionally.
11920
12607
  *
11921
- * This is a byte-for-byte port of the agent-sdk helper
11922
- * (packages/agent-sdk/src/lib/personalizeGreeting.ts), which carries the unit
11923
- * tests for this logic - the widget bundles via rollup and can't import across
11924
- * package boundaries, so the logic is duplicated here rather than shared. Keep
11925
- * the two in sync; the SDK version is the source of truth.
12608
+ * Plain JavaScript (types in personalizeGreeting.d.ts), conservative syntax:
12609
+ * the widget's Rollup/Babel build compiles neither TypeScript nor this file.
11926
12610
  */
11927
12611
 
12612
+ function str(v) {
12613
+ return v === null || v === undefined ? '' : String(v);
12614
+ }
12615
+
11928
12616
  /**
11929
- * Title-case a person's name for display: "rishabh" → "Rishabh",
11930
- * "john doe" → "John Doe". Only the FIRST letter of each whitespace-separated
11931
- * word is upper-cased; the rest is left as-typed so intentional casing
11932
- * ("McDonald") isn't flattened. Collapses internal whitespace.
12617
+ * Title-case a person's name for display: "john doe" -> "John Doe". Only the
12618
+ * first letter of each word is upper-cased; the rest is left as typed so
12619
+ * intentional casing ("McDonald", "de la Cruz") is not flattened. Collapses
12620
+ * internal whitespace.
11933
12621
  */
11934
12622
  function capitalizeName(name) {
11935
- return String(name ?? "").trim().split(/\s+/).filter(Boolean).map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
12623
+ return str(name).trim().split(/\s+/).filter(Boolean).map(function (w) {
12624
+ return w.charAt(0).toUpperCase() + w.slice(1);
12625
+ }).join(' ');
11936
12626
  }
11937
12627
 
11938
12628
  /**
11939
- * Return `greeting` with the (title-cased) `name` injected after its leading
11940
- * salutation. No-op when `name` is empty/whitespace or `greeting` is blank, so
11941
- * callers can apply it unconditionally. Idempotent - applying twice can't
11942
- * double-inject the name.
12629
+ * Return `greeting` with the title-cased `name` injected after its leading
12630
+ * salutation:
12631
+ *
12632
+ * personalizeGreeting("Hi, how can I help you?", "rishabh")
12633
+ * -> "Hi Rishabh, how can I help you?"
12634
+ * personalizeGreeting("Hello! How can I help?", "john doe")
12635
+ * -> "Hello John Doe! How can I help?"
12636
+ * personalizeGreeting("Welcome to Acme", "sara")
12637
+ * -> "Hi Sara, Welcome to Acme"
12638
+ *
12639
+ * Idempotent: a greeting that already opens with "<salutation> <Name>" is
12640
+ * left alone, so applying twice cannot double-inject.
11943
12641
  */
11944
12642
  function personalizeGreeting(greeting, name) {
11945
- const g = greeting == null ? "" : String(greeting);
11946
- const clean = String(name ?? "").trim();
12643
+ const g = str(greeting);
12644
+ const clean = str(name).trim();
11947
12645
  if (!clean || !g.trim()) return g;
11948
12646
  const cap = capitalizeName(clean);
11949
12647
 
11950
- // Already personalised with this name → don't inject again.
11951
- const already = new RegExp(`^\\s*(?:hi|hey|hello)\\s+${cap.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
12648
+ // Already personalised with this name: do not inject again.
12649
+ const already = new RegExp('^\\s*(?:hi|hey|hello)\\s+' + cap.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\b', 'i');
11952
12650
  if (already.test(g)) return g;
11953
12651
 
11954
12652
  // Leading salutation ("Hi"/"Hey"/"Hello"), an optional "there", then any
11955
- // opening punctuation. Kept tight so "Welcome to Acme" isn't mangled.
12653
+ // opening punctuation. Kept tight so "Welcome to Acme" is not mangled into
12654
+ // "Welcome Sara, to Acme".
11956
12655
  const m = g.match(/^\s*(hi|hey|hello)(?:\s+there)?\s*([-,!.:;]+)?\s*/i);
11957
12656
  if (m) {
11958
12657
  const salutation = m[1];
11959
- const punct = m[2] ?? ",";
12658
+ const punct = m[2] !== undefined ? m[2] : ',';
11960
12659
  const rest = g.slice(m[0].length);
11961
- return `${salutation} ${cap}${punct}${rest ? ` ${rest}` : ""}`;
12660
+ return salutation + ' ' + cap + punct + (rest ? ' ' + rest : '');
11962
12661
  }
11963
12662
 
11964
- // No recognised salutation - prepend a fresh one.
11965
- return `Hi ${cap}, ${g}`;
12663
+ // No recognised salutation: prepend a fresh one.
12664
+ return 'Hi ' + cap + ', ' + g;
11966
12665
  }
12666
+ const NAME_FIELD_TYPES = new Set(['fullname', 'name', 'username']);
11967
12667
 
11968
12668
  /**
11969
- * Pull the user's name out of the widget's onboarding answers. The widget keys
11970
- * answers by `fieldType`, and the name lives in the FIRST question whose
12669
+ * Pull the user's name out of onboarding answers keyed by `fieldType` (the
12670
+ * widget and the Testing Lab preview). The name is the FIRST question whose
11971
12671
  * fieldType is a dedicated name type (fullName / name / userName,
11972
- * case-insensitive) - how the agent-builder configures the name field. A
11973
- * generic `text` field is deliberately NOT treated as a name (it's used for
11974
- * company / reason / etc.; guessing would produce "Hi <generic answer>").
11975
- * Returns "" when no name-type answer is present.
12672
+ * case-insensitive); a generic `text` field is deliberately not treated as a
12673
+ * name. "" when absent.
12674
+ *
12675
+ * The agent-sdk keys its answers by `askToType` instead and keeps its own
12676
+ * extractOnboardingName for that reason.
11976
12677
  */
11977
- const NAME_FIELD_TYPES = new Set(["fullname", "name", "username"]);
11978
12678
  function extractOnboardingName(questions, answers) {
11979
- if (!Array.isArray(questions) || !answers) return "";
11980
- for (const q of questions) {
11981
- const ft = String(q?.fieldType ?? "").toLowerCase();
12679
+ if (!Array.isArray(questions) || !answers) return '';
12680
+ for (let i = 0; i < questions.length; i += 1) {
12681
+ const q = questions[i];
12682
+ const fieldType = q ? q.fieldType : undefined;
12683
+ const ft = str(fieldType).toLowerCase();
11982
12684
  if (!NAME_FIELD_TYPES.has(ft)) continue;
11983
- const raw = answers[q?.fieldType ?? ""];
11984
- if (typeof raw !== "string") continue;
12685
+ const raw = answers[fieldType === null || fieldType === undefined ? '' : fieldType];
12686
+ if (typeof raw !== 'string') continue;
11985
12687
  const trimmed = raw.trim();
11986
12688
  if (trimmed) return trimmed;
11987
12689
  }
11988
- return "";
12690
+ return '';
11989
12691
  }
11990
12692
 
11991
12693
  // EV-4390: an agent's Inbox reply can carry files. The assistant bubble
@@ -12462,6 +13164,10 @@
12462
13164
  const data = await res.json();
12463
13165
  const serverMsgs = Array.isArray(data?.messages) ? data.messages : [];
12464
13166
  mergeAgentMessages(serverMsgs.filter(isRepliedOutsideStream));
13167
+ // EV-4823: a rating the agent requested while no stream was open (the
13168
+ // Inbox took the conversation over without telling the widget) was
13169
+ // pushed to no one and lost. The history carries it, as on mount.
13170
+ if (data?.csatRequest) setCsatRequest(data.csatRequest);
12465
13171
  } catch {
12466
13172
  /* network/parse failure - the live stream still carries new messages */
12467
13173
  }
@@ -13181,6 +13887,12 @@
13181
13887
  ...(attachmentsPayload.length ? {
13182
13888
  attachments: attachmentsPayload
13183
13889
  } : {}),
13890
+ // EV-4798 MERN-12: the approval card's answer by the held call's
13891
+ // id (utils/toolConfirmation.js). Only when the card carried the
13892
+ // id; the text above stays the message either way.
13893
+ ...(opts?.toolConfirmation ? {
13894
+ tool_confirmation: opts.toolConfirmation
13895
+ } : {}),
13184
13896
  messageHistory: messages.filter(msg => {
13185
13897
  // Filter out processing messages, empty messages, and onboarding messages
13186
13898
  return !msg.isProcessing && msg.content && msg.content.trim() && !['userName', 'email', 'phone'].includes(msg.type);
@@ -15543,12 +16255,13 @@
15543
16255
  * absolute http(s) URLs pass; anything else (javascript:, data:, vbscript:,
15544
16256
  * a bare relative path, non-string) is dropped rather than rendered.
15545
16257
  *
15546
- * EV-3956: the canonical copy lives in `@eshal/shared`
15547
- * (`src/a2ui/safeUrl.ts`). This package is published to npm while
15548
- * @eshal/shared is private, so it keeps its own copy rather than declaring
15549
- * a dependency consumers cannot resolve. Parity with the canonical version
15550
- * is enforced by packages/shared/src/__tests__/safeUrlParity.test.ts - if
15551
- * you change the logic here, change it there too or the build fails.
16258
+ * EV-3956 / EV-4798 MERN-19: this is the ONE implementation. The agent-sdk,
16259
+ * widget and frontend renderers all import this file (the published SDK and
16260
+ * widget bundle it at build time, so their consumers never resolve
16261
+ * @eshal/shared). A fix made here reaches all three surfaces. Do not re-inline.
16262
+ *
16263
+ * Plain JavaScript on purpose: the widget's Rollup/Babel build compiles no
16264
+ * TypeScript from another package. Types live in safeUrl.d.ts.
15552
16265
  */
15553
16266
  function safeUrl(u) {
15554
16267
  return typeof u === 'string' && /^https?:\/\//i.test(u) ? u : undefined;
@@ -16244,8 +16957,13 @@
16244
16957
  // state are common, unlike the desktop-first admin Inbox.
16245
16958
  function CopyMessageButton({
16246
16959
  content,
16247
- isDark
16960
+ isDark,
16961
+ t
16248
16962
  }) {
16963
+ // EV-4798 (MERN-21): localised accessible name; English when no translator
16964
+ // reaches this button.
16965
+ const copyLabel = t ? t("copyMessage") : "Copy message";
16966
+ const copiedLabel = t ? t("copied") : "Copied";
16249
16967
  const [copied, setCopied] = reactExports.useState(false);
16250
16968
  const handleCopy = reactExports.useCallback(() => {
16251
16969
  if (!content) return;
@@ -16264,8 +16982,8 @@
16264
16982
  WebkitAppearance: "none",
16265
16983
  cursor: "pointer"
16266
16984
  },
16267
- "aria-label": copied ? "Copied" : "Copy message",
16268
- title: copied ? "Copied" : "Copy message",
16985
+ "aria-label": copied ? copiedLabel : copyLabel,
16986
+ title: copied ? copiedLabel : copyLabel,
16269
16987
  children: copied ? /*#__PURE__*/jsxRuntimeExports.jsx(Check, {
16270
16988
  className: "w-3 h-3 text-green-500"
16271
16989
  }) : /*#__PURE__*/jsxRuntimeExports.jsx(Copy, {
@@ -16421,8 +17139,12 @@
16421
17139
  sourcesPreliminary: !!message.sourcesPreliminary,
16422
17140
  onSourceActivate,
16423
17141
  downloadingKey,
16424
- textColor: messageTextColor
16425
- }), [message.sources, message.sourcesPreliminary, onSourceActivate, downloadingKey, messageTextColor]);
17142
+ textColor: messageTextColor,
17143
+ // EV-4798 (MERN-21): the pill's accessible names follow the widget
17144
+ // locale. Optional on the reader side: a cross-bundle provider without
17145
+ // it falls back to English.
17146
+ t
17147
+ }), [message.sources, message.sourcesPreliminary, onSourceActivate, downloadingKey, messageTextColor, t]);
16426
17148
  return (
16427
17149
  /*#__PURE__*/
16428
17150
  // `min-w-0` on the outer flex-row mirrors the same guard in the
@@ -16526,7 +17248,8 @@
16526
17248
  children: formatTime(message.timestamp)
16527
17249
  }), !isTypingMessage && !message.isProcessing && displayContent && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
16528
17250
  content: displayContent,
16529
- isDark: isDark
17251
+ isDark: isDark,
17252
+ t: t
16530
17253
  }), allowFeedback !== false && onFeedback && !isTypingMessage && !message.isProcessing && displayContent && message.type !== 'welcome' && !message.isWelcome && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
16531
17254
  className: "flex items-center gap-0.5 ms-0.5",
16532
17255
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
@@ -16540,7 +17263,8 @@
16540
17263
  WebkitAppearance: "none",
16541
17264
  cursor: "pointer"
16542
17265
  },
16543
- "aria-label": "Like",
17266
+ "aria-label": t("like"),
17267
+ "aria-pressed": activeFeedback === 'like',
16544
17268
  children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsUp, {
16545
17269
  className: "w-3 h-3"
16546
17270
  })
@@ -16555,7 +17279,8 @@
16555
17279
  WebkitAppearance: "none",
16556
17280
  cursor: "pointer"
16557
17281
  },
16558
- "aria-label": "Dislike",
17282
+ "aria-label": t("dislike"),
17283
+ "aria-pressed": activeFeedback === 'dislike',
16559
17284
  children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsDown, {
16560
17285
  className: "w-3 h-3"
16561
17286
  })
@@ -16731,7 +17456,8 @@
16731
17456
  children: formatTime(message.timestamp)
16732
17457
  }), message.content && message.content.trim() !== "" && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
16733
17458
  content: message.content,
16734
- isDark: isDark
17459
+ isDark: isDark,
17460
+ t: t
16735
17461
  })]
16736
17462
  }), message.status === "failed" && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
16737
17463
  className: "flex items-center gap-1.5 mt-1 px-1",
@@ -17024,7 +17750,8 @@
17024
17750
  isRtl,
17025
17751
  onQuestionClick,
17026
17752
  applyHoverState,
17027
- headingLabel
17753
+ headingLabel,
17754
+ defaultLanguage
17028
17755
  }) => {
17029
17756
  const scrollRef = reactExports.useRef(null);
17030
17757
  const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
@@ -17071,7 +17798,7 @@
17071
17798
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
17072
17799
  onClick: () => scroll("left"),
17073
17800
  disabled: !canScrollLeft,
17074
- "aria-label": "Scroll left",
17801
+ "aria-label": translate(defaultLanguage, "scrollLeft"),
17075
17802
  className: "flex-shrink-0 flex items-center justify-center w-7 h-7 rounded-full shadow-sm transition-all duration-200 hover:shadow-md active:scale-95",
17076
17803
  style: {
17077
17804
  backgroundColor: arrowBg,
@@ -17131,7 +17858,7 @@
17131
17858
  }), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
17132
17859
  onClick: () => scroll("right"),
17133
17860
  disabled: !canScrollRight,
17134
- "aria-label": "Scroll right",
17861
+ "aria-label": translate(defaultLanguage, "scrollRight"),
17135
17862
  className: "flex-shrink-0 flex items-center justify-center w-7 h-7 rounded-full shadow-sm transition-all duration-200 hover:shadow-md active:scale-95",
17136
17863
  style: {
17137
17864
  backgroundColor: arrowBg,
@@ -17167,7 +17894,9 @@
17167
17894
  userTextColor,
17168
17895
  // Optional localized heading rendered above the vertical pill list,
17169
17896
  // styled to match the inline category picker's helper-text heading.
17170
- headingLabel
17897
+ headingLabel,
17898
+ // Locale for the scroll arrows' accessible names (EV-4798 MERN-21).
17899
+ defaultLanguage = "en"
17171
17900
  }) => {
17172
17901
  if (!questions.length || isTyping) {
17173
17902
  return null;
@@ -17190,7 +17919,8 @@
17190
17919
  isRtl: isRtl,
17191
17920
  onQuestionClick: onQuestionClick,
17192
17921
  applyHoverState: applyHoverState,
17193
- headingLabel: headingLabel
17922
+ headingLabel: headingLabel,
17923
+ defaultLanguage: defaultLanguage
17194
17924
  });
17195
17925
  }
17196
17926
 
@@ -17667,6 +18397,47 @@
17667
18397
  return result;
17668
18398
  }
17669
18399
 
18400
+ /**
18401
+ * Framework-free A2UI core shared by the three A2uiBlock renderers - the
18402
+ * agent-sdk, the widget and the frontend Testing Lab (EV-4798 MERN-19).
18403
+ *
18404
+ * It owns what the renderers must agree on and that is not presentation:
18405
+ * - the component registry: which `type` values route to a chart and which
18406
+ * to a component, and how a type string is normalised;
18407
+ * - sanitizeChartTitle: no DB/SQL annotation reaches a visible title;
18408
+ * - toolConfirmationFor: the structured answer of an approval card;
18409
+ * - linkSegments: which spans of card text become links (every href passes
18410
+ * safeUrl, so a `javascript:` link stays plain text);
18411
+ * - matchAnsweredChoice / findNextUserAnswer: the answered state of a
18412
+ * one-shot card, read from conversation history.
18413
+ *
18414
+ * Each renderer keeps its own components and styling (inline SVG in the SDK,
18415
+ * lucide + inline styles in the widget, Tailwind + shadcn in the frontend).
18416
+ *
18417
+ * Plain JavaScript (types in a2ui.d.ts) because the widget's Rollup/Babel
18418
+ * build compiles no TypeScript from another package; conservative syntax
18419
+ * (no `??`, no `?.`) because that build does not run this file through its
18420
+ * Babel preset either.
18421
+ */
18422
+ function firstDefined(a, b) {
18423
+ return a !== null && a !== undefined ? a : b;
18424
+ }
18425
+
18426
+ /**
18427
+ * The text of the first delivered user message after `index`, or undefined
18428
+ * when the assistant message at `index` has not been answered yet. A user
18429
+ * turn whose send failed never reached the agent, so it does not count.
18430
+ */
18431
+ function findNextUserAnswer(messages, index) {
18432
+ const list = messages || [];
18433
+ for (let i = index + 1; i < list.length; i += 1) {
18434
+ const m = list[i];
18435
+ if (!m || m.role !== 'user' || m.sendFailed) continue;
18436
+ return typeof m.content === 'string' ? m.content : String(firstDefined(m.content, ''));
18437
+ }
18438
+ return undefined;
18439
+ }
18440
+
17670
18441
  // Kept in its own tiny module (not A2uiBlock.jsx): MessageList imports it
17671
18442
  // eagerly, and A2uiBlock/MarkdownRenderer are lazy-loaded to keep charts and
17672
18443
  // react-markdown out of the widget's initial bundle.
@@ -17679,16 +18450,6 @@
17679
18450
  // threaded through MessageBubble -> StreamingMarkdown -> MarkdownRenderer.
17680
18451
  const A2uiAnsweredContext = /*#__PURE__*/reactExports.createContext(undefined);
17681
18452
 
17682
- /** First delivered user turn after `index`, or undefined (see above). */
17683
- function findNextUserAnswer(messages, index) {
17684
- for (let i = index + 1; i < (messages || []).length; i += 1) {
17685
- const m = messages[i];
17686
- if (m?.role !== 'user' || m.sendFailed) continue;
17687
- return typeof m.content === 'string' ? m.content : String(m.content ?? '');
17688
- }
17689
- return undefined;
17690
- }
17691
-
17692
18453
  const MessageList = ({
17693
18454
  messages = [],
17694
18455
  isDark,
@@ -18041,7 +18802,8 @@
18041
18802
  resolvedUserMessageColor: resolvedUserMessageColor,
18042
18803
  userMessageBoxColor: userMessageBoxColor,
18043
18804
  userTextColor: userTextColor,
18044
- headingLabel: quickQuestionsHeadingLabel
18805
+ headingLabel: quickQuestionsHeadingLabel,
18806
+ defaultLanguage: defaultLanguage
18045
18807
  })
18046
18808
  }), isVoiceSessionActive && voiceStatus === "connected" && !isLoading && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
18047
18809
  className: "flex gap-3 flex-row-reverse animate-in",
@@ -18676,10 +19438,14 @@
18676
19438
  }
18677
19439
  return `${val.toFixed(val >= 10 ? 0 : 1)} ${units[unit]}`;
18678
19440
  }
19441
+
19442
+ // removeLabel: the remove button's accessible name, localised by the caller
19443
+ // (EV-4798 MERN-21). Defaults to the English the chip always shipped.
18679
19444
  function AttachmentChip({
18680
19445
  attachment,
18681
19446
  onRemove,
18682
- isDark
19447
+ isDark,
19448
+ removeLabel = "Remove attachment"
18683
19449
  }) {
18684
19450
  const isError = attachment.status === "error";
18685
19451
  const isUploading = attachment.status === "uploading";
@@ -18696,6 +19462,7 @@
18696
19462
  color: textColor,
18697
19463
  maxWidth: 240
18698
19464
  },
19465
+ role: "group",
18699
19466
  title: isError ? attachment.error?.message : attachment.filename,
18700
19467
  "aria-label": statusLabel,
18701
19468
  children: [isError ? /*#__PURE__*/jsxRuntimeExports.jsx(CircleAlert, {
@@ -18731,7 +19498,7 @@
18731
19498
  color: textColor,
18732
19499
  cursor: "pointer"
18733
19500
  },
18734
- "aria-label": "Remove attachment",
19501
+ "aria-label": removeLabel,
18735
19502
  children: /*#__PURE__*/jsxRuntimeExports.jsx(X, {
18736
19503
  size: 12
18737
19504
  })
@@ -19273,7 +20040,8 @@
19273
20040
  children: attachments.map(att => /*#__PURE__*/jsxRuntimeExports.jsx(AttachmentChip, {
19274
20041
  attachment: att,
19275
20042
  onRemove: removeAttachment,
19276
- isDark: isDark
20043
+ isDark: isDark,
20044
+ removeLabel: t("removeAttachment")
19277
20045
  }, att.id))
19278
20046
  }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
19279
20047
  className: "flex items-center px-5 gap-1.5",
@@ -19634,6 +20402,80 @@
19634
20402
  };
19635
20403
  }
19636
20404
 
20405
+ /**
20406
+ * Keyboard helpers for the widget's menus and custom controls
20407
+ * (EV-4798, MERN-21).
20408
+ *
20409
+ * The widget renders inside a Shadow DOM, where `document.activeElement`
20410
+ * resolves to the shadow host rather than the focused control. Every helper
20411
+ * here therefore asks the container's own root node (the shadow root inside
20412
+ * the widget, the document elsewhere) which element has focus.
20413
+ */
20414
+
20415
+ const MENU_ITEM_SELECTOR = '[role="menuitem"]';
20416
+
20417
+ /** The focused element in the tree that holds `container`. */
20418
+ function activeElementIn(container) {
20419
+ const root = container && typeof container.getRootNode === "function" ? container.getRootNode() : null;
20420
+ return root && root.activeElement || document.activeElement;
20421
+ }
20422
+ function menuItems(container, selector) {
20423
+ if (!container) return [];
20424
+ return Array.from(container.querySelectorAll(selector)).filter(el => !el.disabled && el.getAttribute("aria-disabled") !== "true");
20425
+ }
20426
+
20427
+ /**
20428
+ * Arrow-key navigation for a `role="menu"`: ArrowDown / ArrowUp move to the
20429
+ * next / previous item (wrapping), Home / End jump to the first / last.
20430
+ * Returns true when the key was handled so the caller can stop there.
20431
+ */
20432
+ function handleMenuArrowKeys(event, container, selector = MENU_ITEM_SELECTOR) {
20433
+ const {
20434
+ key
20435
+ } = event;
20436
+ if (key !== "ArrowDown" && key !== "ArrowUp" && key !== "Home" && key !== "End") {
20437
+ return false;
20438
+ }
20439
+ const items = menuItems(container, selector);
20440
+ if (items.length === 0) return false;
20441
+ event.preventDefault();
20442
+ const index = items.indexOf(activeElementIn(container));
20443
+ let next;
20444
+ if (key === "Home") next = 0;else if (key === "End") next = items.length - 1;else if (key === "ArrowDown") next = index < 0 ? 0 : (index + 1) % items.length;else next = index < 0 ? items.length - 1 : (index - 1 + items.length) % items.length;
20445
+ items[next].focus();
20446
+ return true;
20447
+ }
20448
+
20449
+ /**
20450
+ * Keep Tab inside an open menu: Tab on the last item wraps to the first,
20451
+ * Shift+Tab on the first wraps to the last. Returns true when it moved focus.
20452
+ */
20453
+ function trapMenuTab(event, container, selector = MENU_ITEM_SELECTOR) {
20454
+ if (event.key !== "Tab") return false;
20455
+ const items = menuItems(container, selector);
20456
+ if (items.length === 0) return false;
20457
+ const first = items[0];
20458
+ const last = items[items.length - 1];
20459
+ const active = activeElementIn(container);
20460
+ if (event.shiftKey && active === first) {
20461
+ event.preventDefault();
20462
+ last.focus();
20463
+ return true;
20464
+ }
20465
+ if (!event.shiftKey && active === last) {
20466
+ event.preventDefault();
20467
+ first.focus();
20468
+ return true;
20469
+ }
20470
+ return false;
20471
+ }
20472
+
20473
+ /** Focus the first item of a menu container, if it has one. */
20474
+ function focusFirstMenuItem(container, selector = MENU_ITEM_SELECTOR) {
20475
+ const [first] = menuItems(container, selector);
20476
+ first?.focus();
20477
+ }
20478
+
19637
20479
  const ChatHeader = ({
19638
20480
  conciergeName,
19639
20481
  companyName,
@@ -19810,7 +20652,11 @@
19810
20652
  })
19811
20653
  }), showMenu && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
19812
20654
  role: "menu",
19813
- "aria-label": t("menu"),
20655
+ "aria-label": t("menu")
20656
+ // EV-4798 (MERN-21): a menu container must be focusable to
20657
+ // carry its keyboard handling; -1 keeps it out of the Tab order.
20658
+ ,
20659
+ tabIndex: -1,
19814
20660
  dir: isRtl ? "rtl" : "ltr",
19815
20661
  onKeyDown: event => {
19816
20662
  if (event.key === "Escape") {
@@ -19818,26 +20664,18 @@
19818
20664
  setShowMenu(false);
19819
20665
  return;
19820
20666
  }
20667
+ // EV-4798 (MERN-21): Arrow Up/Down, Home and End move between
20668
+ // the items, as a role="menu" promises assistive tech.
20669
+ if (handleMenuArrowKeys(event, menuRef.current)) return;
19821
20670
  // EV-3332: keep Tab focus inside the open menu. Focus enters on
19822
20671
  // open and returns to the trigger on close (effect above), but
19823
20672
  // without this a Tab from the last item / Shift+Tab from the
19824
20673
  // first escaped into the page behind the menu - the gap QA
19825
20674
  // flagged (a real trap already exists on CitationPill; the
19826
20675
  // header menu had Escape-only). Cycle within the menuitems.
19827
- if (event.key === "Tab") {
19828
- const items = menuRef.current ? Array.from(menuRef.current.querySelectorAll('[role="menuitem"]')) : [];
19829
- if (items.length === 0) return;
19830
- const first = items[0];
19831
- const last = items[items.length - 1];
19832
- const active = document.activeElement;
19833
- if (event.shiftKey && active === first) {
19834
- event.preventDefault();
19835
- last.focus();
19836
- } else if (!event.shiftKey && active === last) {
19837
- event.preventDefault();
19838
- first.focus();
19839
- }
19840
- }
20676
+ // The focused item is read from the menu's own root node, so
20677
+ // the trap also works inside the widget's Shadow DOM.
20678
+ trapMenuTab(event, menuRef.current);
19841
20679
  },
19842
20680
  className: `absolute top-full mt-1 w-44 rounded-xl border shadow-lg py-1 z-[9999] animate-in fade-in slide-in-from-top-1 duration-150 ${isRtl ? "left-0" : "right-0"} ${isDark ? "bg-gray-800 border-gray-700" : "bg-white border-gray-200"}`,
19843
20681
  style: {
@@ -20128,8 +20966,10 @@
20128
20966
  isDark = false,
20129
20967
  primaryColor = "#2563eb",
20130
20968
  fontFamily = "Inter",
20131
- isRtl = false
20969
+ isRtl = false,
20970
+ defaultLanguage = "en"
20132
20971
  }) => {
20972
+ const t = reactExports.useMemo(() => createTranslator(defaultLanguage), [defaultLanguage]);
20133
20973
  const scrollRef = reactExports.useRef(null);
20134
20974
  const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
20135
20975
  const [canScrollRight, setCanScrollRight] = reactExports.useState(false);
@@ -20176,12 +21016,12 @@
20176
21016
  direction: isRtl ? "rtl" : "ltr"
20177
21017
  },
20178
21018
  role: "region",
20179
- "aria-label": "Filter by category",
21019
+ "aria-label": t("filterByCategory"),
20180
21020
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
20181
21021
  type: "button",
20182
21022
  onClick: () => scroll("left"),
20183
21023
  disabled: !canScrollLeft,
20184
- "aria-label": "Scroll categories left",
21024
+ "aria-label": t("scrollCategoriesLeft"),
20185
21025
  className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
20186
21026
  style: {
20187
21027
  backgroundColor: arrowBg,
@@ -20225,7 +21065,7 @@
20225
21065
  type: "button",
20226
21066
  onClick: () => scroll("right"),
20227
21067
  disabled: !canScrollRight,
20228
- "aria-label": "Scroll categories right",
21068
+ "aria-label": t("scrollCategoriesRight"),
20229
21069
  className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
20230
21070
  style: {
20231
21071
  backgroundColor: arrowBg,
@@ -20262,7 +21102,9 @@
20262
21102
  fontFamily = "Inter",
20263
21103
  fontSize = "14px",
20264
21104
  isRtl = false,
20265
- label = "Choose a topic to get started:"
21105
+ label = "Choose a topic to get started:",
21106
+ // Accessible name of the region; the caller passes the localised one.
21107
+ regionLabel = "Category filter"
20266
21108
  }) => {
20267
21109
  if (!Array.isArray(categories) || categories.length === 0) return null;
20268
21110
  const helperColor = isDark ? "#9ca3af" : "#6b7280";
@@ -20274,7 +21116,7 @@
20274
21116
  paddingRight: isRtl ? 50 : undefined
20275
21117
  },
20276
21118
  role: "region",
20277
- "aria-label": "Category filter",
21119
+ "aria-label": regionLabel,
20278
21120
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
20279
21121
  className: "mb-2",
20280
21122
  style: {
@@ -20462,7 +21304,10 @@
20462
21304
  children: ratings.map(rating => /*#__PURE__*/jsxRuntimeExports.jsx("button", {
20463
21305
  onClick: () => handleRating(rating.value),
20464
21306
  disabled: disabled || isSubmitting,
20465
- className: cn("flex items-center justify-center text-2xl transition-transform", "bg-transparent border-0 p-0 cursor-pointer", "hover:scale-110 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed", "focus:outline-none focus:ring-0", selectedRating === rating.value ? "" : "opacity-80"),
21307
+ className: cn("flex items-center justify-center text-2xl transition-transform", "bg-transparent border-0 p-0 cursor-pointer", "hover:scale-110 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed", "focus:outline-none focus:ring-0",
21308
+ // EV-4798 (MERN-21): keyboard focus stays visible; the
21309
+ // mouse-focus reset above is unchanged.
21310
+ "rounded-md focus-visible:ring-2 focus-visible:ring-blue-700", selectedRating === rating.value ? "" : "opacity-80"),
20466
21311
  children: /*#__PURE__*/jsxRuntimeExports.jsx("span", {
20467
21312
  role: "img",
20468
21313
  "aria-label": `${t("rate")} ${rating.value}`,
@@ -20511,7 +21356,9 @@
20511
21356
  onClick: () => handleRating(rating.value),
20512
21357
  onMouseEnter: () => setHoveredStar(rating.value),
20513
21358
  disabled: disabled || isSubmitting,
20514
- className: cn("flex items-center justify-center text-2xl", "bg-transparent border-0 p-0 cursor-pointer focus:outline-none", "disabled:opacity-50 disabled:cursor-not-allowed"),
21359
+ className: cn("flex items-center justify-center text-2xl", "bg-transparent border-0 p-0 cursor-pointer focus:outline-none",
21360
+ // EV-4798 (MERN-21): visible keyboard focus.
21361
+ "rounded-md focus-visible:ring-2 focus-visible:ring-blue-700", "disabled:opacity-50 disabled:cursor-not-allowed"),
20515
21362
  style: {
20516
21363
  transform: isHovered ? "scale(1.25)" : "scale(1)",
20517
21364
  filter: isHovered ? "brightness(1.1) drop-shadow(0 2px 4px rgba(0,0,0,0.15))" : "none",
@@ -20869,7 +21716,14 @@
20869
21716
  if (prompt && typeof prompt === "object") {
20870
21717
  reportChipClick(text, prompt, index);
20871
21718
  }
20872
- if (onPromptSuggestionClick) onPromptSuggestionClick(text);else onDirectSend?.(text);
21719
+ // EV-4798 MERN-12: an approval card's pick arrives as
21720
+ // (value, label, { toolConfirmation }) from A2uiBlock's Confirmation.
21721
+ // The structured answer rides on the send; the text is still the
21722
+ // message. A host override (onPromptSuggestionClick) keeps the text.
21723
+ const toolConfirmation = index && typeof index === "object" && index.toolConfirmation ? index.toolConfirmation : null;
21724
+ if (onPromptSuggestionClick) onPromptSuggestionClick(text);else if (toolConfirmation) onDirectSend?.(text, undefined, {
21725
+ toolConfirmation
21726
+ });else onDirectSend?.(text);
20873
21727
  }, [onPromptSuggestionClick, onDirectSend, reportChipClick]);
20874
21728
 
20875
21729
  // ─── Resizable widget ────────────────────────────────────────────
@@ -21415,7 +22269,9 @@
21415
22269
  onClick: handleResolveSubmission,
21416
22270
  disabled: resolveRating === 0 || isSubmittingResolve,
21417
22271
  "aria-describedby": resolveRating === 0 ? "resolve-rating-hint" : undefined,
21418
- className: cn("w-full py-3.5 rounded-xl text-sm font-semibold [font-family:inherit] transition-all duration-200 border-none outline-none focus:outline-none active:outline-none focus:ring-0 active:ring-0", "disabled:opacity-50 disabled:cursor-not-allowed", isDark ? "bg-gray-700 text-gray-100 hover:bg-gray-600" : "bg-gray-100 text-gray-700 hover:bg-gray-200"),
22272
+ className: cn("w-full py-3.5 rounded-xl text-sm font-semibold [font-family:inherit] transition-all duration-200 border-none outline-none focus:outline-none active:outline-none focus:ring-0 active:ring-0", "disabled:opacity-50 disabled:cursor-not-allowed",
22273
+ // EV-4798 (MERN-21): keyboard focus stays visible.
22274
+ "focus-visible:ring-2 focus-visible:ring-blue-700", isDark ? "bg-gray-700 text-gray-100 hover:bg-gray-600" : "bg-gray-100 text-gray-700 hover:bg-gray-200"),
21419
22275
  children: isSubmittingResolve ? t("submitting") : t("submitFeedback")
21420
22276
  }), resolveRating === 0 && !isSubmittingResolve && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
21421
22277
  id: "resolve-rating-hint",
@@ -21505,7 +22361,8 @@
21505
22361
  isDark: isDark,
21506
22362
  primaryColor: primaryColor,
21507
22363
  fontFamily: fontFamily,
21508
- isRtl: isRtlLanguage
22364
+ isRtl: isRtlLanguage,
22365
+ defaultLanguage: defaultLanguage
21509
22366
  }), !isMinimized && /*#__PURE__*/jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
21510
22367
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
21511
22368
  ref: messagesContainerRef,
@@ -21585,7 +22442,8 @@
21585
22442
  fontFamily: fontFamily,
21586
22443
  fontSize: fontSize,
21587
22444
  isRtl: isRtlLanguage,
21588
- label: t("chooseTopicLabel")
22445
+ label: t("chooseTopicLabel"),
22446
+ regionLabel: t("categoryFilter")
21589
22447
  }) : null,
21590
22448
  quickQuestionsHeadingLabel: filterEnabled ? t("quickQuestionsHeadingLabel") : undefined
21591
22449
  }), (showCsat && csatEnabled || csatRequest) && !csatSubmitted && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
@@ -21779,12 +22637,20 @@
21779
22637
  };
21780
22638
  }
21781
22639
 
21782
- // EV-4233: multi-channel entry point. An operator can list other channels
21783
- // (WhatsApp, Telegram, Messenger, Instagram) next to the in-widget chat; the
21784
- // launcher then opens a small picker instead of the chat panel directly.
21785
- // Only https deep links on each channel's own host are accepted so a
21786
- // misconfigured or injected value cannot turn the launcher into an open
21787
- // redirect to an arbitrary site.
22640
+ /**
22641
+ * EV-4233: multi-channel entry point, shared by the widget and the agent-sdk
22642
+ * (EV-4798 MERN-19). An operator can list other channels (WhatsApp,
22643
+ * Telegram, Messenger, Instagram) next to the in-widget chat; the launcher
22644
+ * then opens a small picker instead of the chat panel directly.
22645
+ *
22646
+ * Only https deep links on each channel's own host are accepted, so a
22647
+ * misconfigured or injected value cannot turn the launcher into an open
22648
+ * redirect to an arbitrary site. One copy, so a tightened host list reaches
22649
+ * both surfaces.
22650
+ *
22651
+ * Plain JavaScript (types in channelLinks.d.ts), conservative syntax: the
22652
+ * widget's Rollup/Babel build compiles neither TypeScript nor this file.
22653
+ */
21788
22654
 
21789
22655
  const CHANNEL_HOSTS = {
21790
22656
  whatsapp: ['wa.me', 'api.whatsapp.com'],
@@ -21801,20 +22667,21 @@
21801
22667
  function normalizeChannelLinks(links) {
21802
22668
  if (!Array.isArray(links)) return [];
21803
22669
  const out = [];
21804
- for (const link of links) {
22670
+ for (let i = 0; i < links.length; i += 1) {
22671
+ const link = links[i];
21805
22672
  if (!link || typeof link !== 'object') continue;
21806
22673
  const type = typeof link.type === 'string' ? link.type.toLowerCase() : '';
21807
- const hosts = CHANNEL_HOSTS[type];
22674
+ const hosts = Object.prototype.hasOwnProperty.call(CHANNEL_HOSTS, type) ? CHANNEL_HOSTS[type] : undefined;
21808
22675
  if (!hosts || typeof link.url !== 'string') continue;
21809
22676
  let parsed;
21810
22677
  try {
21811
22678
  parsed = new URL(link.url);
21812
- } catch {
22679
+ } catch (e) {
21813
22680
  continue;
21814
22681
  }
21815
- if (parsed.protocol !== 'https:' || !hosts.includes(parsed.hostname.toLowerCase())) continue;
22682
+ if (parsed.protocol !== 'https:' || hosts.indexOf(parsed.hostname.toLowerCase()) === -1) continue;
21816
22683
  out.push({
21817
- type,
22684
+ type: type,
21818
22685
  url: parsed.toString(),
21819
22686
  label: typeof link.label === 'string' && link.label.trim() ? link.label.trim() : CHANNEL_LABELS[type]
21820
22687
  });
@@ -21839,6 +22706,30 @@
21839
22706
  const links = reactExports.useMemo(() => normalizeChannelLinks(channelLinks), [channelLinks]);
21840
22707
  const [pickerOpen, setPickerOpen] = reactExports.useState(false);
21841
22708
  const hasPicker = links.length > 0;
22709
+
22710
+ // EV-4798 (MERN-21): keyboard support for the channel picker menu. Focus
22711
+ // moves to the first option when it opens, Escape closes it and returns
22712
+ // focus to the launcher, and the arrow keys move between options. The
22713
+ // launcher ref is kept locally as well as forwarded to the caller.
22714
+ const pickerRef = reactExports.useRef(null);
22715
+ const launcherRef = reactExports.useRef(null);
22716
+ const setLauncherRef = reactExports.useCallback(node => {
22717
+ launcherRef.current = node;
22718
+ if (typeof ref === "function") ref(node);else if (ref) ref.current = node;
22719
+ }, [ref]);
22720
+ const pickerVisible = hasPicker && pickerOpen && !isOpen;
22721
+ reactExports.useEffect(() => {
22722
+ if (pickerVisible) focusFirstMenuItem(pickerRef.current);
22723
+ }, [pickerVisible]);
22724
+ const handlePickerKeyDown = event => {
22725
+ if (event.key === "Escape") {
22726
+ event.preventDefault();
22727
+ setPickerOpen(false);
22728
+ launcherRef.current?.focus();
22729
+ return;
22730
+ }
22731
+ handleMenuArrowKeys(event, pickerRef.current);
22732
+ };
21842
22733
  const launcherBg = primaryColor;
21843
22734
  const iconColor = headerTextColor || "#FFFFFF";
21844
22735
  const handleLauncherClick = () => {
@@ -21867,9 +22758,12 @@
21867
22758
  };
21868
22759
  return /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
21869
22760
  className: `relative ${className || ""}`,
21870
- children: [hasPicker && pickerOpen && !isOpen && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
22761
+ children: [pickerVisible && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
22762
+ ref: pickerRef,
21871
22763
  role: "menu",
21872
22764
  "aria-label": t("chooseChannel"),
22765
+ tabIndex: -1,
22766
+ onKeyDown: handlePickerKeyDown,
21873
22767
  "data-testid": "channel-picker",
21874
22768
  style: {
21875
22769
  position: "absolute",
@@ -21898,7 +22792,7 @@
21898
22792
  children: link.label
21899
22793
  }, `${link.type}-${link.url}`))]
21900
22794
  }), /*#__PURE__*/jsxRuntimeExports.jsxs("button", {
21901
- ref: ref,
22795
+ ref: setLauncherRef,
21902
22796
  onClick: handleLauncherClick,
21903
22797
  className: "group relative w-16 h-16 rounded-full shadow-2xl transition-all duration-300 flex items-center justify-center text-white overflow-hidden hover:scale-110",
21904
22798
  style: {
@@ -21943,7 +22837,7 @@
21943
22837
  * value by its own test (that constant sat at 0.1.113 while this package was
21944
22838
  * at 0.2.2 precisely because nothing enforced it - EV-2431).
21945
22839
  */
21946
- const WIDGET_VERSION = '0.2.28';
22840
+ const WIDGET_VERSION = '0.2.30';
21947
22841
 
21948
22842
  /**
21949
22843
  * API utility functions