@eshal-bot/chat-widget 0.2.47 → 0.2.49

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-0\\.5{padding-bottom:.125rem;padding-top:.125rem}#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 .pt-4{padding-top:1rem}#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-300{--tw-text-opacity:1;color:rgb(252 165 165/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-red-700{--tw-text-opacity:1;color:rgb(185 28 28/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 .opacity-90{opacity:.9}#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}";
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 .-bottom-1\\/3{bottom:-33.333333%}#chat-widget-root .-left-\\[15\\%\\]{left:-15%}#chat-widget-root .-right-\\[15\\%\\]{right:-15%}#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 .left-\\[20\\%\\]{left:20%}#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 .mx-5{margin-left:1.25rem;margin-right:1.25rem}#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-0{margin-bottom:0}#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 .contents{display:contents}#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-\\[120\\%\\]{height:120%}#chat-widget-root .h-\\[130\\%\\]{height:130%}#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-\\[60\\%\\]{width:60%}#chat-widget-root .w-\\[70\\%\\]{width:70%}#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 .origin-bottom{transform-origin:bottom}#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 ping{75%,to{opacity:0;transform:scale(2)}}#chat-widget-root .animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) 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 .animate-voice-glow{animation:voice-glow 7s ease-in-out infinite}@keyframes voice-glow{0%,to{transform:translate(0) scale(1)}50%{transform:translate(12%,-8%) scale(1.15)}}#chat-widget-root .animate-voice-glow-slow{animation:voice-glow 11s ease-in-out infinite reverse}#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-10{gap:2.5rem}#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-solid{border-style:solid}#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-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}#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-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}#chat-widget-root .bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/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-status-success{background-color:hsl(var(--cw-status-success))}#chat-widget-root .bg-status-warning{background-color:hsl(var(--cw-status-warning))}#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-3\\.5{padding-left:.875rem;padding-right:.875rem}#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-0\\.5{padding-bottom:.125rem;padding-top:.125rem}#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 .pb-6{padding-bottom:1.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 .pt-10{padding-top:2.5rem}#chat-widget-root .pt-3{padding-top:.75rem}#chat-widget-root .pt-4{padding-top:1rem}#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-300{--tw-text-opacity:1;color:rgb(252 165 165/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-red-700{--tw-text-opacity:1;color:rgb(185 28 28/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-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/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 .opacity-90{opacity:.9}#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 .blur-2xl{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 .blur-2xl{--tw-blur:blur(40px)}#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,#chat-widget-root .drop-shadow-md{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-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-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}#chat-widget-root .drop-shadow-sm,#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 .grayscale-\\[0\\.3\\]{--tw-grayscale:grayscale(0.3)}#chat-widget-root .filter{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-\\[opacity\\2c transform\\]{transition-duration:.15s;transition-property:opacity,transform;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 .ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}#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 .\\[overflow-wrap\\:anywhere\\]{overflow-wrap:anywhere}#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-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/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-primary:focus-visible{--tw-ring-color:var(--cw-primary,#1d4ed8)}#chat-widget-root .focus-visible\\:ring-red-600:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/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 .focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}#chat-widget-root .focus-visible\\:ring-offset-gray-900:focus-visible{--tw-ring-offset-color:#111827}#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
 
@@ -12258,6 +12258,599 @@
12258
12258
  moreSources: "+{count} nữa"
12259
12259
  }
12260
12260
  };
12261
+
12262
+ // The voice call screen (components/VoiceCallView.jsx): the status pill, the
12263
+ // transcript region and the Pause and End controls. Kept as its own table,
12264
+ // like A11Y_LABELS above, so every supported locale carries the full set in
12265
+ // one place. The ar, de, es, fr, ja, nl, sr and zh lines match the Testing
12266
+ // lab's call screen (packages/frontend/src/locales/*/common.json).
12267
+ const VOICE_CALL_TEXTS = {
12268
+ en: {
12269
+ callConnecting: "Connecting...",
12270
+ callLive: "Live",
12271
+ callPaused: "Paused",
12272
+ callReconnecting: "Reconnecting",
12273
+ callTranscript: "Call transcript",
12274
+ callPause: "Pause microphone",
12275
+ callResume: "Resume microphone",
12276
+ callPauseLabel: "Pause",
12277
+ callResumeLabel: "Resume",
12278
+ callEnd: "End call",
12279
+ callEndLabel: "End"
12280
+ },
12281
+ ar: {
12282
+ callConnecting: "جارٍ الاتصال...",
12283
+ callLive: "مباشر",
12284
+ callPaused: "متوقف مؤقتًا",
12285
+ callReconnecting: "جارٍ إعادة الاتصال",
12286
+ callTranscript: "نص المكالمة",
12287
+ callPause: "إيقاف الميكروفون مؤقتًا",
12288
+ callResume: "استئناف الميكروفون",
12289
+ callPauseLabel: "إيقاف مؤقت",
12290
+ callResumeLabel: "استئناف",
12291
+ callEnd: "إنهاء المكالمة",
12292
+ callEndLabel: "إنهاء"
12293
+ },
12294
+ es: {
12295
+ callConnecting: "Conectando...",
12296
+ callLive: "En directo",
12297
+ callPaused: "En pausa",
12298
+ callReconnecting: "Reconectando",
12299
+ callTranscript: "Transcripción de la llamada",
12300
+ callPause: "Pausar micrófono",
12301
+ callResume: "Reanudar micrófono",
12302
+ callPauseLabel: "Pausa",
12303
+ callResumeLabel: "Reanudar",
12304
+ callEnd: "Finalizar llamada",
12305
+ callEndLabel: "Finalizar"
12306
+ },
12307
+ be: {
12308
+ callConnecting: "Злучэнне...",
12309
+ callLive: "У эфіры",
12310
+ callPaused: "Прыпынена",
12311
+ callReconnecting: "Паўторнае злучэнне",
12312
+ callTranscript: "Расшыфроўка званка",
12313
+ callPause: "Прыпыніць мікрафон",
12314
+ callResume: "Узнавіць мікрафон",
12315
+ callPauseLabel: "Паўза",
12316
+ callResumeLabel: "Узнавіць",
12317
+ callEnd: "Завяршыць званок",
12318
+ callEndLabel: "Завяршыць"
12319
+ },
12320
+ bs: {
12321
+ callConnecting: "Povezivanje...",
12322
+ callLive: "Uživo",
12323
+ callPaused: "Pauzirano",
12324
+ callReconnecting: "Ponovno povezivanje",
12325
+ callTranscript: "Transkript poziva",
12326
+ callPause: "Pauziraj mikrofon",
12327
+ callResume: "Nastavi mikrofon",
12328
+ callPauseLabel: "Pauza",
12329
+ callResumeLabel: "Nastavi",
12330
+ callEnd: "Završi poziv",
12331
+ callEndLabel: "Završi"
12332
+ },
12333
+ bg: {
12334
+ callConnecting: "Свързване...",
12335
+ callLive: "На живо",
12336
+ callPaused: "На пауза",
12337
+ callReconnecting: "Повторно свързване",
12338
+ callTranscript: "Препис на разговора",
12339
+ callPause: "Пауза на микрофона",
12340
+ callResume: "Възобнови микрофона",
12341
+ callPauseLabel: "Пауза",
12342
+ callResumeLabel: "Продължи",
12343
+ callEnd: "Прекрати разговора",
12344
+ callEndLabel: "Прекрати"
12345
+ },
12346
+ my: {
12347
+ callConnecting: "ချိတ်ဆက်နေသည်...",
12348
+ callLive: "တိုက်ရိုက်",
12349
+ callPaused: "ခေတ္တရပ်ထားသည်",
12350
+ callReconnecting: "ပြန်လည်ချိတ်ဆက်နေသည်",
12351
+ callTranscript: "ဖုန်းခေါ်ဆိုမှု စာသားမှတ်တမ်း",
12352
+ callPause: "မိုက်ခရိုဖုန်းကို ခေတ္တရပ်ရန်",
12353
+ callResume: "မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်ရန်",
12354
+ callPauseLabel: "ခေတ္တရပ်ရန်",
12355
+ callResumeLabel: "ဆက်လုပ်ရန်",
12356
+ callEnd: "ဖုန်းချရန်",
12357
+ callEndLabel: "ပြီးဆုံးရန်"
12358
+ },
12359
+ ca: {
12360
+ callConnecting: "Connectant...",
12361
+ callLive: "En directe",
12362
+ callPaused: "En pausa",
12363
+ callReconnecting: "Reconnectant",
12364
+ callTranscript: "Transcripció de la trucada",
12365
+ callPause: "Posa en pausa el micròfon",
12366
+ callResume: "Reprèn el micròfon",
12367
+ callPauseLabel: "Pausa",
12368
+ callResumeLabel: "Reprèn",
12369
+ callEnd: "Finalitza la trucada",
12370
+ callEndLabel: "Finalitza"
12371
+ },
12372
+ zh: {
12373
+ callConnecting: "正在连接...",
12374
+ callLive: "通话中",
12375
+ callPaused: "已暂停",
12376
+ callReconnecting: "正在重新连接",
12377
+ callTranscript: "通话记录",
12378
+ callPause: "暂停麦克风",
12379
+ callResume: "恢复麦克风",
12380
+ callPauseLabel: "暂停",
12381
+ callResumeLabel: "恢复",
12382
+ callEnd: "结束通话",
12383
+ callEndLabel: "结束"
12384
+ },
12385
+ hr: {
12386
+ callConnecting: "Povezivanje...",
12387
+ callLive: "Uživo",
12388
+ callPaused: "Pauzirano",
12389
+ callReconnecting: "Ponovno povezivanje",
12390
+ callTranscript: "Prijepis poziva",
12391
+ callPause: "Pauziraj mikrofon",
12392
+ callResume: "Nastavi mikrofon",
12393
+ callPauseLabel: "Pauza",
12394
+ callResumeLabel: "Nastavi",
12395
+ callEnd: "Završi poziv",
12396
+ callEndLabel: "Završi"
12397
+ },
12398
+ cs: {
12399
+ callConnecting: "Připojování...",
12400
+ callLive: "Živě",
12401
+ callPaused: "Pozastaveno",
12402
+ callReconnecting: "Opětovné připojování",
12403
+ callTranscript: "Přepis hovoru",
12404
+ callPause: "Pozastavit mikrofon",
12405
+ callResume: "Obnovit mikrofon",
12406
+ callPauseLabel: "Pozastavit",
12407
+ callResumeLabel: "Pokračovat",
12408
+ callEnd: "Ukončit hovor",
12409
+ callEndLabel: "Ukončit"
12410
+ },
12411
+ da: {
12412
+ callConnecting: "Forbinder...",
12413
+ callLive: "Live",
12414
+ callPaused: "Sat på pause",
12415
+ callReconnecting: "Genopretter forbindelse",
12416
+ callTranscript: "Udskrift af opkaldet",
12417
+ callPause: "Sæt mikrofonen på pause",
12418
+ callResume: "Genoptag mikrofonen",
12419
+ callPauseLabel: "Pause",
12420
+ callResumeLabel: "Genoptag",
12421
+ callEnd: "Afslut opkald",
12422
+ callEndLabel: "Afslut"
12423
+ },
12424
+ nl: {
12425
+ callConnecting: "Verbinden...",
12426
+ callLive: "Live",
12427
+ callPaused: "Gepauzeerd",
12428
+ callReconnecting: "Opnieuw verbinden",
12429
+ callTranscript: "Gesprekstranscript",
12430
+ callPause: "Microfoon pauzeren",
12431
+ callResume: "Microfoon hervatten",
12432
+ callPauseLabel: "Pauzeren",
12433
+ callResumeLabel: "Hervatten",
12434
+ callEnd: "Gesprek beëindigen",
12435
+ callEndLabel: "Beëindigen"
12436
+ },
12437
+ et: {
12438
+ callConnecting: "Ühendamine...",
12439
+ callLive: "Otse",
12440
+ callPaused: "Peatatud",
12441
+ callReconnecting: "Ühenduse taastamine",
12442
+ callTranscript: "Kõne ärakiri",
12443
+ callPause: "Peata mikrofon",
12444
+ callResume: "Jätka mikrofoniga",
12445
+ callPauseLabel: "Peata",
12446
+ callResumeLabel: "Jätka",
12447
+ callEnd: "Lõpeta kõne",
12448
+ callEndLabel: "Lõpeta"
12449
+ },
12450
+ fi: {
12451
+ callConnecting: "Yhdistetään...",
12452
+ callLive: "Käynnissä",
12453
+ callPaused: "Tauolla",
12454
+ callReconnecting: "Yhdistetään uudelleen",
12455
+ callTranscript: "Puhelun litterointi",
12456
+ callPause: "Keskeytä mikrofoni",
12457
+ callResume: "Jatka mikrofonia",
12458
+ callPauseLabel: "Tauko",
12459
+ callResumeLabel: "Jatka",
12460
+ callEnd: "Lopeta puhelu",
12461
+ callEndLabel: "Lopeta"
12462
+ },
12463
+ fr: {
12464
+ callConnecting: "Connexion...",
12465
+ callLive: "En direct",
12466
+ callPaused: "En pause",
12467
+ callReconnecting: "Reconnexion",
12468
+ callTranscript: "Transcription de l'appel",
12469
+ callPause: "Mettre le micro en pause",
12470
+ callResume: "Reprendre le micro",
12471
+ callPauseLabel: "Pause",
12472
+ callResumeLabel: "Reprendre",
12473
+ callEnd: "Terminer l'appel",
12474
+ callEndLabel: "Terminer"
12475
+ },
12476
+ de: {
12477
+ callConnecting: "Verbindung wird hergestellt...",
12478
+ callLive: "Live",
12479
+ callPaused: "Pausiert",
12480
+ callReconnecting: "Verbindung wird wiederhergestellt",
12481
+ callTranscript: "Gesprächstranskript",
12482
+ callPause: "Mikrofon pausieren",
12483
+ callResume: "Mikrofon fortsetzen",
12484
+ callPauseLabel: "Pause",
12485
+ callResumeLabel: "Fortsetzen",
12486
+ callEnd: "Anruf beenden",
12487
+ callEndLabel: "Beenden"
12488
+ },
12489
+ el: {
12490
+ callConnecting: "Σύνδεση...",
12491
+ callLive: "Ζωντανά",
12492
+ callPaused: "Σε παύση",
12493
+ callReconnecting: "Επανασύνδεση",
12494
+ callTranscript: "Απομαγνητοφώνηση κλήσης",
12495
+ callPause: "Παύση μικροφώνου",
12496
+ callResume: "Συνέχιση μικροφώνου",
12497
+ callPauseLabel: "Παύση",
12498
+ callResumeLabel: "Συνέχεια",
12499
+ callEnd: "Τερματισμός κλήσης",
12500
+ callEndLabel: "Τέλος"
12501
+ },
12502
+ hi: {
12503
+ callConnecting: "कनेक्ट हो रहा है...",
12504
+ callLive: "लाइव",
12505
+ callPaused: "रुका हुआ",
12506
+ callReconnecting: "फिर से कनेक्ट हो रहा है",
12507
+ callTranscript: "कॉल ट्रांसक्रिप्ट",
12508
+ callPause: "माइक्रोफ़ोन रोकें",
12509
+ callResume: "माइक्रोफ़ोन फिर से शुरू करें",
12510
+ callPauseLabel: "रोकें",
12511
+ callResumeLabel: "फिर शुरू करें",
12512
+ callEnd: "कॉल समाप्त करें",
12513
+ callEndLabel: "समाप्त करें"
12514
+ },
12515
+ mr: {
12516
+ callConnecting: "कनेक्ट होत आहे...",
12517
+ callLive: "लाइव्ह",
12518
+ callPaused: "थांबवले",
12519
+ callReconnecting: "पुन्हा कनेक्ट होत आहे",
12520
+ callTranscript: "कॉलचा उतारा",
12521
+ callPause: "मायक्रोफोन थांबवा",
12522
+ callResume: "मायक्रोफोन पुन्हा सुरू करा",
12523
+ callPauseLabel: "थांबवा",
12524
+ callResumeLabel: "पुन्हा सुरू करा",
12525
+ callEnd: "कॉल संपवा",
12526
+ callEndLabel: "संपवा"
12527
+ },
12528
+ hu: {
12529
+ callConnecting: "Kapcsolódás...",
12530
+ callLive: "Élő",
12531
+ callPaused: "Szüneteltetve",
12532
+ callReconnecting: "Újrakapcsolódás",
12533
+ callTranscript: "A hívás átirata",
12534
+ callPause: "Mikrofon szüneteltetése",
12535
+ callResume: "Mikrofon folytatása",
12536
+ callPauseLabel: "Szünet",
12537
+ callResumeLabel: "Folytatás",
12538
+ callEnd: "Hívás befejezése",
12539
+ callEndLabel: "Befejezés"
12540
+ },
12541
+ is: {
12542
+ callConnecting: "Tengist...",
12543
+ callLive: "Í beinni",
12544
+ callPaused: "Í hléi",
12545
+ callReconnecting: "Tengist aftur",
12546
+ callTranscript: "Afrit af símtali",
12547
+ callPause: "Gera hlé á hljóðnema",
12548
+ callResume: "Halda áfram með hljóðnema",
12549
+ callPauseLabel: "Hlé",
12550
+ callResumeLabel: "Halda áfram",
12551
+ callEnd: "Ljúka símtali",
12552
+ callEndLabel: "Ljúka"
12553
+ },
12554
+ id: {
12555
+ callConnecting: "Menghubungkan...",
12556
+ callLive: "Langsung",
12557
+ callPaused: "Dijeda",
12558
+ callReconnecting: "Menghubungkan ulang",
12559
+ callTranscript: "Transkrip panggilan",
12560
+ callPause: "Jeda mikrofon",
12561
+ callResume: "Lanjutkan mikrofon",
12562
+ callPauseLabel: "Jeda",
12563
+ callResumeLabel: "Lanjutkan",
12564
+ callEnd: "Akhiri panggilan",
12565
+ callEndLabel: "Akhiri"
12566
+ },
12567
+ it: {
12568
+ callConnecting: "Connessione...",
12569
+ callLive: "In diretta",
12570
+ callPaused: "In pausa",
12571
+ callReconnecting: "Riconnessione",
12572
+ callTranscript: "Trascrizione della chiamata",
12573
+ callPause: "Metti in pausa il microfono",
12574
+ callResume: "Riattiva il microfono",
12575
+ callPauseLabel: "Pausa",
12576
+ callResumeLabel: "Riprendi",
12577
+ callEnd: "Termina chiamata",
12578
+ callEndLabel: "Termina"
12579
+ },
12580
+ ja: {
12581
+ callConnecting: "接続中...",
12582
+ callLive: "ライブ",
12583
+ callPaused: "一時停止中",
12584
+ callReconnecting: "再接続中",
12585
+ callTranscript: "通話の文字起こし",
12586
+ callPause: "マイクを一時停止",
12587
+ callResume: "マイクを再開",
12588
+ callPauseLabel: "一時停止",
12589
+ callResumeLabel: "再開",
12590
+ callEnd: "通話を終了",
12591
+ callEndLabel: "終了"
12592
+ },
12593
+ ko: {
12594
+ callConnecting: "연결 중...",
12595
+ callLive: "통화 중",
12596
+ callPaused: "일시 중지됨",
12597
+ callReconnecting: "다시 연결 중",
12598
+ callTranscript: "통화 기록",
12599
+ callPause: "마이크 일시 중지",
12600
+ callResume: "마이크 다시 켜기",
12601
+ callPauseLabel: "일시 중지",
12602
+ callResumeLabel: "재개",
12603
+ callEnd: "통화 종료",
12604
+ callEndLabel: "종료"
12605
+ },
12606
+ lv: {
12607
+ callConnecting: "Savienojas...",
12608
+ callLive: "Tiešraidē",
12609
+ callPaused: "Pauzēts",
12610
+ callReconnecting: "Atjauno savienojumu",
12611
+ callTranscript: "Zvana atšifrējums",
12612
+ callPause: "Pauzēt mikrofonu",
12613
+ callResume: "Atsākt mikrofonu",
12614
+ callPauseLabel: "Pauze",
12615
+ callResumeLabel: "Atsākt",
12616
+ callEnd: "Beigt zvanu",
12617
+ callEndLabel: "Beigt"
12618
+ },
12619
+ lt: {
12620
+ callConnecting: "Jungiamasi...",
12621
+ callLive: "Tiesiogiai",
12622
+ callPaused: "Pristabdyta",
12623
+ callReconnecting: "Jungiamasi iš naujo",
12624
+ callTranscript: "Skambučio nuorašas",
12625
+ callPause: "Pristabdyti mikrofoną",
12626
+ callResume: "Tęsti mikrofoną",
12627
+ callPauseLabel: "Pristabdyti",
12628
+ callResumeLabel: "Tęsti",
12629
+ callEnd: "Baigti skambutį",
12630
+ callEndLabel: "Baigti"
12631
+ },
12632
+ mk: {
12633
+ callConnecting: "Се поврзува...",
12634
+ callLive: "Во живо",
12635
+ callPaused: "Паузирано",
12636
+ callReconnecting: "Повторно поврзување",
12637
+ callTranscript: "Транскрипт од повикот",
12638
+ callPause: "Паузирај го микрофонот",
12639
+ callResume: "Продолжи го микрофонот",
12640
+ callPauseLabel: "Пауза",
12641
+ callResumeLabel: "Продолжи",
12642
+ callEnd: "Заврши го повикот",
12643
+ callEndLabel: "Заврши"
12644
+ },
12645
+ ms: {
12646
+ callConnecting: "Menyambung...",
12647
+ callLive: "Langsung",
12648
+ callPaused: "Dijeda",
12649
+ callReconnecting: "Menyambung semula",
12650
+ callTranscript: "Transkrip panggilan",
12651
+ callPause: "Jeda mikrofon",
12652
+ callResume: "Sambung semula mikrofon",
12653
+ callPauseLabel: "Jeda",
12654
+ callResumeLabel: "Sambung semula",
12655
+ callEnd: "Tamatkan panggilan",
12656
+ callEndLabel: "Tamatkan"
12657
+ },
12658
+ no: {
12659
+ callConnecting: "Kobler til...",
12660
+ callLive: "Direkte",
12661
+ callPaused: "Satt på pause",
12662
+ callReconnecting: "Kobler til på nytt",
12663
+ callTranscript: "Transkripsjon av samtalen",
12664
+ callPause: "Sett mikrofonen på pause",
12665
+ callResume: "Gjenoppta mikrofonen",
12666
+ callPauseLabel: "Pause",
12667
+ callResumeLabel: "Gjenoppta",
12668
+ callEnd: "Avslutt samtalen",
12669
+ callEndLabel: "Avslutt"
12670
+ },
12671
+ fa: {
12672
+ callConnecting: "در حال اتصال...",
12673
+ callLive: "زنده",
12674
+ callPaused: "متوقف شده",
12675
+ callReconnecting: "در حال اتصال دوباره",
12676
+ callTranscript: "متن تماس",
12677
+ callPause: "توقف موقت میکروفون",
12678
+ callResume: "ادامه میکروفون",
12679
+ callPauseLabel: "توقف موقت",
12680
+ callResumeLabel: "ادامه",
12681
+ callEnd: "پایان تماس",
12682
+ callEndLabel: "پایان"
12683
+ },
12684
+ pl: {
12685
+ callConnecting: "Łączenie...",
12686
+ callLive: "Na żywo",
12687
+ callPaused: "Wstrzymano",
12688
+ callReconnecting: "Ponowne łączenie",
12689
+ callTranscript: "Transkrypcja rozmowy",
12690
+ callPause: "Wstrzymaj mikrofon",
12691
+ callResume: "Wznów mikrofon",
12692
+ callPauseLabel: "Wstrzymaj",
12693
+ callResumeLabel: "Wznów",
12694
+ callEnd: "Zakończ rozmowę",
12695
+ callEndLabel: "Zakończ"
12696
+ },
12697
+ pt: {
12698
+ callConnecting: "Conectando...",
12699
+ callLive: "Ao vivo",
12700
+ callPaused: "Pausado",
12701
+ callReconnecting: "Reconectando",
12702
+ callTranscript: "Transcrição da chamada",
12703
+ callPause: "Pausar microfone",
12704
+ callResume: "Retomar microfone",
12705
+ callPauseLabel: "Pausar",
12706
+ callResumeLabel: "Retomar",
12707
+ callEnd: "Encerrar chamada",
12708
+ callEndLabel: "Encerrar"
12709
+ },
12710
+ ro: {
12711
+ callConnecting: "Se conectează...",
12712
+ callLive: "În direct",
12713
+ callPaused: "În pauză",
12714
+ callReconnecting: "Se reconectează",
12715
+ callTranscript: "Transcrierea apelului",
12716
+ callPause: "Întrerupe microfonul",
12717
+ callResume: "Reia microfonul",
12718
+ callPauseLabel: "Pauză",
12719
+ callResumeLabel: "Reia",
12720
+ callEnd: "Încheie apelul",
12721
+ callEndLabel: "Încheie"
12722
+ },
12723
+ ru: {
12724
+ callConnecting: "Подключение...",
12725
+ callLive: "В эфире",
12726
+ callPaused: "Приостановлено",
12727
+ callReconnecting: "Переподключение",
12728
+ callTranscript: "Расшифровка звонка",
12729
+ callPause: "Приостановить микрофон",
12730
+ callResume: "Возобновить микрофон",
12731
+ callPauseLabel: "Пауза",
12732
+ callResumeLabel: "Продолжить",
12733
+ callEnd: "Завершить звонок",
12734
+ callEndLabel: "Завершить"
12735
+ },
12736
+ sr: {
12737
+ callConnecting: "Povezivanje...",
12738
+ callLive: "Uživo",
12739
+ callPaused: "Pauzirano",
12740
+ callReconnecting: "Ponovno povezivanje",
12741
+ callTranscript: "Transkript poziva",
12742
+ callPause: "Pauziraj mikrofon",
12743
+ callResume: "Nastavi mikrofon",
12744
+ callPauseLabel: "Pauza",
12745
+ callResumeLabel: "Nastavi",
12746
+ callEnd: "Završi poziv",
12747
+ callEndLabel: "Završi"
12748
+ },
12749
+ sk: {
12750
+ callConnecting: "Pripája sa...",
12751
+ callLive: "Naživo",
12752
+ callPaused: "Pozastavené",
12753
+ callReconnecting: "Opätovné pripájanie",
12754
+ callTranscript: "Prepis hovoru",
12755
+ callPause: "Pozastaviť mikrofón",
12756
+ callResume: "Obnoviť mikrofón",
12757
+ callPauseLabel: "Pozastaviť",
12758
+ callResumeLabel: "Pokračovať",
12759
+ callEnd: "Ukončiť hovor",
12760
+ callEndLabel: "Ukončiť"
12761
+ },
12762
+ sl: {
12763
+ callConnecting: "Povezovanje...",
12764
+ callLive: "V živo",
12765
+ callPaused: "Začasno ustavljeno",
12766
+ callReconnecting: "Ponovno povezovanje",
12767
+ callTranscript: "Prepis klica",
12768
+ callPause: "Začasno ustavi mikrofon",
12769
+ callResume: "Nadaljuj z mikrofonom",
12770
+ callPauseLabel: "Premor",
12771
+ callResumeLabel: "Nadaljuj",
12772
+ callEnd: "Končaj klic",
12773
+ callEndLabel: "Končaj"
12774
+ },
12775
+ sv: {
12776
+ callConnecting: "Ansluter...",
12777
+ callLive: "Live",
12778
+ callPaused: "Pausad",
12779
+ callReconnecting: "Återansluter",
12780
+ callTranscript: "Samtalsutskrift",
12781
+ callPause: "Pausa mikrofonen",
12782
+ callResume: "Återuppta mikrofonen",
12783
+ callPauseLabel: "Pausa",
12784
+ callResumeLabel: "Återuppta",
12785
+ callEnd: "Avsluta samtal",
12786
+ callEndLabel: "Avsluta"
12787
+ },
12788
+ th: {
12789
+ callConnecting: "กำลังเชื่อมต่อ...",
12790
+ callLive: "กำลังสนทนา",
12791
+ callPaused: "หยุดชั่วคราว",
12792
+ callReconnecting: "กำลังเชื่อมต่อใหม่",
12793
+ callTranscript: "บันทึกการสนทนา",
12794
+ callPause: "หยุดไมโครโฟนชั่วคราว",
12795
+ callResume: "เปิดไมโครโฟนต่อ",
12796
+ callPauseLabel: "หยุดชั่วคราว",
12797
+ callResumeLabel: "ทำต่อ",
12798
+ callEnd: "วางสาย",
12799
+ callEndLabel: "วางสาย"
12800
+ },
12801
+ tr: {
12802
+ callConnecting: "Bağlanıyor...",
12803
+ callLive: "Canlı",
12804
+ callPaused: "Duraklatıldı",
12805
+ callReconnecting: "Yeniden bağlanıyor",
12806
+ callTranscript: "Arama dökümü",
12807
+ callPause: "Mikrofonu duraklat",
12808
+ callResume: "Mikrofonu sürdür",
12809
+ callPauseLabel: "Duraklat",
12810
+ callResumeLabel: "Sürdür",
12811
+ callEnd: "Aramayı bitir",
12812
+ callEndLabel: "Bitir"
12813
+ },
12814
+ uk: {
12815
+ callConnecting: "Підключення...",
12816
+ callLive: "Наживо",
12817
+ callPaused: "Призупинено",
12818
+ callReconnecting: "Повторне підключення",
12819
+ callTranscript: "Розшифровка дзвінка",
12820
+ callPause: "Призупинити мікрофон",
12821
+ callResume: "Відновити мікрофон",
12822
+ callPauseLabel: "Пауза",
12823
+ callResumeLabel: "Продовжити",
12824
+ callEnd: "Завершити дзвінок",
12825
+ callEndLabel: "Завершити"
12826
+ },
12827
+ ur: {
12828
+ callConnecting: "رابطہ ہو رہا ہے...",
12829
+ callLive: "براہ راست",
12830
+ callPaused: "موقوف",
12831
+ callReconnecting: "دوبارہ رابطہ ہو رہا ہے",
12832
+ callTranscript: "کال کی تحریر",
12833
+ callPause: "مائیکروفون موقوف کریں",
12834
+ callResume: "مائیکروفون دوبارہ شروع کریں",
12835
+ callPauseLabel: "موقوف کریں",
12836
+ callResumeLabel: "دوبارہ شروع کریں",
12837
+ callEnd: "کال ختم کریں",
12838
+ callEndLabel: "ختم کریں"
12839
+ },
12840
+ vi: {
12841
+ callConnecting: "Đang kết nối...",
12842
+ callLive: "Trực tiếp",
12843
+ callPaused: "Đã tạm dừng",
12844
+ callReconnecting: "Đang kết nối lại",
12845
+ callTranscript: "Bản ghi cuộc gọi",
12846
+ callPause: "Tạm dừng micrô",
12847
+ callResume: "Tiếp tục micrô",
12848
+ callPauseLabel: "Tạm dừng",
12849
+ callResumeLabel: "Tiếp tục",
12850
+ callEnd: "Kết thúc cuộc gọi",
12851
+ callEndLabel: "Kết thúc"
12852
+ }
12853
+ };
12261
12854
  const ONBOARDING_PLACEHOLDERS = {
12262
12855
  en: {
12263
12856
  onboardingNamePlaceholder: "Please enter your name",
@@ -12586,7 +13179,7 @@
12586
13179
  const normalized = normalizeLocale(locale);
12587
13180
  const dict = DICTIONARIES[normalized] || EN;
12588
13181
  const onboarding = ONBOARDING_PLACEHOLDERS[normalized];
12589
- return onboarding?.[key] ?? dict[key] ?? A11Y_LABELS[normalized]?.[key] ?? ATTACHMENT_REJECTION_TEXTS[normalized]?.[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? A11Y_LABELS.en[key] ?? ATTACHMENT_REJECTION_TEXTS.en[key] ?? EN[key] ?? key;
13182
+ return onboarding?.[key] ?? dict[key] ?? A11Y_LABELS[normalized]?.[key] ?? VOICE_CALL_TEXTS[normalized]?.[key] ?? ATTACHMENT_REJECTION_TEXTS[normalized]?.[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? A11Y_LABELS.en[key] ?? VOICE_CALL_TEXTS.en[key] ?? ATTACHMENT_REJECTION_TEXTS.en[key] ?? EN[key] ?? key;
12590
13183
  }
12591
13184
  function createTranslator(locale) {
12592
13185
  const normalized = normalizeLocale(locale);
@@ -12684,9 +13277,16 @@
12684
13277
  * - The static welcome this call added (`welcomeId`) is replaced by the
12685
13278
  * greeting, so the call does not show both.
12686
13279
  * - A bubble already on screen with the same text (a welcome shown before the
12687
- * call started, in either list) is kept and no duplicate is added.
13280
+ * call started, in either list) is kept and no duplicate is added. "The
13281
+ * same" ignores case, spacing and curly or straight quotes: the welcome on
13282
+ * screen and the spoken one can differ only in those (dev, 11 Nov 2026,
13283
+ * the greeting showed twice).
12688
13284
  * - Otherwise the greeting is appended as the bot's bubble.
12689
13285
  */
13286
+ function sameGreeting(a, b) {
13287
+ const norm = s => String(s).replace(/[‘’ʼ]/g, "'").replace(/[“”]/g, '"').replace(/\s+/g, " ").trim().toLowerCase();
13288
+ return norm(a) === norm(b);
13289
+ }
12690
13290
  function applyVoiceGreeting(prev, text, welcomeId, others, makeBubble) {
12691
13291
  if (welcomeId) {
12692
13292
  const at = prev.findIndex(m => m.id === welcomeId);
@@ -12699,11 +13299,104 @@
12699
13299
  return next;
12700
13300
  }
12701
13301
  }
12702
- const shown = [...prev, ...(others || [])].some(m => m.role === "assistant" && typeof m.content === "string" && m.content.trim() === text);
13302
+ const shown = [...prev, ...(others || [])].some(m => m.role === "assistant" && typeof m.content === "string" && sameGreeting(m.content, text));
12703
13303
  if (shown) return prev;
12704
13304
  return [...prev, makeBubble(text)];
12705
13305
  }
12706
13306
 
13307
+ /**
13308
+ * The card a voice answer puts on the call screen.
13309
+ *
13310
+ * voice-runtime sends `{"a2ui": {"blocks": ["```eshal-ui ...```", ...]}}`
13311
+ * while the agent is still speaking. The blocks are already fenced, so the
13312
+ * chat's markdown renderer shows them unchanged. The card belongs to the last
13313
+ * assistant message and stays on screen until a newer answer has words of
13314
+ * its own.
13315
+ * Mirrors packages/frontend/src/components/chatbot-preview/voiceCard.ts.
13316
+ */
13317
+
13318
+ /** The joined card blocks if the event carries a card, else null. */
13319
+ function voiceCardText(event) {
13320
+ const blocks = event?.a2ui?.blocks;
13321
+ if (!Array.isArray(blocks)) return null;
13322
+ const parts = blocks.filter(b => typeof b === "string" && b.trim() !== "");
13323
+ return parts.length ? parts.join("\n\n") : null;
13324
+ }
13325
+
13326
+ /** The messages with the event's card attached to the last assistant message. */
13327
+ function applyVoiceCard(messages, event) {
13328
+ const card = voiceCardText(event);
13329
+ if (!card) return messages;
13330
+ for (let i = messages.length - 1; i >= 0; i--) {
13331
+ if (messages[i].role === "assistant") {
13332
+ const next = [...messages];
13333
+ next[i] = {
13334
+ ...next[i],
13335
+ a2ui: card
13336
+ };
13337
+ return next;
13338
+ }
13339
+ }
13340
+ return messages;
13341
+ }
13342
+
13343
+ /**
13344
+ * The card on screen: the last card an answer carried. It stays while the
13345
+ * caller speaks and while the next answer is still on its way (dev, 5 Nov
13346
+ * 2026: a payment link vanished the moment the caller asked about it), and
13347
+ * goes once a newer answer has words of its own.
13348
+ */
13349
+ function latestVoiceCard(lines) {
13350
+ for (let i = lines.length - 1; i >= 0; i--) {
13351
+ const line = lines[i];
13352
+ if (line.role !== "assistant") continue;
13353
+ if (line.a2ui) return line.a2ui;
13354
+ if (!line.isProcessing && (line.content || "").trim()) return "";
13355
+ }
13356
+ return "";
13357
+ }
13358
+ const CARD_FENCE = /```[ \t]*(?:eshal-ui|eshal-chart|chart)\b[^\n]*\n[\s\S]*?(?:```|$)/g;
13359
+
13360
+ /**
13361
+ * An answer's words without its cards. On the call screen the card is drawn
13362
+ * below the answer, so its title and body would otherwise show twice.
13363
+ */
13364
+ function withoutCards(text) {
13365
+ return (text || "").replace(CARD_FENCE, "").replace(/\n{3,}/g, "\n\n").trim();
13366
+ }
13367
+
13368
+ // `[7]`, `[7][8]`, `[7, 8]`, `[7-9]`: the same shapes the frontend's
13369
+ // stripCitationMarkers drops (U+2013 written as an escape).
13370
+ const CITATION_MARKERS = /\s*\[\d+(?:\s*[,\-–]\s*\d+)*\](?:\s*\[\d+(?:\s*[,\-–]\s*\d+)*\])*/g;
13371
+
13372
+ /**
13373
+ * The words a call line shows: no cards and no citation markers. The call
13374
+ * screen has no source pills; the chat shows them once the call ends.
13375
+ */
13376
+ function callLineText(text) {
13377
+ return withoutCards(text).replace(CITATION_MARKERS, "").replace(/\s+([.,;:!?])/g, "$1").replace(/[ \t]{2,}/g, " ").trim();
13378
+ }
13379
+
13380
+ /**
13381
+ * A card button whose value is a web address (a payment or check-in link)
13382
+ * opens in a new tab rather than being sent as the caller's next turn.
13383
+ * Returns true when it was a link and was opened.
13384
+ */
13385
+ function openCardLink(value, open = url => {
13386
+ window.open(url, "_blank", "noopener,noreferrer");
13387
+ }) {
13388
+ const text = String(value ?? "").trim();
13389
+ let url;
13390
+ try {
13391
+ url = new URL(text);
13392
+ } catch {
13393
+ return false; // not an address: a choice the agent should hear
13394
+ }
13395
+ if (url.protocol !== "https:" && url.protocol !== "http:") return false;
13396
+ open(url.href);
13397
+ return true;
13398
+ }
13399
+
12707
13400
  /**
12708
13401
  * Replies the widget never streamed itself.
12709
13402
  *
@@ -13619,6 +14312,9 @@
13619
14312
  // Bidi/Voice state
13620
14313
  const [isConversationLoading, setIsConversationLoading] = reactExports.useState(false);
13621
14314
  const [isVoiceSessionActive, setIsVoiceSessionActive] = reactExports.useState(false);
14315
+ // The call screen's Pause (toggleVoicePause): mic frames are dropped before
14316
+ // the speech gate while true. The socket stays open.
14317
+ const [isVoicePaused, setIsVoicePaused] = reactExports.useState(false);
13622
14318
  const [bidiMessages, setBidiMessages] = reactExports.useState([]);
13623
14319
  const [voiceStatus, setVoiceStatus] = reactExports.useState("idle"); // 'idle' | 'connecting' | 'connected' | 'error'
13624
14320
  const [voiceError, setVoiceError] = reactExports.useState(null);
@@ -13751,9 +14447,14 @@
13751
14447
  });
13752
14448
  };
13753
14449
  const currentInputMessageIdRef = reactExports.useRef(null);
14450
+ // voice-runtime's live turn bubble (inputTranscription.replace). Only its
14451
+ // finished question clears it, never an interruption or a word of the bot's
14452
+ // reply, so a question spoken over the agent shows once.
14453
+ const liveInputMessageIdRef = reactExports.useRef(null);
13754
14454
  const currentAssistantMessageIdRef = reactExports.useRef(null);
13755
14455
  const isAudioReadyRef = reactExports.useRef(false);
13756
14456
  const isVoiceSessionActiveRef = reactExports.useRef(false);
14457
+ const isVoicePausedRef = reactExports.useRef(false);
13757
14458
  reactExports.useRef(null);
13758
14459
  const pendingAssistantUpdateRef = reactExports.useRef(null); // Track pending assistant updates to prevent duplicates
13759
14460
  reactExports.useRef(null); // Track when user started speaking for proper timestamp ordering
@@ -15097,25 +15798,39 @@
15097
15798
  });
15098
15799
  currentInputMessageIdRef.current = null;
15099
15800
  }, []);
15100
- const appendUserTranscription = reactExports.useCallback((text, finished = false) => {
15801
+ const appendUserTranscription = reactExports.useCallback((text, finished = false, replace = false) => {
15101
15802
  // Mark that user has spoken - now we can process assistant responses
15102
15803
  userHasSpokenRef.current = true;
15804
+
15805
+ // voice-runtime sends the whole turn so far each time (replace) and the
15806
+ // turn keeps its own marker; knowledge-api sends chunks to append to the
15807
+ // shared one. On the qa calls of 5 Nov 2026 the caller spoke over the
15808
+ // bot and the interruption cleared the shared marker between the live
15809
+ // words and the finished question, so the question showed twice.
15810
+ const inputIdRef = replace ? liveInputMessageIdRef : currentInputMessageIdRef;
15103
15811
  if (!text || typeof text === 'string' && !text.trim()) {
15104
- if (finished && currentInputMessageIdRef.current) {
15105
- setBidiMessages(prev => prev.map(message => message.id === currentInputMessageIdRef.current ? {
15106
- ...message,
15107
- isProcessing: false
15108
- } : message));
15109
- currentInputMessageIdRef.current = null;
15812
+ if (finished) {
15813
+ // The marker is read and cleared inside the update, like every
15814
+ // other use of it here (see the end of the update below).
15815
+ setBidiMessages(prev => {
15816
+ const doneId = inputIdRef.current;
15817
+ inputIdRef.current = null;
15818
+ if (!doneId) return prev;
15819
+ return prev.map(message => message.id === doneId ? {
15820
+ ...message,
15821
+ isProcessing: false
15822
+ } : message);
15823
+ });
15110
15824
  }
15111
15825
  return;
15112
15826
  }
15113
15827
  const chunk = cleanCJKSpaces(text);
15828
+ const join = previous => replace ? chunk : cleanCJKSpaces(`${previous || ""}${chunk}`);
15114
15829
  setBidiMessages(prev => {
15115
15830
  const prevLength = prev.length;
15116
15831
  let result = [...prev]; // Create new array to avoid mutations
15117
15832
 
15118
- if (!currentInputMessageIdRef.current) {
15833
+ if (!inputIdRef.current) {
15119
15834
  const newId = `bidi-input-${Date.now()}`;
15120
15835
  const latestAssistantMessage = prev.filter(m => m.role === "assistant" && m.metadata?.source === "bidi").sort((a, b) => {
15121
15836
  const timeA = a.timestamp instanceof Date ? a.timestamp.getTime() : new Date(a.timestamp).getTime();
@@ -15142,27 +15857,27 @@
15142
15857
  if (!messageExists) {
15143
15858
  result = [...result, userMessage];
15144
15859
  // Set ref AFTER adding message to result array
15145
- currentInputMessageIdRef.current = newId;
15860
+ inputIdRef.current = newId;
15146
15861
  } else {
15147
15862
  console.warn("[BIDI] appendUserTranscription: message already exists, updating instead", {
15148
15863
  messageId: newId
15149
15864
  });
15150
- currentInputMessageIdRef.current = newId;
15865
+ inputIdRef.current = newId;
15151
15866
  result = result.map(msg => msg.id === newId ? {
15152
15867
  ...msg,
15153
- content: `${msg.content || ""}${chunk}`,
15868
+ content: replace ? chunk : `${msg.content || ""}${chunk}`,
15154
15869
  isProcessing: !finished
15155
15870
  } : msg);
15156
15871
  }
15157
15872
  } else {
15158
15873
  // Update existing user message
15159
- const userMessageExists = result.some(m => m.id === currentInputMessageIdRef.current);
15874
+ const userMessageExists = result.some(m => m.id === inputIdRef.current);
15160
15875
  if (userMessageExists) {
15161
15876
  result = result.map(message => {
15162
- if (message.id !== currentInputMessageIdRef.current) {
15877
+ if (message.id !== inputIdRef.current) {
15163
15878
  return message;
15164
15879
  }
15165
- const combined = cleanCJKSpaces(`${message.content || ""}${chunk}`);
15880
+ const combined = join(message.content);
15166
15881
  return {
15167
15882
  ...message,
15168
15883
  content: combined,
@@ -15177,12 +15892,12 @@
15177
15892
  });
15178
15893
  } else {
15179
15894
  console.error("[BIDI] appendUserTranscription: ERROR - user message not found!", {
15180
- expectedId: currentInputMessageIdRef.current,
15895
+ expectedId: inputIdRef.current,
15181
15896
  existingIds: result.map(m => m.id)
15182
15897
  });
15183
15898
  // Message was lost - create a new one
15184
15899
  const newId = `bidi-input-${Date.now()}`;
15185
- currentInputMessageIdRef.current = newId;
15900
+ inputIdRef.current = newId;
15186
15901
  const userMessage = createMessage({
15187
15902
  id: newId,
15188
15903
  role: "user",
@@ -15200,6 +15915,14 @@
15200
15915
  }
15201
15916
  }
15202
15917
 
15918
+ // A finished turn clears its marker here, inside the update that read
15919
+ // it. React can run this update after the call returns; clearing the
15920
+ // marker outside it then let the update see no marker and add the
15921
+ // finished question as a second bubble.
15922
+ if (finished) {
15923
+ inputIdRef.current = null;
15924
+ }
15925
+
15203
15926
  // CRITICAL: Safety check - never return fewer messages than we started with
15204
15927
  if (result.length < prevLength) {
15205
15928
  console.error("[BIDI] appendUserTranscription: CRITICAL ERROR - losing messages!", {
@@ -15221,7 +15944,6 @@
15221
15944
  return result;
15222
15945
  });
15223
15946
  if (finished) {
15224
- currentInputMessageIdRef.current = null;
15225
15947
  setIsLoading(true);
15226
15948
  }
15227
15949
  }, []);
@@ -15443,16 +16165,12 @@
15443
16165
  });
15444
16166
  currentAssistantMessageIdRef.current = null;
15445
16167
  pendingAssistantUpdateRef.current = null;
15446
- } else {
15447
- // Clear pending update ref after state update completes to allow new updates
15448
- // Use a microtask to clear after React has processed the update
15449
- const keyToClear = updateKey;
15450
- Promise.resolve().then(() => {
15451
- if (pendingAssistantUpdateRef.current === keyToClear) {
15452
- pendingAssistantUpdateRef.current = null;
15453
- }
15454
- });
15455
16168
  }
16169
+ // A partial transcript used to clear pendingAssistantUpdateRef in a
16170
+ // microtask keyed on `updateKey`, a name never defined here. It threw on
16171
+ // every partial, and the socket handler dropped the rest of that message
16172
+ // (its audio, its prompts). Nothing sets the ref to a key, so there is
16173
+ // nothing to clear.
15456
16174
  }, []);
15457
16175
  const handleContentParts = reactExports.useCallback((parts, finished = false, audioOnly = false) => {
15458
16176
  console.log("[BIDI] handleContentParts called", {
@@ -15540,11 +16258,14 @@
15540
16258
  setIsVoiceSessionActive(false);
15541
16259
  setIsLoading(false);
15542
16260
  isVoiceSessionActiveRef.current = false;
16261
+ isVoicePausedRef.current = false;
16262
+ setIsVoicePaused(false);
15543
16263
  setVoiceStatus("idle");
15544
16264
  setVoiceError(null);
15545
16265
 
15546
16266
  // Reset userHasSpoken flag when stopping session
15547
16267
  userHasSpokenRef.current = false;
16268
+ liveInputMessageIdRef.current = null;
15548
16269
  pendingVoiceSourcesRef.current = null;
15549
16270
  if (bargeInTimerRef.current) clearTimeout(bargeInTimerRef.current);
15550
16271
  bargeInTimerRef.current = null;
@@ -15639,6 +16360,13 @@
15639
16360
  });
15640
16361
  return;
15641
16362
  }
16363
+
16364
+ // Paused: the agent is not heard and its words are not shown. Audio
16365
+ // that arrives now is dropped, not queued for after the pause.
16366
+ if (isVoicePausedRef.current && (event.content?.parts || event.outputTranscription || event.greeting)) {
16367
+ if (event.turnComplete) handleTurnComplete();
16368
+ return;
16369
+ }
15642
16370
  if (event.interrupted) {
15643
16371
  console.log("[BIDI] handleBidiEvent: processing interrupted");
15644
16372
  handleInterrupted();
@@ -15658,7 +16386,7 @@
15658
16386
  // Only call appendUserTranscription if there's actual text or if it's finished
15659
16387
  if (transcriptionText || transcriptionFinished) {
15660
16388
  updateActivity(organizationId);
15661
- appendUserTranscription(transcriptionText, transcriptionFinished);
16389
+ appendUserTranscription(transcriptionText, transcriptionFinished, Boolean(event.inputTranscription.replace));
15662
16390
  } else {
15663
16391
  console.warn("[BIDI] handleBidiEvent: inputTranscription event has no text and not finished", event.inputTranscription);
15664
16392
  }
@@ -15712,6 +16440,14 @@
15712
16440
  });
15713
16441
  }
15714
16442
 
16443
+ // The card a voice answer puts on the call screen (lib/voiceCard.js).
16444
+ // It is silent, so it is kept even while paused; finalTranscript only
16445
+ // replaces content, so the card survives it.
16446
+ if (voiceCardText(event)) {
16447
+ setBidiMessages(prev => applyVoiceCard(prev, event));
16448
+ return;
16449
+ }
16450
+
15715
16451
  // Voice citations (round 3): the streaming voice path fans out ADK
15716
16452
  // *partial* deltas as the live transcript, but only the FINAL answer
15717
16453
  // carries the trailing `[N]` markers, so the accumulated transcript had no
@@ -15835,7 +16571,9 @@
15835
16571
  }
15836
16572
  }, [appendAssistantContent, appendUserTranscription, handleContentParts, handleInterrupted, handleTurnComplete, stopVoiceSession, settleBargeIn]);
15837
16573
  const handleRecorderAudio = reactExports.useCallback(pcmData => {
15838
- if (!isVoiceSessionActiveRef.current) {
16574
+ // Frames after the session stopped, or while the call is paused, are
16575
+ // dropped before the gate sees them.
16576
+ if (!isVoiceSessionActiveRef.current || isVoicePausedRef.current) {
15839
16577
  return;
15840
16578
  }
15841
16579
  // Route mic frames through the VAD gate: it forwards only voiced frames
@@ -16073,8 +16811,11 @@
16073
16811
 
16074
16812
  // Reset userHasSpoken flag when starting new session
16075
16813
  userHasSpokenRef.current = false;
16814
+ liveInputMessageIdRef.current = null;
16076
16815
  greetingActiveRef.current = false;
16077
16816
  voiceWelcomeIdRef.current = null;
16817
+ isVoicePausedRef.current = false;
16818
+ setIsVoicePaused(false);
16078
16819
  setBidiMessages(prev => {
16079
16820
  // Don't add welcome message if there are already any messages (either bidi or text)
16080
16821
  // This prevents showing welcome message when turning voice on again after a conversation
@@ -16118,6 +16859,33 @@
16118
16859
  }
16119
16860
  void startVoiceSession();
16120
16861
  }, [isVoiceSessionActive, startVoiceSession, stopVoiceSession, voiceStatus]);
16862
+
16863
+ // The call screen's Pause stops sending mic audio without closing the
16864
+ // socket, and silences the agent: what it was saying stops now. A turn the
16865
+ // caller was in the middle of is closed with audio_end, so the server does
16866
+ // not wait on audio that will not come.
16867
+ const toggleVoicePause = reactExports.useCallback(() => {
16868
+ const next = !isVoicePausedRef.current;
16869
+ isVoicePausedRef.current = next;
16870
+ setIsVoicePaused(next);
16871
+ if (!next) return;
16872
+ audioPlayerNodeRef.current?.port.postMessage({
16873
+ command: "endOfAudio"
16874
+ });
16875
+ if (bargeInTimerRef.current) clearTimeout(bargeInTimerRef.current);
16876
+ bargeInTimerRef.current = null;
16877
+ bargeInPendingRef.current = false;
16878
+ const gate = speechGateRef.current;
16879
+ if (gate?.isSpeaking()) {
16880
+ const ws = websocketRef.current;
16881
+ if (ws && ws.readyState === WebSocket.OPEN) {
16882
+ ws.send(JSON.stringify({
16883
+ type: "audio_end"
16884
+ }));
16885
+ }
16886
+ }
16887
+ gate?.reset();
16888
+ }, []);
16121
16889
  const sendBidiTextMessage = reactExports.useCallback(text => {
16122
16890
  const trimmed = text.trim();
16123
16891
  if (!trimmed) {
@@ -16389,6 +17157,14 @@
16389
17157
  }, [organizationId, inactivityTimeoutValue, inactivityTimeoutUnit, bidiSessionId]);
16390
17158
  const memoizedQuickQuestions = reactExports.useMemo(() => quickQuestions, [quickQuestions]);
16391
17159
 
17160
+ // What the call screen's glow reads (hooks/useVoiceCallLevel.js): the
17161
+ // player it taps and the speech gate. Refs only, so the object is stable.
17162
+ const voiceLevelSource = reactExports.useMemo(() => ({
17163
+ playerNodeRef: audioPlayerNodeRef,
17164
+ playerContextRef: audioPlayerContextRef,
17165
+ speechGateRef
17166
+ }), []);
17167
+
16392
17168
  // Merge and sort messages from both sources (text and voice) by timestamp
16393
17169
  // This ensures all messages persist regardless of voice session state
16394
17170
  const activeMessages = reactExports.useMemo(() => mergeTranscript(messages, bidiMessages), [bidiMessages, messages]);
@@ -16432,6 +17208,10 @@
16432
17208
  voiceStatus,
16433
17209
  voiceError,
16434
17210
  voiceConclusionForCsat,
17211
+ // The voice call screen: the call's own lines, Pause, and the glow's source.
17212
+ bidiMessages,
17213
+ isVoicePaused,
17214
+ voiceLevelSource,
16435
17215
  // Onboarding state
16436
17216
  onboardingQuestions,
16437
17217
  onboardingActive,
@@ -16459,6 +17239,7 @@
16459
17239
  handleDecision,
16460
17240
  // Bidi/Voice actions
16461
17241
  handleVoiceToggle,
17242
+ toggleVoicePause,
16462
17243
  sendBidiTextMessage,
16463
17244
  // Session lifecycle
16464
17245
  sessionExpiringSoon,
@@ -16609,7 +17390,7 @@
16609
17390
  * See the LICENSE file in the root directory of this source tree.
16610
17391
  */
16611
17392
 
16612
- const __iconNode$j = [["path", {
17393
+ const __iconNode$m = [["path", {
16613
17394
  d: "M2 10v3",
16614
17395
  key: "1fnikh"
16615
17396
  }], ["path", {
@@ -16628,7 +17409,7 @@
16628
17409
  d: "M22 10v3",
16629
17410
  key: "154ddg"
16630
17411
  }]];
16631
- const AudioLines = createLucideIcon("audio-lines", __iconNode$j);
17412
+ const AudioLines = createLucideIcon("audio-lines", __iconNode$m);
16632
17413
 
16633
17414
  /**
16634
17415
  * @license lucide-react v0.575.0 - ISC
@@ -16637,11 +17418,11 @@
16637
17418
  * See the LICENSE file in the root directory of this source tree.
16638
17419
  */
16639
17420
 
16640
- const __iconNode$i = [["path", {
17421
+ const __iconNode$l = [["path", {
16641
17422
  d: "M20 6 9 17l-5-5",
16642
17423
  key: "1gmf2c"
16643
17424
  }]];
16644
- const Check = createLucideIcon("check", __iconNode$i);
17425
+ const Check = createLucideIcon("check", __iconNode$l);
16645
17426
 
16646
17427
  /**
16647
17428
  * @license lucide-react v0.575.0 - ISC
@@ -16650,11 +17431,11 @@
16650
17431
  * See the LICENSE file in the root directory of this source tree.
16651
17432
  */
16652
17433
 
16653
- const __iconNode$h = [["path", {
17434
+ const __iconNode$k = [["path", {
16654
17435
  d: "m15 18-6-6 6-6",
16655
17436
  key: "1wnfg3"
16656
17437
  }]];
16657
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$h);
17438
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$k);
16658
17439
 
16659
17440
  /**
16660
17441
  * @license lucide-react v0.575.0 - ISC
@@ -16663,11 +17444,11 @@
16663
17444
  * See the LICENSE file in the root directory of this source tree.
16664
17445
  */
16665
17446
 
16666
- const __iconNode$g = [["path", {
17447
+ const __iconNode$j = [["path", {
16667
17448
  d: "m9 18 6-6-6-6",
16668
17449
  key: "mthhwq"
16669
17450
  }]];
16670
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$g);
17451
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$j);
16671
17452
 
16672
17453
  /**
16673
17454
  * @license lucide-react v0.575.0 - ISC
@@ -16676,7 +17457,7 @@
16676
17457
  * See the LICENSE file in the root directory of this source tree.
16677
17458
  */
16678
17459
 
16679
- const __iconNode$f = [["circle", {
17460
+ const __iconNode$i = [["circle", {
16680
17461
  cx: "12",
16681
17462
  cy: "12",
16682
17463
  r: "10",
@@ -16694,7 +17475,7 @@
16694
17475
  y2: "16",
16695
17476
  key: "4dfq90"
16696
17477
  }]];
16697
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$f);
17478
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$i);
16698
17479
 
16699
17480
  /**
16700
17481
  * @license lucide-react v0.575.0 - ISC
@@ -16703,7 +17484,7 @@
16703
17484
  * See the LICENSE file in the root directory of this source tree.
16704
17485
  */
16705
17486
 
16706
- const __iconNode$e = [["rect", {
17487
+ const __iconNode$h = [["rect", {
16707
17488
  width: "14",
16708
17489
  height: "14",
16709
17490
  x: "8",
@@ -16715,7 +17496,7 @@
16715
17496
  d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",
16716
17497
  key: "zix9uf"
16717
17498
  }]];
16718
- const Copy = createLucideIcon("copy", __iconNode$e);
17499
+ const Copy = createLucideIcon("copy", __iconNode$h);
16719
17500
 
16720
17501
  /**
16721
17502
  * @license lucide-react v0.575.0 - ISC
@@ -16724,7 +17505,7 @@
16724
17505
  * See the LICENSE file in the root directory of this source tree.
16725
17506
  */
16726
17507
 
16727
- const __iconNode$d = [["circle", {
17508
+ const __iconNode$g = [["circle", {
16728
17509
  cx: "12",
16729
17510
  cy: "12",
16730
17511
  r: "1",
@@ -16740,7 +17521,7 @@
16740
17521
  r: "1",
16741
17522
  key: "1pcz8c"
16742
17523
  }]];
16743
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$d);
17524
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$g);
16744
17525
 
16745
17526
  /**
16746
17527
  * @license lucide-react v0.575.0 - ISC
@@ -16749,7 +17530,7 @@
16749
17530
  * See the LICENSE file in the root directory of this source tree.
16750
17531
  */
16751
17532
 
16752
- const __iconNode$c = [["path", {
17533
+ const __iconNode$f = [["path", {
16753
17534
  d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
16754
17535
  key: "1oefj6"
16755
17536
  }], ["path", {
@@ -16765,7 +17546,7 @@
16765
17546
  d: "M16 17H8",
16766
17547
  key: "z1uh3a"
16767
17548
  }]];
16768
- const FileText = createLucideIcon("file-text", __iconNode$c);
17549
+ const FileText = createLucideIcon("file-text", __iconNode$f);
16769
17550
 
16770
17551
  /**
16771
17552
  * @license lucide-react v0.575.0 - ISC
@@ -16774,11 +17555,11 @@
16774
17555
  * See the LICENSE file in the root directory of this source tree.
16775
17556
  */
16776
17557
 
16777
- const __iconNode$b = [["path", {
17558
+ const __iconNode$e = [["path", {
16778
17559
  d: "M21 12a9 9 0 1 1-6.219-8.56",
16779
17560
  key: "13zald"
16780
17561
  }]];
16781
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$b);
17562
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$e);
16782
17563
 
16783
17564
  /**
16784
17565
  * @license lucide-react v0.575.0 - ISC
@@ -16787,11 +17568,11 @@
16787
17568
  * See the LICENSE file in the root directory of this source tree.
16788
17569
  */
16789
17570
 
16790
- const __iconNode$a = [["path", {
17571
+ const __iconNode$d = [["path", {
16791
17572
  d: "M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",
16792
17573
  key: "1sd12s"
16793
17574
  }]];
16794
- const MessageCircle = createLucideIcon("message-circle", __iconNode$a);
17575
+ const MessageCircle = createLucideIcon("message-circle", __iconNode$d);
16795
17576
 
16796
17577
  /**
16797
17578
  * @license lucide-react v0.575.0 - ISC
@@ -16800,11 +17581,11 @@
16800
17581
  * See the LICENSE file in the root directory of this source tree.
16801
17582
  */
16802
17583
 
16803
- const __iconNode$9 = [["path", {
17584
+ const __iconNode$c = [["path", {
16804
17585
  d: "M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",
16805
17586
  key: "kfwtm"
16806
17587
  }]];
16807
- const Moon = createLucideIcon("moon", __iconNode$9);
17588
+ const Moon = createLucideIcon("moon", __iconNode$c);
16808
17589
 
16809
17590
  /**
16810
17591
  * @license lucide-react v0.575.0 - ISC
@@ -16813,11 +17594,67 @@
16813
17594
  * See the LICENSE file in the root directory of this source tree.
16814
17595
  */
16815
17596
 
16816
- const __iconNode$8 = [["path", {
17597
+ const __iconNode$b = [["path", {
16817
17598
  d: "m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551",
16818
17599
  key: "1miecu"
16819
17600
  }]];
16820
- const Paperclip = createLucideIcon("paperclip", __iconNode$8);
17601
+ const Paperclip = createLucideIcon("paperclip", __iconNode$b);
17602
+
17603
+ /**
17604
+ * @license lucide-react v0.575.0 - ISC
17605
+ *
17606
+ * This source code is licensed under the ISC license.
17607
+ * See the LICENSE file in the root directory of this source tree.
17608
+ */
17609
+
17610
+ const __iconNode$a = [["rect", {
17611
+ x: "14",
17612
+ y: "3",
17613
+ width: "5",
17614
+ height: "18",
17615
+ rx: "1",
17616
+ key: "kaeet6"
17617
+ }], ["rect", {
17618
+ x: "5",
17619
+ y: "3",
17620
+ width: "5",
17621
+ height: "18",
17622
+ rx: "1",
17623
+ key: "1wsw3u"
17624
+ }]];
17625
+ const Pause = createLucideIcon("pause", __iconNode$a);
17626
+
17627
+ /**
17628
+ * @license lucide-react v0.575.0 - ISC
17629
+ *
17630
+ * This source code is licensed under the ISC license.
17631
+ * See the LICENSE file in the root directory of this source tree.
17632
+ */
17633
+
17634
+ const __iconNode$9 = [["path", {
17635
+ d: "M10.1 13.9a14 14 0 0 0 3.732 2.668 1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2 18 18 0 0 1-12.728-5.272",
17636
+ key: "1wngk7"
17637
+ }], ["path", {
17638
+ d: "M22 2 2 22",
17639
+ key: "y4kqgn"
17640
+ }], ["path", {
17641
+ d: "M4.76 13.582A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 .244.473",
17642
+ key: "10hv5p"
17643
+ }]];
17644
+ const PhoneOff = createLucideIcon("phone-off", __iconNode$9);
17645
+
17646
+ /**
17647
+ * @license lucide-react v0.575.0 - ISC
17648
+ *
17649
+ * This source code is licensed under the ISC license.
17650
+ * See the LICENSE file in the root directory of this source tree.
17651
+ */
17652
+
17653
+ const __iconNode$8 = [["path", {
17654
+ d: "M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",
17655
+ key: "10ikf1"
17656
+ }]];
17657
+ const Play = createLucideIcon("play", __iconNode$8);
16821
17658
 
16822
17659
  /**
16823
17660
  * @license lucide-react v0.575.0 - ISC
@@ -17418,7 +18255,7 @@
17418
18255
  }
17419
18256
  var jsxRuntimeExports = jsxRuntime.exports;
17420
18257
 
17421
- const MarkdownRenderer = /*#__PURE__*/reactExports.lazy(loadMarkdownRenderer);
18258
+ const MarkdownRenderer$1 = /*#__PURE__*/reactExports.lazy(loadMarkdownRenderer);
17422
18259
 
17423
18260
  // The IIFE build's chunk loader does a real network fetch for a sibling
17424
18261
  // script file (unlike the previous inlined-everything build, where the
@@ -17603,7 +18440,7 @@
17603
18440
  fontFamily: fontFamily,
17604
18441
  fontSize: fontSize
17605
18442
  }),
17606
- children: /*#__PURE__*/jsxRuntimeExports.jsx(MarkdownRenderer, {
18443
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(MarkdownRenderer$1, {
17607
18444
  content: displayedContent,
17608
18445
  isStreaming: isStreaming,
17609
18446
  isDark: isDark,
@@ -22176,6 +23013,423 @@
22176
23013
  });
22177
23014
  };
22178
23015
 
23016
+ /** The caller's level while the speech gate holds a voiced turn. */
23017
+ const CALLER_SPEAKING_LEVEL = 0.6;
23018
+ /** Below this the agent's output counts as silence. */
23019
+ const AGENT_SILENCE = 0.02;
23020
+ const FRAME_MS = 66;
23021
+ const QUIET = {
23022
+ level: 0,
23023
+ speaker: "none"
23024
+ };
23025
+
23026
+ /** Root mean square of an analyser's time-domain bytes, scaled to 0..1. */
23027
+ function levelFromTimeDomain(bytes) {
23028
+ if (!bytes || bytes.length === 0) return 0;
23029
+ let sum = 0;
23030
+ for (let i = 0; i < bytes.length; i++) {
23031
+ const v = (bytes[i] - 128) / 128;
23032
+ sum += v * v;
23033
+ }
23034
+ // Speech RMS sits well under 0.5; scale so normal speech fills the band.
23035
+ return Math.min(1, Math.sqrt(sum / bytes.length) * 3);
23036
+ }
23037
+
23038
+ /**
23039
+ * The glow band's level for the call screen: `{ level: 0..1, speaker }` with
23040
+ * speaker "agent", "caller" or "none". The agent's level is read from an
23041
+ * AnalyserNode tapped off the existing player worklet (a read-only branch,
23042
+ * the playback path is unchanged). The caller's level comes from the existing
23043
+ * speech gate's isSpeaking(), so no new mic processing is added.
23044
+ * Mirrors packages/frontend/src/components/chatbot-preview/useVoiceCallLevel.ts.
23045
+ *
23046
+ * `source` holds useChatState's refs: playerNodeRef, playerContextRef and
23047
+ * speechGateRef.
23048
+ */
23049
+ function useVoiceCallLevel(active, source) {
23050
+ const [state, setState] = reactExports.useState(QUIET);
23051
+ reactExports.useEffect(() => {
23052
+ if (!active || !source || typeof window === "undefined") return undefined;
23053
+ const {
23054
+ playerNodeRef,
23055
+ playerContextRef,
23056
+ speechGateRef
23057
+ } = source;
23058
+ let analyser = null;
23059
+ let tappedNode = null;
23060
+ let buffer = null;
23061
+ const ensureAnalyser = () => {
23062
+ const node = playerNodeRef?.current;
23063
+ const ctx = playerContextRef?.current;
23064
+ if (!node || !ctx || node === tappedNode) return;
23065
+ try {
23066
+ analyser = ctx.createAnalyser();
23067
+ analyser.fftSize = 512;
23068
+ node.connect(analyser);
23069
+ tappedNode = node;
23070
+ buffer = new Uint8Array(analyser.fftSize);
23071
+ } catch {
23072
+ analyser = null;
23073
+ }
23074
+ };
23075
+ const tick = () => {
23076
+ ensureAnalyser();
23077
+ let agent = 0;
23078
+ if (analyser && buffer) {
23079
+ try {
23080
+ analyser.getByteTimeDomainData(buffer);
23081
+ agent = levelFromTimeDomain(buffer);
23082
+ } catch {
23083
+ agent = 0; // the player's context was closed under us
23084
+ }
23085
+ }
23086
+ const callerSpeaking = Boolean(speechGateRef?.current?.isSpeaking?.());
23087
+ let next;
23088
+ if (agent > AGENT_SILENCE) next = {
23089
+ level: agent,
23090
+ speaker: "agent"
23091
+ };else if (callerSpeaking) next = {
23092
+ level: CALLER_SPEAKING_LEVEL,
23093
+ speaker: "caller"
23094
+ };else next = QUIET;
23095
+ setState(prev => prev.speaker === next.speaker && Math.abs(prev.level - next.level) < 0.03 ? prev : next);
23096
+ };
23097
+ const id = window.setInterval(tick, FRAME_MS);
23098
+ return () => {
23099
+ window.clearInterval(id);
23100
+ if (tappedNode && analyser) {
23101
+ try {
23102
+ tappedNode.disconnect(analyser);
23103
+ } catch {
23104
+ /* the player was already torn down */
23105
+ }
23106
+ }
23107
+ setState(QUIET);
23108
+ };
23109
+ }, [active, source]);
23110
+ return state;
23111
+ }
23112
+
23113
+ const MarkdownRenderer = /*#__PURE__*/reactExports.lazy(loadMarkdownRenderer);
23114
+
23115
+ /**
23116
+ * The voice call screen: while a voice session is active it takes the place of
23117
+ * the message list and the input. A status pill with the call time, the
23118
+ * agent's latest answer large (with the card it put on screen), the caller's
23119
+ * latest words above the controls, and a glow at the bottom that follows who
23120
+ * is speaking. When the call ends the chat returns with the call's lines.
23121
+ * Mirrors packages/frontend/src/components/chatbot-preview/VoiceCallView.tsx.
23122
+ */
23123
+
23124
+ /** The call status for the hook's voiceStatus while a session is active. */
23125
+ function voiceCallStatus(voiceStatus, isPaused) {
23126
+ if (voiceStatus === "connecting") return "connecting";
23127
+ if (voiceStatus === "connected") return isPaused ? "paused" : "live";
23128
+ // Active but the socket closed: the hook is waiting to reconnect.
23129
+ return "reconnecting";
23130
+ }
23131
+ function formatCallTime(totalSeconds) {
23132
+ const s = Math.max(0, Math.floor(totalSeconds));
23133
+ const mm = Math.floor(s / 60);
23134
+ const ss = s % 60;
23135
+ return `${String(mm).padStart(2, "0")}:${String(ss).padStart(2, "0")}`;
23136
+ }
23137
+ const DEFAULT_PRIMARY = "#1d4ed8";
23138
+
23139
+ /**
23140
+ * The agent's brand colour at an alpha, for the glow. Hex colours become
23141
+ * rgba(); any other CSS colour is mixed with transparent.
23142
+ */
23143
+ function withAlpha(color, alpha) {
23144
+ const value = String(color || DEFAULT_PRIMARY).trim();
23145
+ const hex = value.replace(/^#/, "");
23146
+ if (/^([0-9a-f]{3}|[0-9a-f]{6})$/i.test(hex)) {
23147
+ const full = hex.length === 3 ? hex.split("").map(c => c + c).join("") : hex;
23148
+ const n = parseInt(full, 16);
23149
+ return `rgba(${n >> 16 & 255}, ${n >> 8 & 255}, ${n & 255}, ${alpha})`;
23150
+ }
23151
+ return `color-mix(in srgb, ${value} ${Math.round(alpha * 100)}%, transparent)`;
23152
+ }
23153
+ function usePrefersReducedMotion() {
23154
+ const [reduced, setReduced] = reactExports.useState(false);
23155
+ reactExports.useEffect(() => {
23156
+ if (typeof window === "undefined" || !window.matchMedia) return undefined;
23157
+ const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
23158
+ setReduced(Boolean(mq.matches));
23159
+ const onChange = e => setReduced(e.matches);
23160
+ mq.addEventListener?.("change", onChange);
23161
+ return () => mq.removeEventListener?.("change", onChange);
23162
+ }, []);
23163
+ return reduced;
23164
+ }
23165
+
23166
+ /**
23167
+ * Seconds the call has been running: holds at 0 while connecting and stands
23168
+ * still while paused, so a paused call does not run up its time.
23169
+ */
23170
+ function useCallTimer(running) {
23171
+ const totalRef = reactExports.useRef(0); // ms counted before the current running stretch
23172
+ const [seconds, setSeconds] = reactExports.useState(0);
23173
+ reactExports.useEffect(() => {
23174
+ if (!running) return undefined;
23175
+ const since = Date.now();
23176
+ const update = () => setSeconds(Math.floor((totalRef.current + Date.now() - since) / 1000));
23177
+ update();
23178
+ const id = window.setInterval(update, 1000);
23179
+ return () => {
23180
+ window.clearInterval(id);
23181
+ totalRef.current += Date.now() - since;
23182
+ };
23183
+ }, [running]);
23184
+ return seconds;
23185
+ }
23186
+
23187
+ // The card falls back to nothing if the markdown chunk fails to load; the
23188
+ // call itself carries on. Keyed by the card, so a new card gets a new try.
23189
+ class CardBoundary extends reactExports.Component {
23190
+ state = {
23191
+ failed: false
23192
+ };
23193
+ static getDerivedStateFromError() {
23194
+ return {
23195
+ failed: true
23196
+ };
23197
+ }
23198
+ componentDidCatch(error) {
23199
+ // eslint-disable-next-line no-console
23200
+ console.error("[widget] call card failed to render:", error);
23201
+ }
23202
+ render() {
23203
+ return this.state.failed ? null : this.props.children;
23204
+ }
23205
+ }
23206
+
23207
+ // Three soft lights in the agent's brand colour, offset so their drift
23208
+ // overlaps.
23209
+ const GLOW_BLOBS = [{
23210
+ className: "-bottom-1/3 -left-[15%] h-[120%] w-[70%]",
23211
+ alpha: 0.7,
23212
+ animation: "animate-voice-glow"
23213
+ }, {
23214
+ className: "-bottom-1/3 left-[20%] h-[130%] w-[60%]",
23215
+ alpha: 0.45,
23216
+ animation: "animate-voice-glow-slow"
23217
+ }, {
23218
+ className: "-bottom-1/3 -right-[15%] h-[120%] w-[70%]",
23219
+ alpha: 0.2,
23220
+ animation: "animate-voice-glow"
23221
+ }];
23222
+ const STATUS_KEY = {
23223
+ connecting: "callConnecting",
23224
+ live: "callLive",
23225
+ paused: "callPaused",
23226
+ reconnecting: "callReconnecting"
23227
+ };
23228
+ function latestLine(lines, role) {
23229
+ for (let i = lines.length - 1; i >= 0; i--) {
23230
+ if (lines[i].role === "user" !== (role === "user")) continue;
23231
+ const text = callLineText(lines[i].content || "");
23232
+ if (text) return text;
23233
+ }
23234
+ return "";
23235
+ }
23236
+ function VoiceCallView({
23237
+ status,
23238
+ agentName,
23239
+ primaryColor,
23240
+ lines = [],
23241
+ level = 0,
23242
+ speaker = "none",
23243
+ isPaused = false,
23244
+ onTogglePause,
23245
+ onEnd,
23246
+ isDark = false,
23247
+ isRtl = false,
23248
+ errorText,
23249
+ onCardAction,
23250
+ defaultLanguage = "en",
23251
+ fontFamily
23252
+ }) {
23253
+ const t = reactExports.useMemo(() => createTranslator(defaultLanguage), [defaultLanguage]);
23254
+ const reducedMotion = usePrefersReducedMotion();
23255
+ const seconds = useCallTimer(status !== "connecting" && !isPaused);
23256
+ const scrollRef = reactExports.useRef(null);
23257
+ const lastContent = lines.length ? lines[lines.length - 1].content : "";
23258
+ const lastAgent = latestLine(lines, "agent");
23259
+ const lastCaller = latestLine(lines, "user");
23260
+ const card = latestVoiceCard(lines);
23261
+ reactExports.useEffect(() => {
23262
+ const el = scrollRef.current;
23263
+ if (el) el.scrollTop = el.scrollHeight;
23264
+ }, [lines.length, lastContent]);
23265
+
23266
+ // With reduced motion the band holds one gentle level instead of following
23267
+ // the audio.
23268
+ const shown = isPaused ? 0 : reducedMotion ? speaker === "none" ? 0.15 : 0.4 : level;
23269
+ // Silence is a low, faint glow; speech lifts and brightens it.
23270
+ const glowOpacity = isPaused ? 0.25 : 0.45 + shown * 0.55;
23271
+ const glowScale = 0.7 + shown * 0.3;
23272
+ const pulsing = status === "live" && !reducedMotion;
23273
+ const dotColor = status === "live" ? "bg-status-success" : status === "paused" ? "bg-gray-400" : "bg-status-warning";
23274
+ const labelClass = cn("text-xs font-medium", isDark ? "text-gray-200" : "text-slate-700");
23275
+ return /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23276
+ "data-testid": "voice-call-view",
23277
+ "data-reduced-motion": reducedMotion ? "true" : "false",
23278
+ dir: isRtl ? "rtl" : "ltr",
23279
+ className: cn("flex-1 min-h-0 flex flex-col", isDark ? "bg-gray-900 text-gray-100" : "bg-white text-gray-900"),
23280
+ style: fontFamily ? {
23281
+ fontFamily
23282
+ } : undefined,
23283
+ children: [/*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23284
+ className: "flex items-center justify-center gap-2 pt-3 pb-2 px-4 flex-shrink-0",
23285
+ children: [/*#__PURE__*/jsxRuntimeExports.jsx("span", {
23286
+ className: "sr-only",
23287
+ children: agentName
23288
+ }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23289
+ role: "status",
23290
+ "data-testid": "voice-call-status",
23291
+ className: cn(
23292
+ // border-solid: the widget runs without Tailwind's preflight, so
23293
+ // `border` alone sets only the width.
23294
+ "inline-flex items-center gap-1.5 rounded-full border border-solid px-2.5 py-0.5 text-xs font-medium", isDark ? "border-gray-700 bg-gray-800" : "border-slate-200 bg-slate-50"),
23295
+ children: [/*#__PURE__*/jsxRuntimeExports.jsxs("span", {
23296
+ className: "relative flex h-2 w-2",
23297
+ children: [pulsing && /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23298
+ "data-testid": "voice-call-pulse",
23299
+ className: cn("absolute inline-flex h-full w-full rounded-full opacity-60 animate-ping", dotColor)
23300
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23301
+ className: cn("relative inline-flex h-2 w-2 rounded-full", dotColor)
23302
+ })]
23303
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23304
+ children: t(STATUS_KEY[status] || STATUS_KEY.reconnecting)
23305
+ }), status !== "connecting" && /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23306
+ "data-testid": "voice-call-timer",
23307
+ dir: "ltr",
23308
+ className: "tabular-nums text-gray-500",
23309
+ children: formatCallTime(seconds)
23310
+ })]
23311
+ })]
23312
+ }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23313
+ ref: scrollRef,
23314
+ "aria-live": "polite",
23315
+ "aria-label": t("callTranscript"),
23316
+ className: "flex-1 min-h-0 overflow-y-auto px-5 pt-3 pb-2 flex flex-col",
23317
+ children: [lastAgent && /*#__PURE__*/jsxRuntimeExports.jsx("p", {
23318
+ "data-testid": "voice-call-line-agent",
23319
+ dir: "auto",
23320
+ className: cn("m-0 text-lg leading-snug font-medium whitespace-pre-wrap break-words", isDark ? "text-gray-100" : "text-gray-900"),
23321
+ children: lastAgent
23322
+ }), card ?
23323
+ /*#__PURE__*/
23324
+ // Full height: the call's middle area scrolls as one, so a card
23325
+ // never gets squeezed into a small box of its own.
23326
+ jsxRuntimeExports.jsx("div", {
23327
+ "data-testid": "voice-call-card",
23328
+ className: "flex-shrink-0 my-3",
23329
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(CardBoundary, {
23330
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(reactExports.Suspense, {
23331
+ fallback: null,
23332
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(MarkdownRenderer, {
23333
+ content: card,
23334
+ isDark: isDark,
23335
+ isRtl: isRtl,
23336
+ fontFamily: fontFamily,
23337
+ provideCitations: false,
23338
+ onButtonClick: value => onCardAction?.(String(value ?? ""))
23339
+ })
23340
+ })
23341
+ }, card)
23342
+ }) : null]
23343
+ }), lastCaller && /*#__PURE__*/jsxRuntimeExports.jsx("p", {
23344
+ "data-testid": "voice-call-line-caller",
23345
+ dir: "auto",
23346
+ className: cn("mx-5 mt-2 mb-0 flex-shrink-0 rounded-lg border border-solid px-3.5 py-2.5 text-sm italic break-words [overflow-wrap:anywhere]", isDark ? "border-gray-700 bg-gray-800 text-gray-300" : "border-slate-200 bg-slate-50 text-slate-600"),
23347
+ children: lastCaller
23348
+ }), errorText && /*#__PURE__*/jsxRuntimeExports.jsx("p", {
23349
+ role: "alert",
23350
+ className: "m-0 px-4 pt-1 text-xs text-status-error",
23351
+ children: errorText
23352
+ }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23353
+ className: "relative flex-shrink-0 overflow-hidden pt-10 pb-6",
23354
+ children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
23355
+ "aria-hidden": "true",
23356
+ "data-testid": "voice-call-glow",
23357
+ className: cn("pointer-events-none absolute inset-0 origin-bottom", !reducedMotion && "transition-[opacity,transform] duration-300 ease-out"),
23358
+ style: {
23359
+ opacity: glowOpacity,
23360
+ transform: `scaleY(${glowScale})`,
23361
+ WebkitMaskImage: "linear-gradient(to top, black 35%, transparent 100%)",
23362
+ maskImage: "linear-gradient(to top, black 35%, transparent 100%)"
23363
+ },
23364
+ children: GLOW_BLOBS.map(blob => /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23365
+ className: cn("absolute rounded-full blur-2xl", blob.className, !reducedMotion && !isPaused && blob.animation),
23366
+ style: {
23367
+ background: withAlpha(primaryColor, blob.alpha)
23368
+ }
23369
+ }, blob.className))
23370
+ }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23371
+ className: "relative z-10 flex items-start justify-center gap-10",
23372
+ children: [/*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23373
+ className: "flex flex-col items-center gap-1.5",
23374
+ children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
23375
+ type: "button",
23376
+ onClick: onTogglePause,
23377
+ "aria-label": isPaused ? t("callResume") : t("callPause"),
23378
+ "aria-pressed": isPaused,
23379
+ className: cn("h-12 w-12 p-0 rounded-full flex items-center justify-center border border-solid shadow-sm cursor-pointer transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2", isDark ? "bg-gray-800 border-gray-700 text-gray-100 hover:bg-gray-700 focus-visible:ring-offset-gray-900" : "bg-white border-slate-200 text-gray-900 hover:bg-slate-50"),
23380
+ children: isPaused ? /*#__PURE__*/jsxRuntimeExports.jsx(Play, {
23381
+ className: "h-5 w-5",
23382
+ "aria-hidden": "true"
23383
+ }) : /*#__PURE__*/jsxRuntimeExports.jsx(Pause, {
23384
+ className: "h-5 w-5",
23385
+ "aria-hidden": "true"
23386
+ })
23387
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23388
+ className: labelClass,
23389
+ children: isPaused ? t("callResumeLabel") : t("callPauseLabel")
23390
+ })]
23391
+ }), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
23392
+ className: "flex flex-col items-center gap-1.5",
23393
+ children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
23394
+ type: "button",
23395
+ onClick: onEnd,
23396
+ "aria-label": t("callEnd"),
23397
+ className: "h-12 w-12 p-0 rounded-full flex items-center justify-center border-0 bg-red-600 text-white shadow-sm cursor-pointer transition-colors duration-200 hover:bg-red-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-600 focus-visible:ring-offset-2",
23398
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(PhoneOff, {
23399
+ className: "h-5 w-5",
23400
+ "aria-hidden": "true"
23401
+ })
23402
+ }), /*#__PURE__*/jsxRuntimeExports.jsx("span", {
23403
+ className: labelClass,
23404
+ children: t("callEndLabel")
23405
+ })]
23406
+ })]
23407
+ })]
23408
+ })]
23409
+ });
23410
+ }
23411
+
23412
+ /**
23413
+ * The call screen fed by the live audio level. Kept apart from the view so
23414
+ * only this small tree re-renders as the level changes (about 15 times a
23415
+ * second), not the chat window. `levelSource` holds useChatState's player and
23416
+ * speech gate refs.
23417
+ */
23418
+ function LiveVoiceCallView({
23419
+ levelSource,
23420
+ ...props
23421
+ }) {
23422
+ const {
23423
+ level,
23424
+ speaker
23425
+ } = useVoiceCallLevel(!props.isPaused, levelSource);
23426
+ return /*#__PURE__*/jsxRuntimeExports.jsx(VoiceCallView, {
23427
+ ...props,
23428
+ level: level,
23429
+ speaker: speaker
23430
+ });
23431
+ }
23432
+
22179
23433
  /**
22180
23434
  * Auto-scroll hook that scrolls to bottom when dependencies change
22181
23435
  */
@@ -22649,6 +23903,14 @@
22649
23903
  voiceConclusionForCsat = false,
22650
23904
  onVoiceToggle,
22651
23905
  onBidiSubmit,
23906
+ // The voice call screen: the call's own lines (useChatState's
23907
+ // bidiMessages), Pause, the glow's level source, and the text send a card
23908
+ // click goes through.
23909
+ bidiMessages = [],
23910
+ isVoicePaused = false,
23911
+ onToggleVoicePause,
23912
+ voiceLevelSource,
23913
+ onBidiTextMessage,
22652
23914
  disclaimerEnabled = false,
22653
23915
  disclaimerText,
22654
23916
  disclaimerPosition = "top",
@@ -22940,6 +24202,18 @@
22940
24202
  delay: 0
22941
24203
  });
22942
24204
  const isRtlLanguage = isRtlLocale(defaultLanguage);
24205
+
24206
+ // While a voice call is live the body becomes the call screen; when it
24207
+ // ends the chat returns with the call's lines kept as messages.
24208
+ const showCallView = isVoiceSessionActive;
24209
+ // A card button on the call screen: a web address (a payment or check-in
24210
+ // link) opens in a new tab, anything else is the caller's next turn.
24211
+ const handleVoiceCardAction = reactExports.useCallback(value => {
24212
+ if (!openCardLink(value)) onBidiTextMessage?.(value);
24213
+ }, [onBidiTextMessage]);
24214
+ // EV-3813: voiceError is an i18n code (lib/voiceErrors.js), resolved the
24215
+ // way ChatInput resolves it.
24216
+ const voiceErrorText = voiceError ? t(voiceError) === voiceError ? t("voiceUnavailable") : t(voiceError) : null;
22943
24217
  const resolvedAgentBubbleColor = reactExports.useMemo(() => {
22944
24218
  if (isDark) {
22945
24219
  if (isDefaultColor(agentMessageBubbleColor, DEFAULT_AGENT_BUBBLE_COLOR)) {
@@ -23483,7 +24757,22 @@
23483
24757
  isRtl: isRtlLanguage,
23484
24758
  defaultLanguage: defaultLanguage
23485
24759
  }), !isMinimized && /*#__PURE__*/jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
23486
- children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
24760
+ children: [showCallView ? /*#__PURE__*/jsxRuntimeExports.jsx(LiveVoiceCallView, {
24761
+ levelSource: voiceLevelSource,
24762
+ status: voiceCallStatus(voiceStatus, isVoicePaused),
24763
+ agentName: conciergeName || companyName,
24764
+ primaryColor: primaryColor,
24765
+ lines: bidiMessages,
24766
+ isPaused: isVoicePaused,
24767
+ onTogglePause: onToggleVoicePause,
24768
+ onEnd: onVoiceToggle,
24769
+ isDark: isDark,
24770
+ isRtl: isRtlLanguage,
24771
+ errorText: voiceErrorText,
24772
+ onCardAction: handleVoiceCardAction,
24773
+ defaultLanguage: defaultLanguage,
24774
+ fontFamily: fontFamily
24775
+ }) : /*#__PURE__*/jsxRuntimeExports.jsx("div", {
23487
24776
  ref: messagesContainerRef,
23488
24777
  role: "log",
23489
24778
  "aria-live": "polite",
@@ -23581,64 +24870,68 @@
23581
24870
  })
23582
24871
  })]
23583
24872
  })
23584
- }), !(onboardingActive && !onboardingCompleted) && /*#__PURE__*/jsxRuntimeExports.jsx(ChatInput, {
23585
- onSynthesizeAssistantMessage: onSynthesizeAssistantMessage,
23586
- onStopGeneration: onStopGeneration,
23587
- inputValue: inputValue,
23588
- setInputValue: setInputValue,
23589
- onSend: onSend,
23590
- isDark: isDark,
23591
- primaryColor: primaryColor,
23592
- isOpen: isOpen,
23593
- isMinimized: isMinimized,
23594
- isLoading: isLoading,
23595
- isConversationLoading: isConversationLoading,
23596
- verificationPending: verificationPendingKeys.size > 0,
23597
- placeholder: placeholder,
23598
- textColor: resolvedTextColor,
23599
- fontFamily: fontFamily,
23600
- userMessageBubbleFontFamily: userMessageBubbleFontFamily,
23601
- userMessageBubbleFontSize: userMessageBubbleFontSize,
23602
- fontSize: fontSize,
23603
- isRtl: isRtlLanguage,
23604
- csatVisible: showCsat && csatEnabled && !csatSubmitted || isCsatEnabled && (showResolveForm || isConversationResolved),
23605
- enableVoiceInteraction: enableVoiceInteraction,
23606
- isVoiceSessionActive: isVoiceSessionActive,
23607
- voiceStatus: voiceStatus,
23608
- voiceError: voiceError,
23609
- onVoiceToggle: onVoiceToggle,
23610
- onBidiSubmit: onBidiSubmit,
23611
- disclaimerEnabled: disclaimerEnabled,
23612
- disclaimerText: disclaimerText,
23613
- disclaimerPosition: disclaimerPosition,
23614
- disclaimerLinkUrl: disclaimerLinkUrl,
23615
- disclaimerLinkLabel: disclaimerLinkLabel,
23616
- showPoweredBy: showPoweredBy,
23617
- defaultLanguage: defaultLanguage,
23618
- onboardingQuestions: onboardingQuestions,
23619
- onboardingActive: onboardingActive,
23620
- onboardingCompleted: onboardingCompleted,
23621
- onboardingEnabled: onboardingEnabled,
23622
- userMessageBoxColor: userMessageBoxColor,
23623
- resolvedUserMessageColor: resolvedUserMessageColor,
23624
- userTextColor: userTextColor,
23625
- promptSuggestions: showResolveForm || isConversationResolved || autoPromptEnabled === false || isLoading ? [] : stablePromptSuggestions,
23626
- onPromptSuggestionClick: stableOnPromptSuggestionClick,
23627
- autoPromptQuestionDisplay: autoPromptQuestionDisplay,
23628
- tagSelectorNode: null,
23629
- showResolveButton: isCsatEnabled && hasUserMessages && !isConversationResolved && !showResolveForm && !showCsat && !shouldHideResolveForOnboarding,
23630
- onResolve: () => {
23631
- if (!isCsatEnabled) return;
23632
- setShowResolveForm(true);
23633
- }
23634
- // Attachments (RAG-attach-1) - paperclip stays hidden
23635
- // unless the operator explicitly opted in via
23636
- // MasterAgent.config.chatFeatures.
23637
- ,
23638
- chatFeatures: chatFeatures,
23639
- apiEndpoint: apiBaseUrl,
23640
- organizationId: organizationId,
23641
- conversationId: conversationId
24873
+ }), !(onboardingActive && !onboardingCompleted) && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
24874
+ className: showCallView ? "hidden" : "contents",
24875
+ "data-testid": "chat-input-slot",
24876
+ children: /*#__PURE__*/jsxRuntimeExports.jsx(ChatInput, {
24877
+ onSynthesizeAssistantMessage: onSynthesizeAssistantMessage,
24878
+ onStopGeneration: onStopGeneration,
24879
+ inputValue: inputValue,
24880
+ setInputValue: setInputValue,
24881
+ onSend: onSend,
24882
+ isDark: isDark,
24883
+ primaryColor: primaryColor,
24884
+ isOpen: isOpen,
24885
+ isMinimized: isMinimized,
24886
+ isLoading: isLoading,
24887
+ isConversationLoading: isConversationLoading,
24888
+ verificationPending: verificationPendingKeys.size > 0,
24889
+ placeholder: placeholder,
24890
+ textColor: resolvedTextColor,
24891
+ fontFamily: fontFamily,
24892
+ userMessageBubbleFontFamily: userMessageBubbleFontFamily,
24893
+ userMessageBubbleFontSize: userMessageBubbleFontSize,
24894
+ fontSize: fontSize,
24895
+ isRtl: isRtlLanguage,
24896
+ csatVisible: showCsat && csatEnabled && !csatSubmitted || isCsatEnabled && (showResolveForm || isConversationResolved),
24897
+ enableVoiceInteraction: enableVoiceInteraction,
24898
+ isVoiceSessionActive: isVoiceSessionActive,
24899
+ voiceStatus: voiceStatus,
24900
+ voiceError: voiceError,
24901
+ onVoiceToggle: onVoiceToggle,
24902
+ onBidiSubmit: onBidiSubmit,
24903
+ disclaimerEnabled: disclaimerEnabled,
24904
+ disclaimerText: disclaimerText,
24905
+ disclaimerPosition: disclaimerPosition,
24906
+ disclaimerLinkUrl: disclaimerLinkUrl,
24907
+ disclaimerLinkLabel: disclaimerLinkLabel,
24908
+ showPoweredBy: showPoweredBy,
24909
+ defaultLanguage: defaultLanguage,
24910
+ onboardingQuestions: onboardingQuestions,
24911
+ onboardingActive: onboardingActive,
24912
+ onboardingCompleted: onboardingCompleted,
24913
+ onboardingEnabled: onboardingEnabled,
24914
+ userMessageBoxColor: userMessageBoxColor,
24915
+ resolvedUserMessageColor: resolvedUserMessageColor,
24916
+ userTextColor: userTextColor,
24917
+ promptSuggestions: showResolveForm || isConversationResolved || autoPromptEnabled === false || isLoading ? [] : stablePromptSuggestions,
24918
+ onPromptSuggestionClick: stableOnPromptSuggestionClick,
24919
+ autoPromptQuestionDisplay: autoPromptQuestionDisplay,
24920
+ tagSelectorNode: null,
24921
+ showResolveButton: isCsatEnabled && hasUserMessages && !isConversationResolved && !showResolveForm && !showCsat && !shouldHideResolveForOnboarding,
24922
+ onResolve: () => {
24923
+ if (!isCsatEnabled) return;
24924
+ setShowResolveForm(true);
24925
+ }
24926
+ // Attachments (RAG-attach-1) - paperclip stays hidden
24927
+ // unless the operator explicitly opted in via
24928
+ // MasterAgent.config.chatFeatures.
24929
+ ,
24930
+ chatFeatures: chatFeatures,
24931
+ apiEndpoint: apiBaseUrl,
24932
+ organizationId: organizationId,
24933
+ conversationId: conversationId
24934
+ })
23642
24935
  })]
23643
24936
  })]
23644
24937
  })]
@@ -23961,7 +25254,7 @@
23961
25254
  * value by its own test (that constant sat at 0.1.113 while this package was
23962
25255
  * at 0.2.2 precisely because nothing enforced it - EV-2431).
23963
25256
  */
23964
- const WIDGET_VERSION = '0.2.47';
25257
+ const WIDGET_VERSION = '0.2.49';
23965
25258
 
23966
25259
  /**
23967
25260
  * API utility functions
@@ -24370,6 +25663,10 @@
24370
25663
  voiceConclusionForCsat,
24371
25664
  handleVoiceToggle,
24372
25665
  sendBidiTextMessage,
25666
+ bidiMessages,
25667
+ isVoicePaused,
25668
+ toggleVoicePause,
25669
+ voiceLevelSource,
24373
25670
  onboardingActive,
24374
25671
  onboardingCompleted,
24375
25672
  handleOnboardingFormSubmit,
@@ -24587,6 +25884,11 @@
24587
25884
  voiceConclusionForCsat: voiceConclusionForCsat,
24588
25885
  onVoiceToggle: handleVoiceToggle,
24589
25886
  onBidiSubmit: () => sendBidiTextMessage(inputValue),
25887
+ bidiMessages: bidiMessages,
25888
+ isVoicePaused: isVoicePaused,
25889
+ onToggleVoicePause: toggleVoicePause,
25890
+ voiceLevelSource: voiceLevelSource,
25891
+ onBidiTextMessage: sendBidiTextMessage,
24590
25892
  disclaimerEnabled: widgetConfig.disclaimerEnabled,
24591
25893
  disclaimerText: widgetConfig.disclaimerText,
24592
25894
  disclaimerPosition: widgetConfig.disclaimerPosition,