@eshal-bot/chat-widget 0.2.27 → 0.2.29

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,10 +9024,88 @@
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
+ }
9032
+ };
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);
9107
9106
  };
9107
+ source.connect(audioRecorderNode);
9108
+ return [audioRecorderNode, audioRecorderContext, micStream];
9108
9109
  }
9109
9110
 
9110
9111
  /**
@@ -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
@@ -13181,6 +13883,12 @@
13181
13883
  ...(attachmentsPayload.length ? {
13182
13884
  attachments: attachmentsPayload
13183
13885
  } : {}),
13886
+ // EV-4798 MERN-12: the approval card's answer by the held call's
13887
+ // id (utils/toolConfirmation.js). Only when the card carried the
13888
+ // id; the text above stays the message either way.
13889
+ ...(opts?.toolConfirmation ? {
13890
+ tool_confirmation: opts.toolConfirmation
13891
+ } : {}),
13184
13892
  messageHistory: messages.filter(msg => {
13185
13893
  // Filter out processing messages, empty messages, and onboarding messages
13186
13894
  return !msg.isProcessing && msg.content && msg.content.trim() && !['userName', 'email', 'phone'].includes(msg.type);
@@ -15543,12 +16251,13 @@
15543
16251
  * absolute http(s) URLs pass; anything else (javascript:, data:, vbscript:,
15544
16252
  * a bare relative path, non-string) is dropped rather than rendered.
15545
16253
  *
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.
16254
+ * EV-3956 / EV-4798 MERN-19: this is the ONE implementation. The agent-sdk,
16255
+ * widget and frontend renderers all import this file (the published SDK and
16256
+ * widget bundle it at build time, so their consumers never resolve
16257
+ * @eshal/shared). A fix made here reaches all three surfaces. Do not re-inline.
16258
+ *
16259
+ * Plain JavaScript on purpose: the widget's Rollup/Babel build compiles no
16260
+ * TypeScript from another package. Types live in safeUrl.d.ts.
15552
16261
  */
15553
16262
  function safeUrl(u) {
15554
16263
  return typeof u === 'string' && /^https?:\/\//i.test(u) ? u : undefined;
@@ -15644,6 +16353,53 @@
15644
16353
  return `${String(apiBaseUrl).replace(/\/$/, "")}${url.startsWith("/") ? "" : "/"}${url}`;
15645
16354
  }
15646
16355
 
16356
+ /**
16357
+ * The filename a download's `Content-Disposition` header names, or null.
16358
+ *
16359
+ * A copy of `filenameFromContentDisposition` in @eshal/shared, which the
16360
+ * widget (published standalone) cannot import. Both run the cases in
16361
+ * packages/shared/fixtures/content-disposition-cases.json.
16362
+ *
16363
+ * Replaces `/filename\*?=(?:UTF-8'')?["']?([^"'\s;]+)["']?/`, whose
16364
+ * `[^"'\s;]+` stopped at the first space: every SharePoint citation saved
16365
+ * under the first word of its name ("Tech Textile Park Guidelines.pdf" came
16366
+ * down as "Tech.pdf"; dev, 27 Oct 2026).
16367
+ *
16368
+ * `filename*` wins (RFC 6266), then a quoted `filename="..."` read whole,
16369
+ * then a bare token.
16370
+ */
16371
+
16372
+ function decodeExtValue(charset, encoded) {
16373
+ try {
16374
+ if (/^utf-8$/i.test(charset)) return decodeURIComponent(encoded);
16375
+ return encoded.replace(/%([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
16376
+ } catch {
16377
+ return null;
16378
+ }
16379
+ }
16380
+ function maybePercentDecoded(value) {
16381
+ if (!/%[0-9a-f]{2}/i.test(value)) return value;
16382
+ try {
16383
+ return decodeURIComponent(value);
16384
+ } catch {
16385
+ return value;
16386
+ }
16387
+ }
16388
+ function filenameFromContentDisposition(header) {
16389
+ if (!header) return null;
16390
+ const star = /(?:^|;)\s*filename\*\s*=\s*([^;]+)/i.exec(header);
16391
+ if (star) {
16392
+ const ext = /^\s*"?([^']*)'[^']*'([^"]*)"?\s*$/.exec(star[1]);
16393
+ const decoded = ext ? decodeExtValue(ext[1], ext[2]) : null;
16394
+ if (decoded) return decoded;
16395
+ }
16396
+ const quoted = /(?:^|;)\s*filename\s*=\s*"((?:[^"\\]|\\.)*)"/i.exec(header);
16397
+ if (quoted) return maybePercentDecoded(quoted[1].replace(/\\(.)/g, "$1")) || null;
16398
+ const token = /(?:^|;)\s*filename\s*=\s*([^;]+)/i.exec(header);
16399
+ if (token) return maybePercentDecoded(token[1].trim()) || null;
16400
+ return null;
16401
+ }
16402
+
15647
16403
  // Runtime loader for the lazy markdown/chart chunk in the vanilla/IIFE
15648
16404
  // build (EV-2023). Rollup's IIFE output format has no module system of its
15649
16405
  // own, so it can't code-split a native `import()` the way the ESM build
@@ -16167,14 +16923,7 @@
16167
16923
  // Content-Disposition holds the UUID-prefixed storage key we
16168
16924
  // don't want to show. Skip CD parsing for those.
16169
16925
  if (!isAttachment) {
16170
- const match = disposition && /filename\*?=(?:UTF-8'')?["']?([^"'\s;]+)["']?/i.exec(disposition);
16171
- if (match) {
16172
- try {
16173
- filename = decodeURIComponent(match[1].replace(/\\"/g, '"'));
16174
- } catch {
16175
- /* keep fallback */
16176
- }
16177
- }
16926
+ filename = filenameFromContentDisposition(disposition) || filename;
16178
16927
  }
16179
16928
  const a = document.createElement("a");
16180
16929
  const objectUrl = URL.createObjectURL(blob);
@@ -16204,8 +16953,13 @@
16204
16953
  // state are common, unlike the desktop-first admin Inbox.
16205
16954
  function CopyMessageButton({
16206
16955
  content,
16207
- isDark
16956
+ isDark,
16957
+ t
16208
16958
  }) {
16959
+ // EV-4798 (MERN-21): localised accessible name; English when no translator
16960
+ // reaches this button.
16961
+ const copyLabel = t ? t("copyMessage") : "Copy message";
16962
+ const copiedLabel = t ? t("copied") : "Copied";
16209
16963
  const [copied, setCopied] = reactExports.useState(false);
16210
16964
  const handleCopy = reactExports.useCallback(() => {
16211
16965
  if (!content) return;
@@ -16224,8 +16978,8 @@
16224
16978
  WebkitAppearance: "none",
16225
16979
  cursor: "pointer"
16226
16980
  },
16227
- "aria-label": copied ? "Copied" : "Copy message",
16228
- title: copied ? "Copied" : "Copy message",
16981
+ "aria-label": copied ? copiedLabel : copyLabel,
16982
+ title: copied ? copiedLabel : copyLabel,
16229
16983
  children: copied ? /*#__PURE__*/jsxRuntimeExports.jsx(Check, {
16230
16984
  className: "w-3 h-3 text-green-500"
16231
16985
  }) : /*#__PURE__*/jsxRuntimeExports.jsx(Copy, {
@@ -16381,8 +17135,12 @@
16381
17135
  sourcesPreliminary: !!message.sourcesPreliminary,
16382
17136
  onSourceActivate,
16383
17137
  downloadingKey,
16384
- textColor: messageTextColor
16385
- }), [message.sources, message.sourcesPreliminary, onSourceActivate, downloadingKey, messageTextColor]);
17138
+ textColor: messageTextColor,
17139
+ // EV-4798 (MERN-21): the pill's accessible names follow the widget
17140
+ // locale. Optional on the reader side: a cross-bundle provider without
17141
+ // it falls back to English.
17142
+ t
17143
+ }), [message.sources, message.sourcesPreliminary, onSourceActivate, downloadingKey, messageTextColor, t]);
16386
17144
  return (
16387
17145
  /*#__PURE__*/
16388
17146
  // `min-w-0` on the outer flex-row mirrors the same guard in the
@@ -16486,7 +17244,8 @@
16486
17244
  children: formatTime(message.timestamp)
16487
17245
  }), !isTypingMessage && !message.isProcessing && displayContent && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
16488
17246
  content: displayContent,
16489
- isDark: isDark
17247
+ isDark: isDark,
17248
+ t: t
16490
17249
  }), allowFeedback !== false && onFeedback && !isTypingMessage && !message.isProcessing && displayContent && message.type !== 'welcome' && !message.isWelcome && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
16491
17250
  className: "flex items-center gap-0.5 ms-0.5",
16492
17251
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
@@ -16500,7 +17259,8 @@
16500
17259
  WebkitAppearance: "none",
16501
17260
  cursor: "pointer"
16502
17261
  },
16503
- "aria-label": "Like",
17262
+ "aria-label": t("like"),
17263
+ "aria-pressed": activeFeedback === 'like',
16504
17264
  children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsUp, {
16505
17265
  className: "w-3 h-3"
16506
17266
  })
@@ -16515,7 +17275,8 @@
16515
17275
  WebkitAppearance: "none",
16516
17276
  cursor: "pointer"
16517
17277
  },
16518
- "aria-label": "Dislike",
17278
+ "aria-label": t("dislike"),
17279
+ "aria-pressed": activeFeedback === 'dislike',
16519
17280
  children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsDown, {
16520
17281
  className: "w-3 h-3"
16521
17282
  })
@@ -16691,7 +17452,8 @@
16691
17452
  children: formatTime(message.timestamp)
16692
17453
  }), message.content && message.content.trim() !== "" && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
16693
17454
  content: message.content,
16694
- isDark: isDark
17455
+ isDark: isDark,
17456
+ t: t
16695
17457
  })]
16696
17458
  }), message.status === "failed" && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
16697
17459
  className: "flex items-center gap-1.5 mt-1 px-1",
@@ -16984,7 +17746,8 @@
16984
17746
  isRtl,
16985
17747
  onQuestionClick,
16986
17748
  applyHoverState,
16987
- headingLabel
17749
+ headingLabel,
17750
+ defaultLanguage
16988
17751
  }) => {
16989
17752
  const scrollRef = reactExports.useRef(null);
16990
17753
  const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
@@ -17031,7 +17794,7 @@
17031
17794
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
17032
17795
  onClick: () => scroll("left"),
17033
17796
  disabled: !canScrollLeft,
17034
- "aria-label": "Scroll left",
17797
+ "aria-label": translate(defaultLanguage, "scrollLeft"),
17035
17798
  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",
17036
17799
  style: {
17037
17800
  backgroundColor: arrowBg,
@@ -17091,7 +17854,7 @@
17091
17854
  }), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
17092
17855
  onClick: () => scroll("right"),
17093
17856
  disabled: !canScrollRight,
17094
- "aria-label": "Scroll right",
17857
+ "aria-label": translate(defaultLanguage, "scrollRight"),
17095
17858
  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",
17096
17859
  style: {
17097
17860
  backgroundColor: arrowBg,
@@ -17127,7 +17890,9 @@
17127
17890
  userTextColor,
17128
17891
  // Optional localized heading rendered above the vertical pill list,
17129
17892
  // styled to match the inline category picker's helper-text heading.
17130
- headingLabel
17893
+ headingLabel,
17894
+ // Locale for the scroll arrows' accessible names (EV-4798 MERN-21).
17895
+ defaultLanguage = "en"
17131
17896
  }) => {
17132
17897
  if (!questions.length || isTyping) {
17133
17898
  return null;
@@ -17150,7 +17915,8 @@
17150
17915
  isRtl: isRtl,
17151
17916
  onQuestionClick: onQuestionClick,
17152
17917
  applyHoverState: applyHoverState,
17153
- headingLabel: headingLabel
17918
+ headingLabel: headingLabel,
17919
+ defaultLanguage: defaultLanguage
17154
17920
  });
17155
17921
  }
17156
17922
 
@@ -17627,6 +18393,47 @@
17627
18393
  return result;
17628
18394
  }
17629
18395
 
18396
+ /**
18397
+ * Framework-free A2UI core shared by the three A2uiBlock renderers - the
18398
+ * agent-sdk, the widget and the frontend Testing Lab (EV-4798 MERN-19).
18399
+ *
18400
+ * It owns what the renderers must agree on and that is not presentation:
18401
+ * - the component registry: which `type` values route to a chart and which
18402
+ * to a component, and how a type string is normalised;
18403
+ * - sanitizeChartTitle: no DB/SQL annotation reaches a visible title;
18404
+ * - toolConfirmationFor: the structured answer of an approval card;
18405
+ * - linkSegments: which spans of card text become links (every href passes
18406
+ * safeUrl, so a `javascript:` link stays plain text);
18407
+ * - matchAnsweredChoice / findNextUserAnswer: the answered state of a
18408
+ * one-shot card, read from conversation history.
18409
+ *
18410
+ * Each renderer keeps its own components and styling (inline SVG in the SDK,
18411
+ * lucide + inline styles in the widget, Tailwind + shadcn in the frontend).
18412
+ *
18413
+ * Plain JavaScript (types in a2ui.d.ts) because the widget's Rollup/Babel
18414
+ * build compiles no TypeScript from another package; conservative syntax
18415
+ * (no `??`, no `?.`) because that build does not run this file through its
18416
+ * Babel preset either.
18417
+ */
18418
+ function firstDefined(a, b) {
18419
+ return a !== null && a !== undefined ? a : b;
18420
+ }
18421
+
18422
+ /**
18423
+ * The text of the first delivered user message after `index`, or undefined
18424
+ * when the assistant message at `index` has not been answered yet. A user
18425
+ * turn whose send failed never reached the agent, so it does not count.
18426
+ */
18427
+ function findNextUserAnswer(messages, index) {
18428
+ const list = messages || [];
18429
+ for (let i = index + 1; i < list.length; i += 1) {
18430
+ const m = list[i];
18431
+ if (!m || m.role !== 'user' || m.sendFailed) continue;
18432
+ return typeof m.content === 'string' ? m.content : String(firstDefined(m.content, ''));
18433
+ }
18434
+ return undefined;
18435
+ }
18436
+
17630
18437
  // Kept in its own tiny module (not A2uiBlock.jsx): MessageList imports it
17631
18438
  // eagerly, and A2uiBlock/MarkdownRenderer are lazy-loaded to keep charts and
17632
18439
  // react-markdown out of the widget's initial bundle.
@@ -17639,16 +18446,6 @@
17639
18446
  // threaded through MessageBubble -> StreamingMarkdown -> MarkdownRenderer.
17640
18447
  const A2uiAnsweredContext = /*#__PURE__*/reactExports.createContext(undefined);
17641
18448
 
17642
- /** First delivered user turn after `index`, or undefined (see above). */
17643
- function findNextUserAnswer(messages, index) {
17644
- for (let i = index + 1; i < (messages || []).length; i += 1) {
17645
- const m = messages[i];
17646
- if (m?.role !== 'user' || m.sendFailed) continue;
17647
- return typeof m.content === 'string' ? m.content : String(m.content ?? '');
17648
- }
17649
- return undefined;
17650
- }
17651
-
17652
18449
  const MessageList = ({
17653
18450
  messages = [],
17654
18451
  isDark,
@@ -18001,7 +18798,8 @@
18001
18798
  resolvedUserMessageColor: resolvedUserMessageColor,
18002
18799
  userMessageBoxColor: userMessageBoxColor,
18003
18800
  userTextColor: userTextColor,
18004
- headingLabel: quickQuestionsHeadingLabel
18801
+ headingLabel: quickQuestionsHeadingLabel,
18802
+ defaultLanguage: defaultLanguage
18005
18803
  })
18006
18804
  }), isVoiceSessionActive && voiceStatus === "connected" && !isLoading && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
18007
18805
  className: "flex gap-3 flex-row-reverse animate-in",
@@ -18636,10 +19434,14 @@
18636
19434
  }
18637
19435
  return `${val.toFixed(val >= 10 ? 0 : 1)} ${units[unit]}`;
18638
19436
  }
19437
+
19438
+ // removeLabel: the remove button's accessible name, localised by the caller
19439
+ // (EV-4798 MERN-21). Defaults to the English the chip always shipped.
18639
19440
  function AttachmentChip({
18640
19441
  attachment,
18641
19442
  onRemove,
18642
- isDark
19443
+ isDark,
19444
+ removeLabel = "Remove attachment"
18643
19445
  }) {
18644
19446
  const isError = attachment.status === "error";
18645
19447
  const isUploading = attachment.status === "uploading";
@@ -18656,6 +19458,7 @@
18656
19458
  color: textColor,
18657
19459
  maxWidth: 240
18658
19460
  },
19461
+ role: "group",
18659
19462
  title: isError ? attachment.error?.message : attachment.filename,
18660
19463
  "aria-label": statusLabel,
18661
19464
  children: [isError ? /*#__PURE__*/jsxRuntimeExports.jsx(CircleAlert, {
@@ -18691,7 +19494,7 @@
18691
19494
  color: textColor,
18692
19495
  cursor: "pointer"
18693
19496
  },
18694
- "aria-label": "Remove attachment",
19497
+ "aria-label": removeLabel,
18695
19498
  children: /*#__PURE__*/jsxRuntimeExports.jsx(X, {
18696
19499
  size: 12
18697
19500
  })
@@ -19233,7 +20036,8 @@
19233
20036
  children: attachments.map(att => /*#__PURE__*/jsxRuntimeExports.jsx(AttachmentChip, {
19234
20037
  attachment: att,
19235
20038
  onRemove: removeAttachment,
19236
- isDark: isDark
20039
+ isDark: isDark,
20040
+ removeLabel: t("removeAttachment")
19237
20041
  }, att.id))
19238
20042
  }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
19239
20043
  className: "flex items-center px-5 gap-1.5",
@@ -19594,6 +20398,80 @@
19594
20398
  };
19595
20399
  }
19596
20400
 
20401
+ /**
20402
+ * Keyboard helpers for the widget's menus and custom controls
20403
+ * (EV-4798, MERN-21).
20404
+ *
20405
+ * The widget renders inside a Shadow DOM, where `document.activeElement`
20406
+ * resolves to the shadow host rather than the focused control. Every helper
20407
+ * here therefore asks the container's own root node (the shadow root inside
20408
+ * the widget, the document elsewhere) which element has focus.
20409
+ */
20410
+
20411
+ const MENU_ITEM_SELECTOR = '[role="menuitem"]';
20412
+
20413
+ /** The focused element in the tree that holds `container`. */
20414
+ function activeElementIn(container) {
20415
+ const root = container && typeof container.getRootNode === "function" ? container.getRootNode() : null;
20416
+ return root && root.activeElement || document.activeElement;
20417
+ }
20418
+ function menuItems(container, selector) {
20419
+ if (!container) return [];
20420
+ return Array.from(container.querySelectorAll(selector)).filter(el => !el.disabled && el.getAttribute("aria-disabled") !== "true");
20421
+ }
20422
+
20423
+ /**
20424
+ * Arrow-key navigation for a `role="menu"`: ArrowDown / ArrowUp move to the
20425
+ * next / previous item (wrapping), Home / End jump to the first / last.
20426
+ * Returns true when the key was handled so the caller can stop there.
20427
+ */
20428
+ function handleMenuArrowKeys(event, container, selector = MENU_ITEM_SELECTOR) {
20429
+ const {
20430
+ key
20431
+ } = event;
20432
+ if (key !== "ArrowDown" && key !== "ArrowUp" && key !== "Home" && key !== "End") {
20433
+ return false;
20434
+ }
20435
+ const items = menuItems(container, selector);
20436
+ if (items.length === 0) return false;
20437
+ event.preventDefault();
20438
+ const index = items.indexOf(activeElementIn(container));
20439
+ let next;
20440
+ 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;
20441
+ items[next].focus();
20442
+ return true;
20443
+ }
20444
+
20445
+ /**
20446
+ * Keep Tab inside an open menu: Tab on the last item wraps to the first,
20447
+ * Shift+Tab on the first wraps to the last. Returns true when it moved focus.
20448
+ */
20449
+ function trapMenuTab(event, container, selector = MENU_ITEM_SELECTOR) {
20450
+ if (event.key !== "Tab") return false;
20451
+ const items = menuItems(container, selector);
20452
+ if (items.length === 0) return false;
20453
+ const first = items[0];
20454
+ const last = items[items.length - 1];
20455
+ const active = activeElementIn(container);
20456
+ if (event.shiftKey && active === first) {
20457
+ event.preventDefault();
20458
+ last.focus();
20459
+ return true;
20460
+ }
20461
+ if (!event.shiftKey && active === last) {
20462
+ event.preventDefault();
20463
+ first.focus();
20464
+ return true;
20465
+ }
20466
+ return false;
20467
+ }
20468
+
20469
+ /** Focus the first item of a menu container, if it has one. */
20470
+ function focusFirstMenuItem(container, selector = MENU_ITEM_SELECTOR) {
20471
+ const [first] = menuItems(container, selector);
20472
+ first?.focus();
20473
+ }
20474
+
19597
20475
  const ChatHeader = ({
19598
20476
  conciergeName,
19599
20477
  companyName,
@@ -19770,7 +20648,11 @@
19770
20648
  })
19771
20649
  }), showMenu && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
19772
20650
  role: "menu",
19773
- "aria-label": t("menu"),
20651
+ "aria-label": t("menu")
20652
+ // EV-4798 (MERN-21): a menu container must be focusable to
20653
+ // carry its keyboard handling; -1 keeps it out of the Tab order.
20654
+ ,
20655
+ tabIndex: -1,
19774
20656
  dir: isRtl ? "rtl" : "ltr",
19775
20657
  onKeyDown: event => {
19776
20658
  if (event.key === "Escape") {
@@ -19778,26 +20660,18 @@
19778
20660
  setShowMenu(false);
19779
20661
  return;
19780
20662
  }
20663
+ // EV-4798 (MERN-21): Arrow Up/Down, Home and End move between
20664
+ // the items, as a role="menu" promises assistive tech.
20665
+ if (handleMenuArrowKeys(event, menuRef.current)) return;
19781
20666
  // EV-3332: keep Tab focus inside the open menu. Focus enters on
19782
20667
  // open and returns to the trigger on close (effect above), but
19783
20668
  // without this a Tab from the last item / Shift+Tab from the
19784
20669
  // first escaped into the page behind the menu - the gap QA
19785
20670
  // flagged (a real trap already exists on CitationPill; the
19786
20671
  // header menu had Escape-only). Cycle within the menuitems.
19787
- if (event.key === "Tab") {
19788
- const items = menuRef.current ? Array.from(menuRef.current.querySelectorAll('[role="menuitem"]')) : [];
19789
- if (items.length === 0) return;
19790
- const first = items[0];
19791
- const last = items[items.length - 1];
19792
- const active = document.activeElement;
19793
- if (event.shiftKey && active === first) {
19794
- event.preventDefault();
19795
- last.focus();
19796
- } else if (!event.shiftKey && active === last) {
19797
- event.preventDefault();
19798
- first.focus();
19799
- }
19800
- }
20672
+ // The focused item is read from the menu's own root node, so
20673
+ // the trap also works inside the widget's Shadow DOM.
20674
+ trapMenuTab(event, menuRef.current);
19801
20675
  },
19802
20676
  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"}`,
19803
20677
  style: {
@@ -20088,8 +20962,10 @@
20088
20962
  isDark = false,
20089
20963
  primaryColor = "#2563eb",
20090
20964
  fontFamily = "Inter",
20091
- isRtl = false
20965
+ isRtl = false,
20966
+ defaultLanguage = "en"
20092
20967
  }) => {
20968
+ const t = reactExports.useMemo(() => createTranslator(defaultLanguage), [defaultLanguage]);
20093
20969
  const scrollRef = reactExports.useRef(null);
20094
20970
  const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
20095
20971
  const [canScrollRight, setCanScrollRight] = reactExports.useState(false);
@@ -20136,12 +21012,12 @@
20136
21012
  direction: isRtl ? "rtl" : "ltr"
20137
21013
  },
20138
21014
  role: "region",
20139
- "aria-label": "Filter by category",
21015
+ "aria-label": t("filterByCategory"),
20140
21016
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
20141
21017
  type: "button",
20142
21018
  onClick: () => scroll("left"),
20143
21019
  disabled: !canScrollLeft,
20144
- "aria-label": "Scroll categories left",
21020
+ "aria-label": t("scrollCategoriesLeft"),
20145
21021
  className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
20146
21022
  style: {
20147
21023
  backgroundColor: arrowBg,
@@ -20185,7 +21061,7 @@
20185
21061
  type: "button",
20186
21062
  onClick: () => scroll("right"),
20187
21063
  disabled: !canScrollRight,
20188
- "aria-label": "Scroll categories right",
21064
+ "aria-label": t("scrollCategoriesRight"),
20189
21065
  className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
20190
21066
  style: {
20191
21067
  backgroundColor: arrowBg,
@@ -20222,7 +21098,9 @@
20222
21098
  fontFamily = "Inter",
20223
21099
  fontSize = "14px",
20224
21100
  isRtl = false,
20225
- label = "Choose a topic to get started:"
21101
+ label = "Choose a topic to get started:",
21102
+ // Accessible name of the region; the caller passes the localised one.
21103
+ regionLabel = "Category filter"
20226
21104
  }) => {
20227
21105
  if (!Array.isArray(categories) || categories.length === 0) return null;
20228
21106
  const helperColor = isDark ? "#9ca3af" : "#6b7280";
@@ -20234,7 +21112,7 @@
20234
21112
  paddingRight: isRtl ? 50 : undefined
20235
21113
  },
20236
21114
  role: "region",
20237
- "aria-label": "Category filter",
21115
+ "aria-label": regionLabel,
20238
21116
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
20239
21117
  className: "mb-2",
20240
21118
  style: {
@@ -20422,7 +21300,10 @@
20422
21300
  children: ratings.map(rating => /*#__PURE__*/jsxRuntimeExports.jsx("button", {
20423
21301
  onClick: () => handleRating(rating.value),
20424
21302
  disabled: disabled || isSubmitting,
20425
- 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"),
21303
+ 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",
21304
+ // EV-4798 (MERN-21): keyboard focus stays visible; the
21305
+ // mouse-focus reset above is unchanged.
21306
+ "rounded-md focus-visible:ring-2 focus-visible:ring-blue-700", selectedRating === rating.value ? "" : "opacity-80"),
20426
21307
  children: /*#__PURE__*/jsxRuntimeExports.jsx("span", {
20427
21308
  role: "img",
20428
21309
  "aria-label": `${t("rate")} ${rating.value}`,
@@ -20471,7 +21352,9 @@
20471
21352
  onClick: () => handleRating(rating.value),
20472
21353
  onMouseEnter: () => setHoveredStar(rating.value),
20473
21354
  disabled: disabled || isSubmitting,
20474
- 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"),
21355
+ className: cn("flex items-center justify-center text-2xl", "bg-transparent border-0 p-0 cursor-pointer focus:outline-none",
21356
+ // EV-4798 (MERN-21): visible keyboard focus.
21357
+ "rounded-md focus-visible:ring-2 focus-visible:ring-blue-700", "disabled:opacity-50 disabled:cursor-not-allowed"),
20475
21358
  style: {
20476
21359
  transform: isHovered ? "scale(1.25)" : "scale(1)",
20477
21360
  filter: isHovered ? "brightness(1.1) drop-shadow(0 2px 4px rgba(0,0,0,0.15))" : "none",
@@ -20829,7 +21712,14 @@
20829
21712
  if (prompt && typeof prompt === "object") {
20830
21713
  reportChipClick(text, prompt, index);
20831
21714
  }
20832
- if (onPromptSuggestionClick) onPromptSuggestionClick(text);else onDirectSend?.(text);
21715
+ // EV-4798 MERN-12: an approval card's pick arrives as
21716
+ // (value, label, { toolConfirmation }) from A2uiBlock's Confirmation.
21717
+ // The structured answer rides on the send; the text is still the
21718
+ // message. A host override (onPromptSuggestionClick) keeps the text.
21719
+ const toolConfirmation = index && typeof index === "object" && index.toolConfirmation ? index.toolConfirmation : null;
21720
+ if (onPromptSuggestionClick) onPromptSuggestionClick(text);else if (toolConfirmation) onDirectSend?.(text, undefined, {
21721
+ toolConfirmation
21722
+ });else onDirectSend?.(text);
20833
21723
  }, [onPromptSuggestionClick, onDirectSend, reportChipClick]);
20834
21724
 
20835
21725
  // ─── Resizable widget ────────────────────────────────────────────
@@ -21375,7 +22265,9 @@
21375
22265
  onClick: handleResolveSubmission,
21376
22266
  disabled: resolveRating === 0 || isSubmittingResolve,
21377
22267
  "aria-describedby": resolveRating === 0 ? "resolve-rating-hint" : undefined,
21378
- 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"),
22268
+ 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",
22269
+ // EV-4798 (MERN-21): keyboard focus stays visible.
22270
+ "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"),
21379
22271
  children: isSubmittingResolve ? t("submitting") : t("submitFeedback")
21380
22272
  }), resolveRating === 0 && !isSubmittingResolve && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
21381
22273
  id: "resolve-rating-hint",
@@ -21465,7 +22357,8 @@
21465
22357
  isDark: isDark,
21466
22358
  primaryColor: primaryColor,
21467
22359
  fontFamily: fontFamily,
21468
- isRtl: isRtlLanguage
22360
+ isRtl: isRtlLanguage,
22361
+ defaultLanguage: defaultLanguage
21469
22362
  }), !isMinimized && /*#__PURE__*/jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
21470
22363
  children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
21471
22364
  ref: messagesContainerRef,
@@ -21545,7 +22438,8 @@
21545
22438
  fontFamily: fontFamily,
21546
22439
  fontSize: fontSize,
21547
22440
  isRtl: isRtlLanguage,
21548
- label: t("chooseTopicLabel")
22441
+ label: t("chooseTopicLabel"),
22442
+ regionLabel: t("categoryFilter")
21549
22443
  }) : null,
21550
22444
  quickQuestionsHeadingLabel: filterEnabled ? t("quickQuestionsHeadingLabel") : undefined
21551
22445
  }), (showCsat && csatEnabled || csatRequest) && !csatSubmitted && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
@@ -21739,12 +22633,20 @@
21739
22633
  };
21740
22634
  }
21741
22635
 
21742
- // EV-4233: multi-channel entry point. An operator can list other channels
21743
- // (WhatsApp, Telegram, Messenger, Instagram) next to the in-widget chat; the
21744
- // launcher then opens a small picker instead of the chat panel directly.
21745
- // Only https deep links on each channel's own host are accepted so a
21746
- // misconfigured or injected value cannot turn the launcher into an open
21747
- // redirect to an arbitrary site.
22636
+ /**
22637
+ * EV-4233: multi-channel entry point, shared by the widget and the agent-sdk
22638
+ * (EV-4798 MERN-19). An operator can list other channels (WhatsApp,
22639
+ * Telegram, Messenger, Instagram) next to the in-widget chat; the launcher
22640
+ * then opens a small picker instead of the chat panel directly.
22641
+ *
22642
+ * Only https deep links on each channel's own host are accepted, so a
22643
+ * misconfigured or injected value cannot turn the launcher into an open
22644
+ * redirect to an arbitrary site. One copy, so a tightened host list reaches
22645
+ * both surfaces.
22646
+ *
22647
+ * Plain JavaScript (types in channelLinks.d.ts), conservative syntax: the
22648
+ * widget's Rollup/Babel build compiles neither TypeScript nor this file.
22649
+ */
21748
22650
 
21749
22651
  const CHANNEL_HOSTS = {
21750
22652
  whatsapp: ['wa.me', 'api.whatsapp.com'],
@@ -21761,20 +22663,21 @@
21761
22663
  function normalizeChannelLinks(links) {
21762
22664
  if (!Array.isArray(links)) return [];
21763
22665
  const out = [];
21764
- for (const link of links) {
22666
+ for (let i = 0; i < links.length; i += 1) {
22667
+ const link = links[i];
21765
22668
  if (!link || typeof link !== 'object') continue;
21766
22669
  const type = typeof link.type === 'string' ? link.type.toLowerCase() : '';
21767
- const hosts = CHANNEL_HOSTS[type];
22670
+ const hosts = Object.prototype.hasOwnProperty.call(CHANNEL_HOSTS, type) ? CHANNEL_HOSTS[type] : undefined;
21768
22671
  if (!hosts || typeof link.url !== 'string') continue;
21769
22672
  let parsed;
21770
22673
  try {
21771
22674
  parsed = new URL(link.url);
21772
- } catch {
22675
+ } catch (e) {
21773
22676
  continue;
21774
22677
  }
21775
- if (parsed.protocol !== 'https:' || !hosts.includes(parsed.hostname.toLowerCase())) continue;
22678
+ if (parsed.protocol !== 'https:' || hosts.indexOf(parsed.hostname.toLowerCase()) === -1) continue;
21776
22679
  out.push({
21777
- type,
22680
+ type: type,
21778
22681
  url: parsed.toString(),
21779
22682
  label: typeof link.label === 'string' && link.label.trim() ? link.label.trim() : CHANNEL_LABELS[type]
21780
22683
  });
@@ -21799,6 +22702,30 @@
21799
22702
  const links = reactExports.useMemo(() => normalizeChannelLinks(channelLinks), [channelLinks]);
21800
22703
  const [pickerOpen, setPickerOpen] = reactExports.useState(false);
21801
22704
  const hasPicker = links.length > 0;
22705
+
22706
+ // EV-4798 (MERN-21): keyboard support for the channel picker menu. Focus
22707
+ // moves to the first option when it opens, Escape closes it and returns
22708
+ // focus to the launcher, and the arrow keys move between options. The
22709
+ // launcher ref is kept locally as well as forwarded to the caller.
22710
+ const pickerRef = reactExports.useRef(null);
22711
+ const launcherRef = reactExports.useRef(null);
22712
+ const setLauncherRef = reactExports.useCallback(node => {
22713
+ launcherRef.current = node;
22714
+ if (typeof ref === "function") ref(node);else if (ref) ref.current = node;
22715
+ }, [ref]);
22716
+ const pickerVisible = hasPicker && pickerOpen && !isOpen;
22717
+ reactExports.useEffect(() => {
22718
+ if (pickerVisible) focusFirstMenuItem(pickerRef.current);
22719
+ }, [pickerVisible]);
22720
+ const handlePickerKeyDown = event => {
22721
+ if (event.key === "Escape") {
22722
+ event.preventDefault();
22723
+ setPickerOpen(false);
22724
+ launcherRef.current?.focus();
22725
+ return;
22726
+ }
22727
+ handleMenuArrowKeys(event, pickerRef.current);
22728
+ };
21802
22729
  const launcherBg = primaryColor;
21803
22730
  const iconColor = headerTextColor || "#FFFFFF";
21804
22731
  const handleLauncherClick = () => {
@@ -21827,9 +22754,12 @@
21827
22754
  };
21828
22755
  return /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
21829
22756
  className: `relative ${className || ""}`,
21830
- children: [hasPicker && pickerOpen && !isOpen && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
22757
+ children: [pickerVisible && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
22758
+ ref: pickerRef,
21831
22759
  role: "menu",
21832
22760
  "aria-label": t("chooseChannel"),
22761
+ tabIndex: -1,
22762
+ onKeyDown: handlePickerKeyDown,
21833
22763
  "data-testid": "channel-picker",
21834
22764
  style: {
21835
22765
  position: "absolute",
@@ -21858,7 +22788,7 @@
21858
22788
  children: link.label
21859
22789
  }, `${link.type}-${link.url}`))]
21860
22790
  }), /*#__PURE__*/jsxRuntimeExports.jsxs("button", {
21861
- ref: ref,
22791
+ ref: setLauncherRef,
21862
22792
  onClick: handleLauncherClick,
21863
22793
  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",
21864
22794
  style: {
@@ -21903,7 +22833,7 @@
21903
22833
  * value by its own test (that constant sat at 0.1.113 while this package was
21904
22834
  * at 0.2.2 precisely because nothing enforced it - EV-2431).
21905
22835
  */
21906
- const WIDGET_VERSION = '0.2.27';
22836
+ const WIDGET_VERSION = '0.2.29';
21907
22837
 
21908
22838
  /**
21909
22839
  * API utility functions