@eshal-bot/chat-widget 0.2.27 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-widget-MarkdownRenderer-DsgAO1cT.esm.js → chat-widget-MarkdownRenderer-DIuz0Tg3.esm.js} +6 -6
- package/dist/chat-widget-index-BDWmiQ3W.esm.js +20 -0
- package/dist/chat-widget-markdown-chunk.js +631 -330
- package/dist/chat-widget-markdown-chunk.min.js +9 -9
- package/dist/chat-widget.esm.js +1 -1
- package/dist/chat-widget.js +1183 -253
- package/dist/chat-widget.min.js +6 -6
- package/dist/chat-widget.umd.js +8 -8
- package/package.json +3 -2
- package/dist/chat-widget-index-DjOa8SJO.esm.js +0 -20
package/dist/chat-widget.js
CHANGED
|
@@ -7803,7 +7803,7 @@
|
|
|
7803
7803
|
m$1.hydrateRoot;
|
|
7804
7804
|
}
|
|
7805
7805
|
|
|
7806
|
-
var css_248z$1 = "*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.chat-widget-root{--cw-primary:#1d4ed8;--cw-primary-hover:#1e40af;--cw-status-success:160 84% 39%;--cw-status-success-bg:152 81% 96%;--cw-status-warning:35 100% 50%;--cw-status-warning-bg:34 100% 95%;--cw-status-error:350 89% 60%;--cw-status-error-bg:356 100% 97%;--cw-status-info:199 89% 48%;--cw-status-info-bg:204 100% 97%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chat-widget-root.dark{--cw-status-success:158 64% 52%;--cw-status-success-bg:152 36% 14%;--cw-status-warning:38 92% 60%;--cw-status-warning-bg:36 33% 14%;--cw-status-error:350 89% 65%;--cw-status-error-bg:356 33% 16%;--cw-status-info:199 89% 58%;--cw-status-info-bg:204 33% 14%}.\\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}#chat-widget-root .chat-widget-root *{box-sizing:border-box;margin:0;padding:0}#chat-widget-root .chat-messages::-webkit-scrollbar{width:6px}#chat-widget-root .chat-messages::-webkit-scrollbar-track{background:transparent}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb{background:rgba(156,163,175,.5);border-radius:10px}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(156,163,175,.7)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb{background:rgba(75,85,99,.5)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(75,85,99,.7)}#chat-widget-root .sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}#chat-widget-root .pointer-events-none{pointer-events:none}#chat-widget-root .visible{visibility:visible}#chat-widget-root .invisible{visibility:hidden}#chat-widget-root .collapse{visibility:collapse}#chat-widget-root .static{position:static}#chat-widget-root .fixed{position:fixed}#chat-widget-root .absolute{position:absolute}#chat-widget-root .relative{position:relative}#chat-widget-root .sticky{position:sticky}#chat-widget-root .inset-0{inset:0}#chat-widget-root .-top-8{top:-2rem}#chat-widget-root .bottom-0{bottom:0}#chat-widget-root .bottom-5{bottom:1.25rem}#chat-widget-root .bottom-full{bottom:100%}#chat-widget-root .left-0{left:0}#chat-widget-root .left-1\\/2{left:50%}#chat-widget-root .left-5{left:1.25rem}#chat-widget-root .right-0{right:0}#chat-widget-root .right-5{right:1.25rem}#chat-widget-root .top-0{top:0}#chat-widget-root .top-1\\/2{top:50%}#chat-widget-root .top-5{top:1.25rem}#chat-widget-root .top-full{top:100%}#chat-widget-root .isolate{isolation:isolate}#chat-widget-root .z-10{z-index:10}#chat-widget-root .z-50{z-index:50}#chat-widget-root .z-\\[60\\]{z-index:60}#chat-widget-root .z-\\[70\\]{z-index:70}#chat-widget-root .z-\\[71\\]{z-index:71}#chat-widget-root .z-\\[999999\\]{z-index:999999}#chat-widget-root .z-\\[9999\\]{z-index:9999}#chat-widget-root .m-0{margin:0}#chat-widget-root .mx-2{margin-left:.5rem;margin-right:.5rem}#chat-widget-root .mx-3{margin-left:.75rem;margin-right:.75rem}#chat-widget-root .my-3{margin-bottom:.75rem;margin-top:.75rem}#chat-widget-root .my-4{margin-bottom:1rem;margin-top:1rem}#chat-widget-root .-mb-px{margin-bottom:-1px}#chat-widget-root .mb-1{margin-bottom:.25rem}#chat-widget-root .mb-1\\.5{margin-bottom:.375rem}#chat-widget-root .mb-2{margin-bottom:.5rem}#chat-widget-root .mb-3{margin-bottom:.75rem}#chat-widget-root .mb-4{margin-bottom:1rem}#chat-widget-root .mb-5{margin-bottom:1.25rem}#chat-widget-root .ml-1{margin-left:.25rem}#chat-widget-root .ms-0\\.5{margin-inline-start:.125rem}#chat-widget-root .mt-0\\.5{margin-top:.125rem}#chat-widget-root .mt-1{margin-top:.25rem}#chat-widget-root .mt-1\\.5{margin-top:.375rem}#chat-widget-root .mt-2{margin-top:.5rem}#chat-widget-root .mt-3{margin-top:.75rem}#chat-widget-root .mt-4{margin-top:1rem}#chat-widget-root .block{display:block}#chat-widget-root .inline-block{display:inline-block}#chat-widget-root .inline{display:inline}#chat-widget-root .flex{display:flex}#chat-widget-root .inline-flex{display:inline-flex}#chat-widget-root .table{display:table}#chat-widget-root .grid{display:grid}#chat-widget-root .hidden{display:none}#chat-widget-root .h-1\\.5{height:.375rem}#chat-widget-root .h-10{height:2.5rem}#chat-widget-root .h-11{height:2.75rem}#chat-widget-root .h-12{height:3rem}#chat-widget-root .h-16{height:4rem}#chat-widget-root .h-2{height:.5rem}#chat-widget-root .h-3{height:.75rem}#chat-widget-root .h-3\\.5{height:.875rem}#chat-widget-root .h-4{height:1rem}#chat-widget-root .h-5{height:1.25rem}#chat-widget-root .h-6{height:1.5rem}#chat-widget-root .h-7{height:1.75rem}#chat-widget-root .h-8{height:2rem}#chat-widget-root .h-\\[650px\\]{height:650px}#chat-widget-root .h-auto{height:auto}#chat-widget-root .h-full{height:100%}#chat-widget-root .h-px{height:1px}#chat-widget-root .max-h-\\[85vh\\]{max-height:85vh}#chat-widget-root .min-h-0{min-height:0}#chat-widget-root .min-h-\\[48px\\]{min-height:48px}#chat-widget-root .w-1\\.5{width:.375rem}#chat-widget-root .w-10{width:2.5rem}#chat-widget-root .w-11{width:2.75rem}#chat-widget-root .w-12{width:3rem}#chat-widget-root .w-16{width:4rem}#chat-widget-root .w-2{width:.5rem}#chat-widget-root .w-3{width:.75rem}#chat-widget-root .w-3\\.5{width:.875rem}#chat-widget-root .w-4{width:1rem}#chat-widget-root .w-44{width:11rem}#chat-widget-root .w-5{width:1.25rem}#chat-widget-root .w-6{width:1.5rem}#chat-widget-root .w-7{width:1.75rem}#chat-widget-root .w-8{width:2rem}#chat-widget-root .w-80{width:20rem}#chat-widget-root .w-96{width:24rem}#chat-widget-root .w-\\[380px\\]{width:380px}#chat-widget-root .w-full{width:100%}#chat-widget-root .min-w-0{min-width:0}#chat-widget-root .min-w-\\[60px\\]{min-width:60px}#chat-widget-root .min-w-full{min-width:100%}#chat-widget-root .max-w-\\[75\\%\\]{max-width:75%}#chat-widget-root .max-w-\\[92vw\\]{max-width:92vw}#chat-widget-root .max-w-full{max-width:100%}#chat-widget-root .max-w-none{max-width:none}#chat-widget-root .max-w-sm{max-width:24rem}#chat-widget-root .max-w-xs{max-width:20rem}#chat-widget-root .flex-1{flex:1 1 0%}#chat-widget-root .flex-shrink-0,#chat-widget-root .shrink-0{flex-shrink:0}#chat-widget-root .grow{flex-grow:1}#chat-widget-root .border-collapse{border-collapse:collapse}#chat-widget-root .-translate-x-1\\/2{--tw-translate-x:-50%}#chat-widget-root .-translate-x-1\\/2,#chat-widget-root .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .-translate-y-1\\/2{--tw-translate-y:-50%}#chat-widget-root .-rotate-90{--tw-rotate:-90deg}#chat-widget-root .-rotate-90,#chat-widget-root .rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .rotate-180{--tw-rotate:180deg}#chat-widget-root .rotate-90{--tw-rotate:90deg}#chat-widget-root .rotate-90,#chat-widget-root .scale-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-0{--tw-scale-x:0;--tw-scale-y:0}#chat-widget-root .scale-100{--tw-scale-x:1;--tw-scale-y:1}#chat-widget-root .scale-100,#chat-widget-root .scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}#chat-widget-root .scale-125,#chat-widget-root .scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-95{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}#chat-widget-root .animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}#chat-widget-root .animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}#chat-widget-root .animate-spin{animation:spin 1s linear infinite}#chat-widget-root .cursor-ew-resize{cursor:ew-resize}#chat-widget-root .cursor-nesw-resize{cursor:nesw-resize}#chat-widget-root .cursor-not-allowed{cursor:not-allowed}#chat-widget-root .cursor-ns-resize{cursor:ns-resize}#chat-widget-root .cursor-nwse-resize{cursor:nwse-resize}#chat-widget-root .cursor-pointer{cursor:pointer}#chat-widget-root .resize-none{resize:none}#chat-widget-root .resize{resize:both}#chat-widget-root .list-decimal{list-style-type:decimal}#chat-widget-root .list-disc{list-style-type:disc}#chat-widget-root .list-none{list-style-type:none}#chat-widget-root .flex-row{flex-direction:row}#chat-widget-root .flex-row-reverse{flex-direction:row-reverse}#chat-widget-root .flex-col{flex-direction:column}#chat-widget-root .flex-wrap{flex-wrap:wrap}#chat-widget-root .items-start{align-items:flex-start}#chat-widget-root .items-end{align-items:flex-end}#chat-widget-root .items-center{align-items:center}#chat-widget-root .justify-start{justify-content:flex-start}#chat-widget-root .justify-end{justify-content:flex-end}#chat-widget-root .justify-center{justify-content:center}#chat-widget-root .justify-between{justify-content:space-between}#chat-widget-root .gap-0{gap:0}#chat-widget-root .gap-0\\.5{gap:.125rem}#chat-widget-root .gap-1{gap:.25rem}#chat-widget-root .gap-1\\.5{gap:.375rem}#chat-widget-root .gap-2{gap:.5rem}#chat-widget-root .gap-2\\.5{gap:.625rem}#chat-widget-root .gap-3{gap:.75rem}#chat-widget-root .gap-4{gap:1rem}#chat-widget-root .gap-6{gap:1.5rem}#chat-widget-root :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root .overflow-hidden{overflow:hidden}#chat-widget-root .overflow-visible{overflow:visible}#chat-widget-root .overflow-x-auto{overflow-x:auto}#chat-widget-root .overflow-y-auto{overflow-y:auto}#chat-widget-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#chat-widget-root .whitespace-nowrap{white-space:nowrap}#chat-widget-root .whitespace-pre-wrap{white-space:pre-wrap}#chat-widget-root .break-words{overflow-wrap:break-word}#chat-widget-root .break-all{word-break:break-all}#chat-widget-root .rounded{border-radius:.25rem}#chat-widget-root .rounded-2xl{border-radius:1rem}#chat-widget-root .rounded-3xl{border-radius:1.5rem}#chat-widget-root .rounded-full{border-radius:9999px}#chat-widget-root .rounded-lg{border-radius:.5rem}#chat-widget-root .rounded-md{border-radius:.375rem}#chat-widget-root .rounded-xl{border-radius:.75rem}#chat-widget-root .rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}#chat-widget-root .rounded-tl-sm{border-top-left-radius:.125rem}#chat-widget-root .rounded-tr-sm{border-top-right-radius:.125rem}#chat-widget-root .border{border-width:1px}#chat-widget-root .border-0{border-width:0}#chat-widget-root .border-b{border-bottom-width:1px}#chat-widget-root .border-l-4{border-left-width:4px}#chat-widget-root .border-t{border-top-width:1px}#chat-widget-root .border-t-2{border-top-width:2px}#chat-widget-root .border-dotted{border-style:dotted}#chat-widget-root .border-none{border-style:none}#chat-widget-root .\\!border-status-error{border-color:hsl(var(--cw-status-error))!important}#chat-widget-root .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}#chat-widget-root .border-amber-700\\/50{border-color:rgba(180,83,9,.5)}#chat-widget-root .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}#chat-widget-root .border-blue-700\\/50{border-color:rgba(29,78,216,.5)}#chat-widget-root .border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200\\/60{border-color:rgba(229,231,235,.6)}#chat-widget-root .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700\\/50{border-color:rgba(55,65,81,.5)}#chat-widget-root .border-transparent{border-color:transparent}#chat-widget-root .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}#chat-widget-root .bg-amber-900\\/40{background-color:rgba(120,53,15,.4)}#chat-widget-root .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}#chat-widget-root .bg-current{background-color:currentColor}#chat-widget-root .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-50\\/30{background-color:rgba(249,250,251,.3)}#chat-widget-root .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700\\/50{background-color:rgba(55,65,81,.5)}#chat-widget-root .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}#chat-widget-root .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}#chat-widget-root .bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity,1))}#chat-widget-root .bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}#chat-widget-root .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}#chat-widget-root .bg-slate-50\\/50{background-color:rgba(248,250,252,.5)}#chat-widget-root .bg-slate-800\\/50{background-color:rgba(30,41,59,.5)}#chat-widget-root .bg-transparent{background-color:transparent}#chat-widget-root .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-white\\/10{background-color:hsla(0,0%,100%,.1)}#chat-widget-root .bg-white\\/20{background-color:hsla(0,0%,100%,.2)}#chat-widget-root .bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}#chat-widget-root .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}#chat-widget-root .from-gray-50\\/50{--tw-gradient-from:rgba(249,250,251,.5) var(--tw-gradient-from-position);--tw-gradient-to:rgba(249,250,251,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/0{--tw-gradient-from:hsla(0,0%,100%,0) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/10{--tw-gradient-from:hsla(0,0%,100%,.1) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-yellow-200{--tw-gradient-from:#fef08a var(--tw-gradient-from-position);--tw-gradient-to:hsla(53,98%,77%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .via-white\\/5{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.05) var(--tw-gradient-via-position),var(--tw-gradient-to)}#chat-widget-root .to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}#chat-widget-root .to-white\\/10{--tw-gradient-to:hsla(0,0%,100%,.1) var(--tw-gradient-to-position)}#chat-widget-root .to-yellow-400{--tw-gradient-to:#facc15 var(--tw-gradient-to-position)}#chat-widget-root .object-contain{-o-object-fit:contain;object-fit:contain}#chat-widget-root .p-0{padding:0}#chat-widget-root .p-0\\.5{padding:.125rem}#chat-widget-root .p-3{padding:.75rem}#chat-widget-root .p-5{padding:1.25rem}#chat-widget-root .p-6{padding:1.5rem}#chat-widget-root .p-8{padding:2rem}#chat-widget-root .px-1{padding-left:.25rem;padding-right:.25rem}#chat-widget-root .px-2{padding-left:.5rem;padding-right:.5rem}#chat-widget-root .px-2\\.5{padding-left:.625rem;padding-right:.625rem}#chat-widget-root .px-3{padding-left:.75rem;padding-right:.75rem}#chat-widget-root .px-4{padding-left:1rem;padding-right:1rem}#chat-widget-root .px-5{padding-left:1.25rem;padding-right:1.25rem}#chat-widget-root .py-1{padding-bottom:.25rem;padding-top:.25rem}#chat-widget-root .py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}#chat-widget-root .py-12{padding-bottom:3rem;padding-top:3rem}#chat-widget-root .py-2{padding-bottom:.5rem;padding-top:.5rem}#chat-widget-root .py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}#chat-widget-root .py-3{padding-bottom:.75rem;padding-top:.75rem}#chat-widget-root .py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}#chat-widget-root .py-4{padding-bottom:1rem;padding-top:1rem}#chat-widget-root .pb-1{padding-bottom:.25rem}#chat-widget-root .pb-2{padding-bottom:.5rem}#chat-widget-root .pl-1{padding-left:.25rem}#chat-widget-root .pl-2{padding-left:.5rem}#chat-widget-root .pl-4{padding-left:1rem}#chat-widget-root .pl-\\[50px\\]{padding-left:50px}#chat-widget-root .pr-1{padding-right:.25rem}#chat-widget-root .pt-1{padding-top:.25rem}#chat-widget-root .text-left{text-align:left}#chat-widget-root .text-center{text-align:center}#chat-widget-root .text-right{text-align:right}#chat-widget-root .text-start{text-align:start}#chat-widget-root .align-text-bottom{vertical-align:text-bottom}#chat-widget-root .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}#chat-widget-root .text-2xl{font-size:1.5rem;line-height:2rem}#chat-widget-root .text-\\[10px\\]{font-size:10px}#chat-widget-root .text-base{font-size:1rem;line-height:1.5rem}#chat-widget-root .text-chip{font-size:11px;letter-spacing:0;line-height:1.4}#chat-widget-root .text-h4{font-size:18px;letter-spacing:0;line-height:1.3}#chat-widget-root .text-lg{font-size:1.125rem;line-height:1.75rem}#chat-widget-root .text-sm{font-size:.875rem;line-height:1.25rem}#chat-widget-root .text-xl{font-size:1.25rem;line-height:1.75rem}#chat-widget-root .text-xs{font-size:.75rem;line-height:1rem}#chat-widget-root .font-bold{font-weight:700}#chat-widget-root .font-medium{font-weight:500}#chat-widget-root .font-semibold{font-weight:600}#chat-widget-root .uppercase{text-transform:uppercase}#chat-widget-root .lowercase{text-transform:lowercase}#chat-widget-root .italic{font-style:italic}#chat-widget-root .tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}#chat-widget-root .leading-5{line-height:1.25rem}#chat-widget-root .leading-none{line-height:1}#chat-widget-root .leading-normal{line-height:1.5}#chat-widget-root .leading-relaxed{line-height:1.625}#chat-widget-root .leading-snug{line-height:1.375}#chat-widget-root .tracking-wide{letter-spacing:.025em}#chat-widget-root .text-\\[\\#4A5568\\]{--tw-text-opacity:1;color:rgb(74 85 104/var(--tw-text-opacity,1))}#chat-widget-root .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}#chat-widget-root .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}#chat-widget-root .text-current{color:currentColor}#chat-widget-root .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500\\/80{color:hsla(220,9%,46%,.8)}#chat-widget-root .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}#chat-widget-root .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}#chat-widget-root .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}#chat-widget-root .text-status-error{color:hsl(var(--cw-status-error))}#chat-widget-root .text-status-success{color:hsl(var(--cw-status-success))}#chat-widget-root .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}#chat-widget-root .text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}#chat-widget-root .underline{text-decoration-line:underline}#chat-widget-root .no-underline{text-decoration-line:none}#chat-widget-root .placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .opacity-0{opacity:0}#chat-widget-root .opacity-50{opacity:.5}#chat-widget-root .opacity-60{opacity:.6}#chat-widget-root .opacity-70{opacity:.7}#chat-widget-root .opacity-75{opacity:.75}#chat-widget-root .opacity-80{opacity:.8}#chat-widget-root .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}#chat-widget-root .shadow,#chat-widget-root .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}#chat-widget-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}#chat-widget-root .shadow-lg,#chat-widget-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}#chat-widget-root .shadow-sm,#chat-widget-root .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}#chat-widget-root .shadow-black\\/20{--tw-shadow-color:rgba(0,0,0,.2);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .shadow-gray-200\\/80{--tw-shadow-color:rgba(229,231,235,.8);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .outline-none{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .outline{outline-style:solid}#chat-widget-root .ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .ring,#chat-widget-root .ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity,1))}#chat-widget-root .ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}#chat-widget-root .ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}#chat-widget-root .blur{--tw-blur:blur(8px)}#chat-widget-root .blur,#chat-widget-root .drop-shadow{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md,#chat-widget-root .drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}#chat-widget-root .grayscale-\\[0\\.3\\]{--tw-grayscale:grayscale(0.3)}#chat-widget-root .filter,#chat-widget-root .grayscale-\\[0\\.3\\]{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}#chat-widget-root .transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .duration-150{transition-duration:.15s}#chat-widget-root .duration-200{transition-duration:.2s}#chat-widget-root .duration-300{transition-duration:.3s}#chat-widget-root .duration-500{transition-duration:.5s}#chat-widget-root :is(#chat-widget-root .animate-in){animation:slideIn .3s ease-out}#chat-widget-root :is(#chat-widget-root .transition-all){transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .\\[font-family\\:inherit\\]{font-family:inherit}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}#chat-widget-root .hover\\:scale-105:hover,#chat-widget-root .hover\\:scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-blue-500\\/20:hover{background-color:rgba(59,130,246,.2)}#chat-widget-root .hover\\:bg-blue-900\\/50:hover{background-color:rgba(30,58,138,.5)}#chat-widget-root .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-transparent:hover{background-color:transparent}#chat-widget-root .hover\\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:underline:hover{text-decoration-line:underline}#chat-widget-root .hover\\:opacity-80:hover{opacity:.8}#chat-widget-root .hover\\:opacity-90:hover{opacity:.9}#chat-widget-root .hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .hover\\:shadow-md:hover,#chat-widget-root .hover\\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}#chat-widget-root .hover\\:grayscale-0:hover{--tw-grayscale:grayscale(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .focus\\:\\!border-status-error:focus{border-color:hsl(var(--cw-status-error))!important}#chat-widget-root .focus\\:border-\\[\\#5A6069\\]:focus{--tw-border-opacity:1;border-color:rgb(90 96 105/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:border-\\[\\#B0B0B0\\]:focus{--tw-border-opacity:1;border-color:rgb(176 176 176/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}#chat-widget-root .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus\\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-0:focus,#chat-widget-root .focus\\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus\\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}#chat-widget-root .focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}#chat-widget-root .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color:hsla(0,0%,100%,.4)}#chat-widget-root .active\\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .active\\:scale-95:active,#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{--tw-scale-x:0.97;--tw-scale-y:0.97}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active,#chat-widget-root .active\\:scale-\\[0\\.99\\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:scale-\\[0\\.99\\]:active{--tw-scale-x:0.99;--tw-scale-y:0.99}#chat-widget-root .active\\:outline-none:active{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .active\\:ring-0:active{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}#chat-widget-root .disabled\\:opacity-40:disabled{opacity:.4}#chat-widget-root .disabled\\:opacity-50:disabled{opacity:.5}#chat-widget-root .disabled\\:shadow-none:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root :is(.group:hover .group-hover\\:scale-100){--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root :is(.group:hover .group-hover\\:opacity-100){opacity:1}#chat-widget-root .dark\\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .dark\\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}@media (min-width:768px){#chat-widget-root .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}#chat-widget-root .rtl\\:rounded-tl-2xl:where([dir=rtl],[dir=rtl] *){border-top-left-radius:1rem}#chat-widget-root .rtl\\:rounded-tr-sm:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.125rem}#chat-widget-root .\\[\\&\\:first-child\\]\\:\\!mt-0:first-child{margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:first-child\\]\\:\\!mt-0>:first-child){margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:last-child\\]\\:\\!mb-0>:last-child){margin-bottom:0!important}";
|
|
7806
|
+
var css_248z$1 = "*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.chat-widget-root{--cw-primary:#1d4ed8;--cw-primary-hover:#1e40af;--cw-status-success:160 84% 39%;--cw-status-success-bg:152 81% 96%;--cw-status-warning:35 100% 50%;--cw-status-warning-bg:34 100% 95%;--cw-status-error:350 89% 60%;--cw-status-error-bg:356 100% 97%;--cw-status-info:199 89% 48%;--cw-status-info-bg:204 100% 97%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chat-widget-root.dark{--cw-status-success:158 64% 52%;--cw-status-success-bg:152 36% 14%;--cw-status-warning:38 92% 60%;--cw-status-warning-bg:36 33% 14%;--cw-status-error:350 89% 65%;--cw-status-error-bg:356 33% 16%;--cw-status-info:199 89% 58%;--cw-status-info-bg:204 33% 14%}.\\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\\!container{max-width:1536px!important}.container{max-width:1536px}}#chat-widget-root .chat-widget-root *{box-sizing:border-box;margin:0;padding:0}#chat-widget-root .chat-messages::-webkit-scrollbar{width:6px}#chat-widget-root .chat-messages::-webkit-scrollbar-track{background:transparent}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb{background:rgba(156,163,175,.5);border-radius:10px}#chat-widget-root .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(156,163,175,.7)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb{background:rgba(75,85,99,.5)}#chat-widget-root .dark .chat-messages::-webkit-scrollbar-thumb:hover{background:rgba(75,85,99,.7)}#chat-widget-root .sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}#chat-widget-root .pointer-events-none{pointer-events:none}#chat-widget-root .visible{visibility:visible}#chat-widget-root .invisible{visibility:hidden}#chat-widget-root .collapse{visibility:collapse}#chat-widget-root .static{position:static}#chat-widget-root .fixed{position:fixed}#chat-widget-root .absolute{position:absolute}#chat-widget-root .relative{position:relative}#chat-widget-root .sticky{position:sticky}#chat-widget-root .inset-0{inset:0}#chat-widget-root .-top-8{top:-2rem}#chat-widget-root .bottom-0{bottom:0}#chat-widget-root .bottom-5{bottom:1.25rem}#chat-widget-root .bottom-full{bottom:100%}#chat-widget-root .left-0{left:0}#chat-widget-root .left-1\\/2{left:50%}#chat-widget-root .left-5{left:1.25rem}#chat-widget-root .right-0{right:0}#chat-widget-root .right-5{right:1.25rem}#chat-widget-root .top-0{top:0}#chat-widget-root .top-1\\/2{top:50%}#chat-widget-root .top-5{top:1.25rem}#chat-widget-root .top-full{top:100%}#chat-widget-root .isolate{isolation:isolate}#chat-widget-root .z-10{z-index:10}#chat-widget-root .z-50{z-index:50}#chat-widget-root .z-\\[60\\]{z-index:60}#chat-widget-root .z-\\[70\\]{z-index:70}#chat-widget-root .z-\\[71\\]{z-index:71}#chat-widget-root .z-\\[999999\\]{z-index:999999}#chat-widget-root .z-\\[9999\\]{z-index:9999}#chat-widget-root .m-0{margin:0}#chat-widget-root .mx-2{margin-left:.5rem;margin-right:.5rem}#chat-widget-root .mx-3{margin-left:.75rem;margin-right:.75rem}#chat-widget-root .my-3{margin-bottom:.75rem;margin-top:.75rem}#chat-widget-root .my-4{margin-bottom:1rem;margin-top:1rem}#chat-widget-root .-mb-px{margin-bottom:-1px}#chat-widget-root .mb-1{margin-bottom:.25rem}#chat-widget-root .mb-1\\.5{margin-bottom:.375rem}#chat-widget-root .mb-2{margin-bottom:.5rem}#chat-widget-root .mb-3{margin-bottom:.75rem}#chat-widget-root .mb-4{margin-bottom:1rem}#chat-widget-root .mb-5{margin-bottom:1.25rem}#chat-widget-root .ml-1{margin-left:.25rem}#chat-widget-root .ms-0\\.5{margin-inline-start:.125rem}#chat-widget-root .mt-0\\.5{margin-top:.125rem}#chat-widget-root .mt-1{margin-top:.25rem}#chat-widget-root .mt-1\\.5{margin-top:.375rem}#chat-widget-root .mt-2{margin-top:.5rem}#chat-widget-root .mt-3{margin-top:.75rem}#chat-widget-root .mt-4{margin-top:1rem}#chat-widget-root .block{display:block}#chat-widget-root .inline-block{display:inline-block}#chat-widget-root .inline{display:inline}#chat-widget-root .flex{display:flex}#chat-widget-root .inline-flex{display:inline-flex}#chat-widget-root .table{display:table}#chat-widget-root .grid{display:grid}#chat-widget-root .hidden{display:none}#chat-widget-root .h-1\\.5{height:.375rem}#chat-widget-root .h-10{height:2.5rem}#chat-widget-root .h-11{height:2.75rem}#chat-widget-root .h-12{height:3rem}#chat-widget-root .h-16{height:4rem}#chat-widget-root .h-2{height:.5rem}#chat-widget-root .h-3{height:.75rem}#chat-widget-root .h-3\\.5{height:.875rem}#chat-widget-root .h-4{height:1rem}#chat-widget-root .h-5{height:1.25rem}#chat-widget-root .h-6{height:1.5rem}#chat-widget-root .h-7{height:1.75rem}#chat-widget-root .h-8{height:2rem}#chat-widget-root .h-\\[650px\\]{height:650px}#chat-widget-root .h-auto{height:auto}#chat-widget-root .h-full{height:100%}#chat-widget-root .h-px{height:1px}#chat-widget-root .max-h-\\[85vh\\]{max-height:85vh}#chat-widget-root .min-h-0{min-height:0}#chat-widget-root .min-h-\\[48px\\]{min-height:48px}#chat-widget-root .w-1\\.5{width:.375rem}#chat-widget-root .w-10{width:2.5rem}#chat-widget-root .w-11{width:2.75rem}#chat-widget-root .w-12{width:3rem}#chat-widget-root .w-16{width:4rem}#chat-widget-root .w-2{width:.5rem}#chat-widget-root .w-3{width:.75rem}#chat-widget-root .w-3\\.5{width:.875rem}#chat-widget-root .w-4{width:1rem}#chat-widget-root .w-44{width:11rem}#chat-widget-root .w-5{width:1.25rem}#chat-widget-root .w-6{width:1.5rem}#chat-widget-root .w-7{width:1.75rem}#chat-widget-root .w-8{width:2rem}#chat-widget-root .w-80{width:20rem}#chat-widget-root .w-96{width:24rem}#chat-widget-root .w-\\[380px\\]{width:380px}#chat-widget-root .w-full{width:100%}#chat-widget-root .min-w-0{min-width:0}#chat-widget-root .min-w-\\[60px\\]{min-width:60px}#chat-widget-root .min-w-full{min-width:100%}#chat-widget-root .max-w-\\[75\\%\\]{max-width:75%}#chat-widget-root .max-w-\\[92vw\\]{max-width:92vw}#chat-widget-root .max-w-full{max-width:100%}#chat-widget-root .max-w-none{max-width:none}#chat-widget-root .max-w-sm{max-width:24rem}#chat-widget-root .max-w-xs{max-width:20rem}#chat-widget-root .flex-1{flex:1 1 0%}#chat-widget-root .flex-shrink-0,#chat-widget-root .shrink-0{flex-shrink:0}#chat-widget-root .grow{flex-grow:1}#chat-widget-root .border-collapse{border-collapse:collapse}#chat-widget-root .-translate-x-1\\/2{--tw-translate-x:-50%}#chat-widget-root .-translate-x-1\\/2,#chat-widget-root .-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .-translate-y-1\\/2{--tw-translate-y:-50%}#chat-widget-root .-rotate-90{--tw-rotate:-90deg}#chat-widget-root .-rotate-90,#chat-widget-root .rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .rotate-180{--tw-rotate:180deg}#chat-widget-root .rotate-90{--tw-rotate:90deg}#chat-widget-root .rotate-90,#chat-widget-root .scale-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-0{--tw-scale-x:0;--tw-scale-y:0}#chat-widget-root .scale-100{--tw-scale-x:1;--tw-scale-y:1}#chat-widget-root .scale-100,#chat-widget-root .scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}#chat-widget-root .scale-125,#chat-widget-root .scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .scale-95{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}#chat-widget-root .animate-bounce{animation:bounce 1s infinite}@keyframes pulse{50%{opacity:.5}}#chat-widget-root .animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}#chat-widget-root .animate-spin{animation:spin 1s linear infinite}#chat-widget-root .cursor-ew-resize{cursor:ew-resize}#chat-widget-root .cursor-nesw-resize{cursor:nesw-resize}#chat-widget-root .cursor-not-allowed{cursor:not-allowed}#chat-widget-root .cursor-ns-resize{cursor:ns-resize}#chat-widget-root .cursor-nwse-resize{cursor:nwse-resize}#chat-widget-root .cursor-pointer{cursor:pointer}#chat-widget-root .resize-none{resize:none}#chat-widget-root .resize{resize:both}#chat-widget-root .list-decimal{list-style-type:decimal}#chat-widget-root .list-disc{list-style-type:disc}#chat-widget-root .list-none{list-style-type:none}#chat-widget-root .flex-row{flex-direction:row}#chat-widget-root .flex-row-reverse{flex-direction:row-reverse}#chat-widget-root .flex-col{flex-direction:column}#chat-widget-root .flex-wrap{flex-wrap:wrap}#chat-widget-root .items-start{align-items:flex-start}#chat-widget-root .items-end{align-items:flex-end}#chat-widget-root .items-center{align-items:center}#chat-widget-root .justify-start{justify-content:flex-start}#chat-widget-root .justify-end{justify-content:flex-end}#chat-widget-root .justify-center{justify-content:center}#chat-widget-root .justify-between{justify-content:space-between}#chat-widget-root .gap-0{gap:0}#chat-widget-root .gap-0\\.5{gap:.125rem}#chat-widget-root .gap-1{gap:.25rem}#chat-widget-root .gap-1\\.5{gap:.375rem}#chat-widget-root .gap-2{gap:.5rem}#chat-widget-root .gap-2\\.5{gap:.625rem}#chat-widget-root .gap-3{gap:.75rem}#chat-widget-root .gap-4{gap:1rem}#chat-widget-root .gap-6{gap:1.5rem}#chat-widget-root :is(.space-y-2>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root :is(.space-y-4>:not([hidden])~:not([hidden])){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}#chat-widget-root .overflow-hidden{overflow:hidden}#chat-widget-root .overflow-visible{overflow:visible}#chat-widget-root .overflow-x-auto{overflow-x:auto}#chat-widget-root .overflow-y-auto{overflow-y:auto}#chat-widget-root .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#chat-widget-root .whitespace-nowrap{white-space:nowrap}#chat-widget-root .whitespace-pre-wrap{white-space:pre-wrap}#chat-widget-root .break-words{overflow-wrap:break-word}#chat-widget-root .break-all{word-break:break-all}#chat-widget-root .rounded{border-radius:.25rem}#chat-widget-root .rounded-2xl{border-radius:1rem}#chat-widget-root .rounded-3xl{border-radius:1.5rem}#chat-widget-root .rounded-full{border-radius:9999px}#chat-widget-root .rounded-lg{border-radius:.5rem}#chat-widget-root .rounded-md{border-radius:.375rem}#chat-widget-root .rounded-xl{border-radius:.75rem}#chat-widget-root .rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}#chat-widget-root .rounded-tl-sm{border-top-left-radius:.125rem}#chat-widget-root .rounded-tr-sm{border-top-right-radius:.125rem}#chat-widget-root .border{border-width:1px}#chat-widget-root .border-0{border-width:0}#chat-widget-root .border-b{border-bottom-width:1px}#chat-widget-root .border-l-4{border-left-width:4px}#chat-widget-root .border-t{border-top-width:1px}#chat-widget-root .border-t-2{border-top-width:2px}#chat-widget-root .border-dotted{border-style:dotted}#chat-widget-root .border-none{border-style:none}#chat-widget-root .\\!border-status-error{border-color:hsl(var(--cw-status-error))!important}#chat-widget-root .border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity,1))}#chat-widget-root .border-amber-700\\/50{border-color:rgba(180,83,9,.5)}#chat-widget-root .border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity,1))}#chat-widget-root .border-blue-700\\/50{border-color:rgba(29,78,216,.5)}#chat-widget-root .border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-200\\/60{border-color:rgba(229,231,235,.6)}#chat-widget-root .border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}#chat-widget-root .border-gray-700\\/50{border-color:rgba(55,65,81,.5)}#chat-widget-root .border-transparent{border-color:transparent}#chat-widget-root .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}#chat-widget-root .bg-amber-900\\/40{background-color:rgba(120,53,15,.4)}#chat-widget-root .bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-blue-900\\/30{background-color:rgba(30,58,138,.3)}#chat-widget-root .bg-current{background-color:currentColor}#chat-widget-root .bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-50\\/30{background-color:rgba(249,250,251,.3)}#chat-widget-root .bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-700\\/50{background-color:rgba(55,65,81,.5)}#chat-widget-root .bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gray-800\\/50{background-color:rgba(31,41,55,.5)}#chat-widget-root .bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}#chat-widget-root .bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity,1))}#chat-widget-root .bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity,1))}#chat-widget-root .bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity,1))}#chat-widget-root .bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}#chat-widget-root .bg-slate-50\\/50{background-color:rgba(248,250,252,.5)}#chat-widget-root .bg-slate-800\\/50{background-color:rgba(30,41,59,.5)}#chat-widget-root .bg-transparent{background-color:transparent}#chat-widget-root .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}#chat-widget-root .bg-white\\/10{background-color:hsla(0,0%,100%,.1)}#chat-widget-root .bg-white\\/20{background-color:hsla(0,0%,100%,.2)}#chat-widget-root .bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity,1))}#chat-widget-root .bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}#chat-widget-root .bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}#chat-widget-root .from-gray-50\\/50{--tw-gradient-from:rgba(249,250,251,.5) var(--tw-gradient-from-position);--tw-gradient-to:rgba(249,250,251,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/0{--tw-gradient-from:hsla(0,0%,100%,0) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-white\\/10{--tw-gradient-from:hsla(0,0%,100%,.1) var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .from-yellow-200{--tw-gradient-from:#fef08a var(--tw-gradient-from-position);--tw-gradient-to:hsla(53,98%,77%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}#chat-widget-root .via-white\\/5{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.05) var(--tw-gradient-via-position),var(--tw-gradient-to)}#chat-widget-root .to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}#chat-widget-root .to-white\\/10{--tw-gradient-to:hsla(0,0%,100%,.1) var(--tw-gradient-to-position)}#chat-widget-root .to-yellow-400{--tw-gradient-to:#facc15 var(--tw-gradient-to-position)}#chat-widget-root .object-contain{-o-object-fit:contain;object-fit:contain}#chat-widget-root .p-0{padding:0}#chat-widget-root .p-0\\.5{padding:.125rem}#chat-widget-root .p-3{padding:.75rem}#chat-widget-root .p-5{padding:1.25rem}#chat-widget-root .p-6{padding:1.5rem}#chat-widget-root .p-8{padding:2rem}#chat-widget-root .px-1{padding-left:.25rem;padding-right:.25rem}#chat-widget-root .px-2{padding-left:.5rem;padding-right:.5rem}#chat-widget-root .px-2\\.5{padding-left:.625rem;padding-right:.625rem}#chat-widget-root .px-3{padding-left:.75rem;padding-right:.75rem}#chat-widget-root .px-4{padding-left:1rem;padding-right:1rem}#chat-widget-root .px-5{padding-left:1.25rem;padding-right:1.25rem}#chat-widget-root .py-1{padding-bottom:.25rem;padding-top:.25rem}#chat-widget-root .py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}#chat-widget-root .py-12{padding-bottom:3rem;padding-top:3rem}#chat-widget-root .py-2{padding-bottom:.5rem;padding-top:.5rem}#chat-widget-root .py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}#chat-widget-root .py-3{padding-bottom:.75rem;padding-top:.75rem}#chat-widget-root .py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}#chat-widget-root .py-4{padding-bottom:1rem;padding-top:1rem}#chat-widget-root .pb-1{padding-bottom:.25rem}#chat-widget-root .pb-2{padding-bottom:.5rem}#chat-widget-root .pl-1{padding-left:.25rem}#chat-widget-root .pl-2{padding-left:.5rem}#chat-widget-root .pl-4{padding-left:1rem}#chat-widget-root .pl-\\[50px\\]{padding-left:50px}#chat-widget-root .pr-1{padding-right:.25rem}#chat-widget-root .pt-1{padding-top:.25rem}#chat-widget-root .text-left{text-align:left}#chat-widget-root .text-center{text-align:center}#chat-widget-root .text-right{text-align:right}#chat-widget-root .text-start{text-align:start}#chat-widget-root .align-text-bottom{vertical-align:text-bottom}#chat-widget-root .font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}#chat-widget-root .text-2xl{font-size:1.5rem;line-height:2rem}#chat-widget-root .text-\\[10px\\]{font-size:10px}#chat-widget-root .text-base{font-size:1rem;line-height:1.5rem}#chat-widget-root .text-chip{font-size:11px;letter-spacing:0;line-height:1.4}#chat-widget-root .text-h4{font-size:18px;letter-spacing:0;line-height:1.3}#chat-widget-root .text-lg{font-size:1.125rem;line-height:1.75rem}#chat-widget-root .text-sm{font-size:.875rem;line-height:1.25rem}#chat-widget-root .text-xl{font-size:1.25rem;line-height:1.75rem}#chat-widget-root .text-xs{font-size:.75rem;line-height:1rem}#chat-widget-root .font-bold{font-weight:700}#chat-widget-root .font-medium{font-weight:500}#chat-widget-root .font-semibold{font-weight:600}#chat-widget-root .uppercase{text-transform:uppercase}#chat-widget-root .lowercase{text-transform:lowercase}#chat-widget-root .italic{font-style:italic}#chat-widget-root .tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}#chat-widget-root .leading-5{line-height:1.25rem}#chat-widget-root .leading-none{line-height:1}#chat-widget-root .leading-normal{line-height:1.5}#chat-widget-root .leading-relaxed{line-height:1.625}#chat-widget-root .leading-snug{line-height:1.375}#chat-widget-root .tracking-wide{letter-spacing:.025em}#chat-widget-root .text-\\[\\#4A5568\\]{--tw-text-opacity:1;color:rgb(74 85 104/var(--tw-text-opacity,1))}#chat-widget-root .text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity,1))}#chat-widget-root .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}#chat-widget-root .text-current{color:currentColor}#chat-widget-root .text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-500\\/80{color:hsla(220,9%,46%,.8)}#chat-widget-root .text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}#chat-widget-root .text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}#chat-widget-root .text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}#chat-widget-root .text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}#chat-widget-root .text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}#chat-widget-root .text-status-error{color:hsl(var(--cw-status-error))}#chat-widget-root .text-status-success{color:hsl(var(--cw-status-success))}#chat-widget-root .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}#chat-widget-root .text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}#chat-widget-root .underline{text-decoration-line:underline}#chat-widget-root .no-underline{text-decoration-line:none}#chat-widget-root .placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}#chat-widget-root .opacity-0{opacity:0}#chat-widget-root .opacity-50{opacity:.5}#chat-widget-root .opacity-60{opacity:.6}#chat-widget-root .opacity-70{opacity:.7}#chat-widget-root .opacity-75{opacity:.75}#chat-widget-root .opacity-80{opacity:.8}#chat-widget-root .shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}#chat-widget-root .shadow,#chat-widget-root .shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}#chat-widget-root .shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}#chat-widget-root .shadow-lg,#chat-widget-root .shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}#chat-widget-root .shadow-sm,#chat-widget-root .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}#chat-widget-root .shadow-black\\/20{--tw-shadow-color:rgba(0,0,0,.2);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .shadow-gray-200\\/80{--tw-shadow-color:rgba(229,231,235,.8);--tw-shadow:var(--tw-shadow-colored)}#chat-widget-root .outline-none{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .outline{outline-style:solid}#chat-widget-root .ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .ring,#chat-widget-root .ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity,1))}#chat-widget-root .ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity,1))}#chat-widget-root .ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity,1))}#chat-widget-root .blur{--tw-blur:blur(8px)}#chat-widget-root .blur,#chat-widget-root .drop-shadow{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}#chat-widget-root .drop-shadow-md,#chat-widget-root .drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}#chat-widget-root .grayscale-\\[0\\.3\\]{--tw-grayscale:grayscale(0.3)}#chat-widget-root .filter,#chat-widget-root .grayscale-\\[0\\.3\\]{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}#chat-widget-root .transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .duration-150{transition-duration:.15s}#chat-widget-root .duration-200{transition-duration:.2s}#chat-widget-root .duration-300{transition-duration:.3s}#chat-widget-root .duration-500{transition-duration:.5s}#chat-widget-root :is(#chat-widget-root .animate-in){animation:slideIn .3s ease-out}#chat-widget-root :is(#chat-widget-root .transition-all){transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}#chat-widget-root .\\[font-family\\:inherit\\]{font-family:inherit}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::-moz-placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-\\[\\#A2A9B2\\]::placeholder{--tw-text-opacity:1;color:rgb(162 169 178/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-gray-500::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .placeholder\\:text-gray-500::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}#chat-widget-root .hover\\:scale-105:hover,#chat-widget-root .hover\\:scale-110:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}#chat-widget-root .hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .hover\\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity,1))}#chat-widget-root .hover\\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-blue-500\\/20:hover{background-color:rgba(59,130,246,.2)}#chat-widget-root .hover\\:bg-blue-900\\/50:hover{background-color:rgba(30,58,138,.5)}#chat-widget-root .hover\\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}#chat-widget-root .hover\\:bg-transparent:hover{background-color:transparent}#chat-widget-root .hover\\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}#chat-widget-root .hover\\:underline:hover{text-decoration-line:underline}#chat-widget-root .hover\\:opacity-80:hover{opacity:.8}#chat-widget-root .hover\\:opacity-90:hover{opacity:.9}#chat-widget-root .hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}#chat-widget-root .hover\\:shadow-md:hover,#chat-widget-root .hover\\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root .hover\\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}#chat-widget-root .hover\\:grayscale-0:hover{--tw-grayscale:grayscale(0);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}#chat-widget-root .focus\\:\\!border-status-error:focus{border-color:hsl(var(--cw-status-error))!important}#chat-widget-root .focus\\:border-\\[\\#5A6069\\]:focus{--tw-border-opacity:1;border-color:rgb(90 96 105/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:border-\\[\\#B0B0B0\\]:focus{--tw-border-opacity:1;border-color:rgb(176 176 176/var(--tw-border-opacity,1))}#chat-widget-root .focus\\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}#chat-widget-root .focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus\\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-0:focus,#chat-widget-root .focus\\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus\\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}#chat-widget-root .focus\\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}#chat-widget-root .focus\\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity,1))}#chat-widget-root .focus-visible\\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .focus-visible\\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .focus-visible\\:ring-blue-700:focus-visible{--tw-ring-opacity:1;--tw-ring-color:rgb(29 78 216/var(--tw-ring-opacity,1))}#chat-widget-root .focus-visible\\:ring-white\\/40:focus-visible{--tw-ring-color:hsla(0,0%,100%,.4)}#chat-widget-root .active\\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95}#chat-widget-root .active\\:scale-95:active,#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:scale-\\[0\\.97\\]:active{--tw-scale-x:0.97;--tw-scale-y:0.97}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active{--tw-scale-x:0.98;--tw-scale-y:0.98}#chat-widget-root .active\\:scale-\\[0\\.98\\]:active,#chat-widget-root .active\\:scale-\\[0\\.99\\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root .active\\:scale-\\[0\\.99\\]:active{--tw-scale-x:0.99;--tw-scale-y:0.99}#chat-widget-root .active\\:outline-none:active{outline:2px solid transparent;outline-offset:2px}#chat-widget-root .active\\:ring-0:active{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}#chat-widget-root .disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}#chat-widget-root .disabled\\:opacity-40:disabled{opacity:.4}#chat-widget-root .disabled\\:opacity-50:disabled{opacity:.5}#chat-widget-root .disabled\\:shadow-none:disabled{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}#chat-widget-root :is(.group:hover .group-hover\\:scale-100){--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}#chat-widget-root :is(.group:hover .group-hover\\:opacity-100){opacity:1}#chat-widget-root .dark\\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}#chat-widget-root .dark\\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}@media (min-width:768px){#chat-widget-root .md\\:text-sm{font-size:.875rem;line-height:1.25rem}}#chat-widget-root .rtl\\:rounded-tl-2xl:where([dir=rtl],[dir=rtl] *){border-top-left-radius:1rem}#chat-widget-root .rtl\\:rounded-tr-sm:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.125rem}#chat-widget-root .\\[\\&\\:first-child\\]\\:\\!mt-0:first-child{margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:first-child\\]\\:\\!mt-0>:first-child){margin-top:0!important}#chat-widget-root :is(.\\[\\&\\>\\*\\:last-child\\]\\:\\!mb-0>:last-child){margin-bottom:0!important}";
|
|
7807
7807
|
|
|
7808
7808
|
var css_248z = ".chat-widget-root{position:fixed;z-index:999999}.chat-widget-container{color:var(--cw-text-color,inherit);font-family:var(\n --cw-font-family,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Roboto\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif\n )}#chat-widget-root .chat-messages p{overflow-wrap:anywhere;word-break:break-word}textarea#chat-widget-input::-moz-placeholder{border:none;line-height:48px;outline:none}textarea#chat-widget-input::placeholder{border:none;line-height:48px;outline:none}textarea#chat-widget-input{border:none;line-height:48px;outline:none}@keyframes slideIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-5px)}}#chat-widget-root .scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}#chat-widget-root .scrollbar-hide::-webkit-scrollbar{display:none}#chat-widget-root .slim-scrollbar-x{scrollbar-width:thin}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar{height:3px!important}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar-track{background:transparent!important}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar-thumb{background:#d1d5db!important;border-radius:2px!important}#chat-widget-root .slim-scrollbar-x::-webkit-scrollbar-thumb:hover{background:#9ca3af!important}@media print{.chat-widget-root{display:none!important}}";
|
|
7809
7809
|
|
|
@@ -8890,112 +8890,38 @@
|
|
|
8890
8890
|
}
|
|
8891
8891
|
|
|
8892
8892
|
/**
|
|
8893
|
-
*
|
|
8894
|
-
*
|
|
8895
|
-
*/
|
|
8896
|
-
async function startAudioRecorderWorklet(onPcmChunk) {
|
|
8897
|
-
if (typeof window === 'undefined') {
|
|
8898
|
-
throw new Error('Audio recorder can only run in the browser');
|
|
8899
|
-
}
|
|
8900
|
-
const audioRecorderContext = new AudioContext({
|
|
8901
|
-
sampleRate: 16000
|
|
8902
|
-
});
|
|
8903
|
-
|
|
8904
|
-
// Use inline worklet code with Blob URL (works reliably with all bundlers)
|
|
8905
|
-
// This approach is more compatible than using import.meta.url which may not resolve
|
|
8906
|
-
// correctly in bundled builds (especially with Rollup)
|
|
8907
|
-
const workletCode = `
|
|
8908
|
-
class PCMRecorderProcessor extends AudioWorkletProcessor {
|
|
8909
|
-
process(inputs) {
|
|
8910
|
-
if (!inputs.length || !inputs[0].length) {
|
|
8911
|
-
return true;
|
|
8912
|
-
}
|
|
8913
|
-
const inputChannel = inputs[0][0];
|
|
8914
|
-
this.port.postMessage(new Float32Array(inputChannel));
|
|
8915
|
-
return true;
|
|
8916
|
-
}
|
|
8917
|
-
}
|
|
8918
|
-
registerProcessor('pcm-recorder-processor', PCMRecorderProcessor);
|
|
8919
|
-
`;
|
|
8920
|
-
const blob = new Blob([workletCode], {
|
|
8921
|
-
type: 'application/javascript'
|
|
8922
|
-
});
|
|
8923
|
-
const workletUrl = URL.createObjectURL(blob);
|
|
8924
|
-
await audioRecorderContext.audioWorklet.addModule(workletUrl);
|
|
8925
|
-
|
|
8926
|
-
// Clean up the Blob URL after the worklet is loaded
|
|
8927
|
-
URL.revokeObjectURL(workletUrl);
|
|
8928
|
-
|
|
8929
|
-
// The reply plays through the speakers while the mic is open: without echo
|
|
8930
|
-
// cancellation it comes back in, and the voice gate takes it for the caller
|
|
8931
|
-
// barging in (dev, 16 Oct 2026).
|
|
8932
|
-
const micStream = await navigator.mediaDevices.getUserMedia({
|
|
8933
|
-
audio: {
|
|
8934
|
-
channelCount: 1,
|
|
8935
|
-
echoCancellation: true,
|
|
8936
|
-
noiseSuppression: true,
|
|
8937
|
-
autoGainControl: true
|
|
8938
|
-
}
|
|
8939
|
-
});
|
|
8940
|
-
const source = audioRecorderContext.createMediaStreamSource(micStream);
|
|
8941
|
-
const audioRecorderNode = new AudioWorkletNode(audioRecorderContext, 'pcm-recorder-processor');
|
|
8942
|
-
audioRecorderNode.port.onmessage = event => {
|
|
8943
|
-
const pcmData = convertFloat32ToPCM(event.data);
|
|
8944
|
-
onPcmChunk(pcmData);
|
|
8945
|
-
};
|
|
8946
|
-
source.connect(audioRecorderNode);
|
|
8947
|
-
return [audioRecorderNode, audioRecorderContext, micStream];
|
|
8948
|
-
}
|
|
8949
|
-
|
|
8950
|
-
/**
|
|
8951
|
-
* Stops all microphone tracks.
|
|
8952
|
-
*/
|
|
8953
|
-
function stopMicrophone(stream) {
|
|
8954
|
-
if (!stream) {
|
|
8955
|
-
return;
|
|
8956
|
-
}
|
|
8957
|
-
stream.getTracks().forEach(track => track.stop());
|
|
8958
|
-
}
|
|
8959
|
-
const INT16_MAX = 0x7fff;
|
|
8960
|
-
function convertFloat32ToPCM(float32Array) {
|
|
8961
|
-
const pcm16Array = new Int16Array(float32Array.length);
|
|
8962
|
-
for (let i = 0; i < float32Array.length; i += 1) {
|
|
8963
|
-
pcm16Array[i] = Math.max(-1, Math.min(1, float32Array[i])) * INT16_MAX;
|
|
8964
|
-
}
|
|
8965
|
-
return pcm16Array.buffer;
|
|
8966
|
-
}
|
|
8967
|
-
|
|
8968
|
-
/**
|
|
8969
|
-
* Client-side Voice-Activity gate for the widget's voice (Bidi) session.
|
|
8893
|
+
* Client-side voice-activity gate and PCM helpers for Bidi voice sessions,
|
|
8894
|
+
* shared by the agent-sdk, the widget and the frontend (EV-4798 MERN-19).
|
|
8970
8895
|
*
|
|
8971
|
-
*
|
|
8972
|
-
*
|
|
8973
|
-
*
|
|
8974
|
-
*
|
|
8975
|
-
*
|
|
8896
|
+
* The mic worklet emits a PCM frame every few milliseconds whether or not
|
|
8897
|
+
* anyone is speaking. Streaming all of it handed the server's STT model
|
|
8898
|
+
* near-silent audio, which it turned into hallucinated filler turns ("Thank
|
|
8899
|
+
* you", "Bye") that were auto-submitted and could even end the chat. The gate
|
|
8900
|
+
* is a small energy-based state machine between the mic and the socket: it
|
|
8901
|
+
* forwards audio ONLY inside a confirmed speech turn.
|
|
8976
8902
|
*
|
|
8977
|
-
*
|
|
8978
|
-
*
|
|
8979
|
-
*
|
|
8980
|
-
*
|
|
8981
|
-
*
|
|
8982
|
-
*
|
|
8903
|
+
* - idle -> speech needs sustained voiced energy (`speechStartMs`), so a
|
|
8904
|
+
* click, breath or keyboard tap never arms a turn;
|
|
8905
|
+
* - on open it fires `onSpeechStart` (barge-in: stop assistant TTS), then
|
|
8906
|
+
* flushes `preRollMs` of buffered audio so the first word is not clipped;
|
|
8907
|
+
* - while speaking it forwards every frame, including short pauses;
|
|
8908
|
+
* - speech -> idle after `hangoverMs` of continuous silence, firing
|
|
8909
|
+
* `onSpeechEnd` so the caller can send `audio_end`.
|
|
8983
8910
|
*
|
|
8984
|
-
* Framework-free and side-effect-free (only calls the
|
|
8985
|
-
*
|
|
8911
|
+
* Framework-free and side-effect-free (it only calls the callbacks). Plain
|
|
8912
|
+
* JavaScript (types in speechGate.d.ts), conservative syntax: the widget's
|
|
8913
|
+
* Rollup/Babel build compiles neither TypeScript nor this file.
|
|
8986
8914
|
*/
|
|
8987
8915
|
|
|
8988
8916
|
const DEFAULT_SPEECH_GATE_CONFIG = {
|
|
8989
8917
|
// RMS energy (0..1) at/above which a frame counts as voiced. Speech is
|
|
8990
|
-
// typically 0.05
|
|
8918
|
+
// typically 0.05-0.3; quiet room tone sits well under 0.02.
|
|
8991
8919
|
energyThreshold: 0.025,
|
|
8992
8920
|
// Continuous voiced audio (ms) required to OPEN a turn - rejects coughs/clicks.
|
|
8993
8921
|
speechStartMs: 200,
|
|
8994
|
-
// Continuous silence (ms) after speech that CLOSES the turn.
|
|
8995
|
-
// ride over natural mid-sentence pauses, short enough to feel responsive.
|
|
8922
|
+
// Continuous silence (ms) after speech that CLOSES the turn.
|
|
8996
8923
|
hangoverMs: 1000,
|
|
8997
|
-
//
|
|
8998
|
-
// phoneme of the first word survives the start-detection delay.
|
|
8924
|
+
// Audio (ms) preceding turn-open to retain and flush.
|
|
8999
8925
|
preRollMs: 300
|
|
9000
8926
|
};
|
|
9001
8927
|
|
|
@@ -9005,81 +8931,78 @@
|
|
|
9005
8931
|
if (samples.length === 0) return 0;
|
|
9006
8932
|
let sumSquares = 0;
|
|
9007
8933
|
for (let i = 0; i < samples.length; i += 1) {
|
|
9008
|
-
const v = samples[i] / 0x8000; // normalise Int16
|
|
8934
|
+
const v = samples[i] / 0x8000; // normalise Int16 to -1..1
|
|
9009
8935
|
sumSquares += v * v;
|
|
9010
8936
|
}
|
|
9011
8937
|
return Math.sqrt(sumSquares / samples.length);
|
|
9012
8938
|
}
|
|
8939
|
+
function pick(value, fallback) {
|
|
8940
|
+
return value !== null && value !== undefined ? value : fallback;
|
|
8941
|
+
}
|
|
9013
8942
|
|
|
9014
8943
|
/**
|
|
9015
8944
|
* Create a stateful speech gate. Returns `{ process, reset, isSpeaking }`.
|
|
9016
8945
|
* `config.sampleRate` is required; everything else falls back to
|
|
9017
8946
|
* DEFAULT_SPEECH_GATE_CONFIG.
|
|
9018
|
-
*
|
|
9019
|
-
* @param {{ sampleRate: number, energyThreshold?: number, speechStartMs?: number, hangoverMs?: number, preRollMs?: number }} config
|
|
9020
|
-
* @param {{ onSpeechStart?: () => void, onVoiceFrame: (pcm: ArrayBuffer) => void, onSpeechEnd: () => void }} callbacks
|
|
9021
|
-
* onSpeechStart fires the instant a turn opens - use it for barge-in
|
|
9022
|
-
* (stop any assistant TTS still playing). onVoiceFrame emits each voiced
|
|
9023
|
-
* PCM frame; onSpeechEnd fires when the turn closes after the hangover.
|
|
9024
8947
|
*/
|
|
9025
8948
|
function createSpeechGate(config, callbacks) {
|
|
9026
8949
|
const cfg = {
|
|
9027
8950
|
sampleRate: config.sampleRate,
|
|
9028
|
-
energyThreshold: config.energyThreshold
|
|
9029
|
-
speechStartMs: config.speechStartMs
|
|
9030
|
-
hangoverMs: config.hangoverMs
|
|
9031
|
-
preRollMs: config.preRollMs
|
|
8951
|
+
energyThreshold: pick(config.energyThreshold, DEFAULT_SPEECH_GATE_CONFIG.energyThreshold),
|
|
8952
|
+
speechStartMs: pick(config.speechStartMs, DEFAULT_SPEECH_GATE_CONFIG.speechStartMs),
|
|
8953
|
+
hangoverMs: pick(config.hangoverMs, DEFAULT_SPEECH_GATE_CONFIG.hangoverMs),
|
|
8954
|
+
preRollMs: pick(config.preRollMs, DEFAULT_SPEECH_GATE_CONFIG.preRollMs)
|
|
9032
8955
|
};
|
|
9033
8956
|
let speaking = false;
|
|
9034
|
-
// While idle: how much consecutive voiced audio
|
|
8957
|
+
// While idle: how much consecutive voiced audio has been seen (to open).
|
|
9035
8958
|
let voicedRunMs = 0;
|
|
9036
|
-
// While speaking: how much consecutive silence
|
|
8959
|
+
// While speaking: how much consecutive silence has been seen (to close).
|
|
9037
8960
|
let silenceRunMs = 0;
|
|
9038
8961
|
// Ring of recent frames kept only while idle, for pre-roll on open.
|
|
9039
8962
|
let preRoll = [];
|
|
9040
8963
|
let preRollMsBuffered = 0;
|
|
9041
8964
|
|
|
9042
|
-
// Int16
|
|
9043
|
-
const frameDurationMs =
|
|
9044
|
-
|
|
8965
|
+
// Int16 is 2 bytes/sample; ms = samples / sampleRate * 1000.
|
|
8966
|
+
const frameDurationMs = function (pcm) {
|
|
8967
|
+
return pcm.byteLength / 2 / cfg.sampleRate * 1000;
|
|
8968
|
+
};
|
|
8969
|
+
const reset = function () {
|
|
9045
8970
|
speaking = false;
|
|
9046
8971
|
voicedRunMs = 0;
|
|
9047
8972
|
silenceRunMs = 0;
|
|
9048
8973
|
preRoll = [];
|
|
9049
8974
|
preRollMsBuffered = 0;
|
|
9050
8975
|
};
|
|
9051
|
-
const process = pcm
|
|
8976
|
+
const process = function (pcm) {
|
|
9052
8977
|
const durationMs = frameDurationMs(pcm);
|
|
9053
8978
|
const voiced = computeRms(pcm) >= cfg.energyThreshold;
|
|
9054
8979
|
if (!speaking) {
|
|
9055
|
-
// Keep a bounded pre-roll of the most recent audio so
|
|
9056
|
-
//
|
|
8980
|
+
// Keep a bounded pre-roll of the most recent audio so the onset is not
|
|
8981
|
+
// clipped once this is confirmed as speech.
|
|
9057
8982
|
preRoll.push({
|
|
9058
|
-
pcm,
|
|
9059
|
-
durationMs
|
|
8983
|
+
pcm: pcm,
|
|
8984
|
+
durationMs: durationMs
|
|
9060
8985
|
});
|
|
9061
8986
|
preRollMsBuffered += durationMs;
|
|
9062
8987
|
while (preRollMsBuffered > cfg.preRollMs && preRoll.length > 1) {
|
|
9063
8988
|
const dropped = preRoll.shift();
|
|
9064
|
-
preRollMsBuffered -= dropped
|
|
8989
|
+
preRollMsBuffered -= dropped ? dropped.durationMs : 0;
|
|
9065
8990
|
}
|
|
9066
8991
|
if (voiced) {
|
|
9067
8992
|
voicedRunMs += durationMs;
|
|
9068
8993
|
if (voicedRunMs >= cfg.speechStartMs) {
|
|
9069
|
-
// Confirmed speech
|
|
9070
|
-
// caller can barge in
|
|
9071
|
-
// start streaming this utterance, then flush the pre-roll (which
|
|
9072
|
-
// contains the voiced onset) and go live.
|
|
8994
|
+
// Confirmed speech: open the turn. onSpeechStart first so the
|
|
8995
|
+
// caller can barge in, then flush the pre-roll and go live.
|
|
9073
8996
|
speaking = true;
|
|
9074
8997
|
silenceRunMs = 0;
|
|
9075
|
-
callbacks.onSpeechStart
|
|
9076
|
-
for (
|
|
8998
|
+
if (typeof callbacks.onSpeechStart === 'function') callbacks.onSpeechStart();
|
|
8999
|
+
for (let i = 0; i < preRoll.length; i += 1) callbacks.onVoiceFrame(preRoll[i].pcm);
|
|
9077
9000
|
preRoll = [];
|
|
9078
9001
|
preRollMsBuffered = 0;
|
|
9079
9002
|
}
|
|
9080
9003
|
} else {
|
|
9081
|
-
//
|
|
9082
|
-
// transient
|
|
9004
|
+
// Sustained energy only: any silent frame resets the run so a brief
|
|
9005
|
+
// transient cannot accumulate its way over the threshold.
|
|
9083
9006
|
voicedRunMs = 0;
|
|
9084
9007
|
}
|
|
9085
9008
|
return;
|
|
@@ -9101,10 +9024,88 @@
|
|
|
9101
9024
|
}
|
|
9102
9025
|
};
|
|
9103
9026
|
return {
|
|
9104
|
-
process,
|
|
9105
|
-
reset,
|
|
9106
|
-
isSpeaking: ()
|
|
9027
|
+
process: process,
|
|
9028
|
+
reset: reset,
|
|
9029
|
+
isSpeaking: function () {
|
|
9030
|
+
return speaking;
|
|
9031
|
+
}
|
|
9032
|
+
};
|
|
9033
|
+
}
|
|
9034
|
+
const INT16_MAX = 0x7fff;
|
|
9035
|
+
|
|
9036
|
+
/** Float32 worklet samples (-1..1) to a 16-bit PCM ArrayBuffer. */
|
|
9037
|
+
function convertFloat32ToPCM(float32Array) {
|
|
9038
|
+
const pcm16 = new Int16Array(float32Array.length);
|
|
9039
|
+
for (let i = 0; i < float32Array.length; i += 1) {
|
|
9040
|
+
pcm16[i] = Math.max(-1, Math.min(1, float32Array[i])) * INT16_MAX;
|
|
9041
|
+
}
|
|
9042
|
+
return pcm16.buffer;
|
|
9043
|
+
}
|
|
9044
|
+
|
|
9045
|
+
/** Stop every track of a microphone stream; a no-op without one. */
|
|
9046
|
+
function stopMicrophone(stream) {
|
|
9047
|
+
if (!stream) return;
|
|
9048
|
+
stream.getTracks().forEach(function (track) {
|
|
9049
|
+
track.stop();
|
|
9050
|
+
});
|
|
9051
|
+
}
|
|
9052
|
+
|
|
9053
|
+
/**
|
|
9054
|
+
* Bootstraps the PCM recorder audio worklet, captures mic audio at 16kHz
|
|
9055
|
+
* mono, and forwards buffers through the provided handler.
|
|
9056
|
+
*/
|
|
9057
|
+
async function startAudioRecorderWorklet(onPcmChunk) {
|
|
9058
|
+
if (typeof window === 'undefined') {
|
|
9059
|
+
throw new Error('Audio recorder can only run in the browser');
|
|
9060
|
+
}
|
|
9061
|
+
const audioRecorderContext = new AudioContext({
|
|
9062
|
+
sampleRate: 16000
|
|
9063
|
+
});
|
|
9064
|
+
|
|
9065
|
+
// Use inline worklet code with Blob URL (works reliably with all bundlers)
|
|
9066
|
+
// This approach is more compatible than using import.meta.url which may not resolve
|
|
9067
|
+
// correctly in bundled builds (especially with Rollup)
|
|
9068
|
+
const workletCode = `
|
|
9069
|
+
class PCMRecorderProcessor extends AudioWorkletProcessor {
|
|
9070
|
+
process(inputs) {
|
|
9071
|
+
if (!inputs.length || !inputs[0].length) {
|
|
9072
|
+
return true;
|
|
9073
|
+
}
|
|
9074
|
+
const inputChannel = inputs[0][0];
|
|
9075
|
+
this.port.postMessage(new Float32Array(inputChannel));
|
|
9076
|
+
return true;
|
|
9077
|
+
}
|
|
9078
|
+
}
|
|
9079
|
+
registerProcessor('pcm-recorder-processor', PCMRecorderProcessor);
|
|
9080
|
+
`;
|
|
9081
|
+
const blob = new Blob([workletCode], {
|
|
9082
|
+
type: 'application/javascript'
|
|
9083
|
+
});
|
|
9084
|
+
const workletUrl = URL.createObjectURL(blob);
|
|
9085
|
+
await audioRecorderContext.audioWorklet.addModule(workletUrl);
|
|
9086
|
+
|
|
9087
|
+
// Clean up the Blob URL after the worklet is loaded
|
|
9088
|
+
URL.revokeObjectURL(workletUrl);
|
|
9089
|
+
|
|
9090
|
+
// The reply plays through the speakers while the mic is open: without echo
|
|
9091
|
+
// cancellation it comes back in, and the voice gate takes it for the caller
|
|
9092
|
+
// barging in (dev, 16 Oct 2026).
|
|
9093
|
+
const micStream = await navigator.mediaDevices.getUserMedia({
|
|
9094
|
+
audio: {
|
|
9095
|
+
channelCount: 1,
|
|
9096
|
+
echoCancellation: true,
|
|
9097
|
+
noiseSuppression: true,
|
|
9098
|
+
autoGainControl: true
|
|
9099
|
+
}
|
|
9100
|
+
});
|
|
9101
|
+
const source = audioRecorderContext.createMediaStreamSource(micStream);
|
|
9102
|
+
const audioRecorderNode = new AudioWorkletNode(audioRecorderContext, 'pcm-recorder-processor');
|
|
9103
|
+
audioRecorderNode.port.onmessage = event => {
|
|
9104
|
+
const pcmData = convertFloat32ToPCM(event.data);
|
|
9105
|
+
onPcmChunk(pcmData);
|
|
9107
9106
|
};
|
|
9107
|
+
source.connect(audioRecorderNode);
|
|
9108
|
+
return [audioRecorderNode, audioRecorderContext, micStream];
|
|
9108
9109
|
}
|
|
9109
9110
|
|
|
9110
9111
|
/**
|
|
@@ -11114,6 +11115,689 @@
|
|
|
11114
11115
|
allowMicAccess: "Cho phép truy cập micrô"
|
|
11115
11116
|
}
|
|
11116
11117
|
};
|
|
11118
|
+
|
|
11119
|
+
// EV-4798 (MERN-21): accessible names for icon-only controls and labelled
|
|
11120
|
+
// regions that used to be hardcoded English. Kept as its own table, like
|
|
11121
|
+
// ONBOARDING_PLACEHOLDERS below, so every supported locale carries the full
|
|
11122
|
+
// set in one place. translate() reads it after the locale's main dictionary
|
|
11123
|
+
// and before the English fallback. `{count}` is substituted at the call site.
|
|
11124
|
+
const A11Y_LABELS = {
|
|
11125
|
+
en: {
|
|
11126
|
+
removeAttachment: "Remove attachment",
|
|
11127
|
+
categoryFilter: "Category filter",
|
|
11128
|
+
filterByCategory: "Filter by category",
|
|
11129
|
+
scrollCategoriesLeft: "Scroll categories left",
|
|
11130
|
+
scrollCategoriesRight: "Scroll categories right",
|
|
11131
|
+
scrollTagsLeft: "Scroll tags left",
|
|
11132
|
+
scrollTagsRight: "Scroll tags right",
|
|
11133
|
+
copyMessage: "Copy message",
|
|
11134
|
+
copied: "Copied",
|
|
11135
|
+
like: "Like",
|
|
11136
|
+
dislike: "Dislike",
|
|
11137
|
+
sourcesCited: "{count} sources cited",
|
|
11138
|
+
moreSources: "+{count} more"
|
|
11139
|
+
},
|
|
11140
|
+
ar: {
|
|
11141
|
+
removeAttachment: "إزالة المرفق",
|
|
11142
|
+
categoryFilter: "تصفية الفئات",
|
|
11143
|
+
filterByCategory: "التصفية حسب الفئة",
|
|
11144
|
+
scrollCategoriesLeft: "تمرير الفئات لليسار",
|
|
11145
|
+
scrollCategoriesRight: "تمرير الفئات لليمين",
|
|
11146
|
+
scrollTagsLeft: "تمرير الوسوم لليسار",
|
|
11147
|
+
scrollTagsRight: "تمرير الوسوم لليمين",
|
|
11148
|
+
copyMessage: "نسخ الرسالة",
|
|
11149
|
+
copied: "تم النسخ",
|
|
11150
|
+
like: "أعجبني",
|
|
11151
|
+
dislike: "لم يعجبني",
|
|
11152
|
+
sourcesCited: "{count} مصادر مستشهد بها",
|
|
11153
|
+
moreSources: "+{count} أخرى"
|
|
11154
|
+
},
|
|
11155
|
+
es: {
|
|
11156
|
+
removeAttachment: "Quitar archivo adjunto",
|
|
11157
|
+
categoryFilter: "Filtro de categoría",
|
|
11158
|
+
filterByCategory: "Filtrar por categoría",
|
|
11159
|
+
scrollCategoriesLeft: "Desplazar categorías a la izquierda",
|
|
11160
|
+
scrollCategoriesRight: "Desplazar categorías a la derecha",
|
|
11161
|
+
scrollTagsLeft: "Desplazar etiquetas a la izquierda",
|
|
11162
|
+
scrollTagsRight: "Desplazar etiquetas a la derecha",
|
|
11163
|
+
copyMessage: "Copiar mensaje",
|
|
11164
|
+
copied: "Copiado",
|
|
11165
|
+
like: "Me gusta",
|
|
11166
|
+
dislike: "No me gusta",
|
|
11167
|
+
sourcesCited: "{count} fuentes citadas",
|
|
11168
|
+
moreSources: "+{count} más"
|
|
11169
|
+
},
|
|
11170
|
+
be: {
|
|
11171
|
+
removeAttachment: "Выдаліць улажэнне",
|
|
11172
|
+
categoryFilter: "Фільтр катэгорый",
|
|
11173
|
+
filterByCategory: "Фільтраваць па катэгорыі",
|
|
11174
|
+
scrollCategoriesLeft: "Пракруціць катэгорыі ўлева",
|
|
11175
|
+
scrollCategoriesRight: "Пракруціць катэгорыі ўправа",
|
|
11176
|
+
scrollTagsLeft: "Пракруціць тэгі ўлева",
|
|
11177
|
+
scrollTagsRight: "Пракруціць тэгі ўправа",
|
|
11178
|
+
copyMessage: "Капіраваць паведамленне",
|
|
11179
|
+
copied: "Скапіравана",
|
|
11180
|
+
like: "Падабаецца",
|
|
11181
|
+
dislike: "Не падабаецца",
|
|
11182
|
+
sourcesCited: "Цытаваныя крыніцы: {count}",
|
|
11183
|
+
moreSources: "+{count} яшчэ"
|
|
11184
|
+
},
|
|
11185
|
+
bs: {
|
|
11186
|
+
removeAttachment: "Ukloni prilog",
|
|
11187
|
+
categoryFilter: "Filter kategorija",
|
|
11188
|
+
filterByCategory: "Filtriraj po kategoriji",
|
|
11189
|
+
scrollCategoriesLeft: "Pomjeri kategorije lijevo",
|
|
11190
|
+
scrollCategoriesRight: "Pomjeri kategorije desno",
|
|
11191
|
+
scrollTagsLeft: "Pomjeri oznake lijevo",
|
|
11192
|
+
scrollTagsRight: "Pomjeri oznake desno",
|
|
11193
|
+
copyMessage: "Kopiraj poruku",
|
|
11194
|
+
copied: "Kopirano",
|
|
11195
|
+
like: "Sviđa mi se",
|
|
11196
|
+
dislike: "Ne sviđa mi se",
|
|
11197
|
+
sourcesCited: "Citirani izvori: {count}",
|
|
11198
|
+
moreSources: "+{count} više"
|
|
11199
|
+
},
|
|
11200
|
+
bg: {
|
|
11201
|
+
removeAttachment: "Премахване на прикачения файл",
|
|
11202
|
+
categoryFilter: "Филтър по категория",
|
|
11203
|
+
filterByCategory: "Филтриране по категория",
|
|
11204
|
+
scrollCategoriesLeft: "Превъртане на категориите наляво",
|
|
11205
|
+
scrollCategoriesRight: "Превъртане на категориите надясно",
|
|
11206
|
+
scrollTagsLeft: "Превъртане на етикетите наляво",
|
|
11207
|
+
scrollTagsRight: "Превъртане на етикетите надясно",
|
|
11208
|
+
copyMessage: "Копиране на съобщението",
|
|
11209
|
+
copied: "Копирано",
|
|
11210
|
+
like: "Харесва ми",
|
|
11211
|
+
dislike: "Не ми харесва",
|
|
11212
|
+
sourcesCited: "Цитирани източници: {count}",
|
|
11213
|
+
moreSources: "+{count} още"
|
|
11214
|
+
},
|
|
11215
|
+
my: {
|
|
11216
|
+
removeAttachment: "ပူးတွဲဖိုင်ကို ဖယ်ရှားပါ",
|
|
11217
|
+
categoryFilter: "အမျိုးအစား စစ်ထုတ်မှု",
|
|
11218
|
+
filterByCategory: "အမျိုးအစားအလိုက် စစ်ထုတ်ပါ",
|
|
11219
|
+
scrollCategoriesLeft: "အမျိုးအစားများကို ဘယ်ဘက်သို့ ရွှေ့ပါ",
|
|
11220
|
+
scrollCategoriesRight: "အမျိုးအစားများကို ညာဘက်သို့ ရွှေ့ပါ",
|
|
11221
|
+
scrollTagsLeft: "တဂ်များကို ဘယ်ဘက်သို့ ရွှေ့ပါ",
|
|
11222
|
+
scrollTagsRight: "တဂ်များကို ညာဘက်သို့ ရွှေ့ပါ",
|
|
11223
|
+
copyMessage: "မက်ဆေ့ချ်ကို ကူးယူပါ",
|
|
11224
|
+
copied: "ကူးယူပြီးပါပြီ",
|
|
11225
|
+
like: "နှစ်သက်သည်",
|
|
11226
|
+
dislike: "မနှစ်သက်ပါ",
|
|
11227
|
+
sourcesCited: "ကိုးကားထားသော ရင်းမြစ် {count} ခု",
|
|
11228
|
+
moreSources: "နောက်ထပ် +{count}"
|
|
11229
|
+
},
|
|
11230
|
+
ca: {
|
|
11231
|
+
removeAttachment: "Elimina el fitxer adjunt",
|
|
11232
|
+
categoryFilter: "Filtre de categoria",
|
|
11233
|
+
filterByCategory: "Filtra per categoria",
|
|
11234
|
+
scrollCategoriesLeft: "Desplaça les categories a l'esquerra",
|
|
11235
|
+
scrollCategoriesRight: "Desplaça les categories a la dreta",
|
|
11236
|
+
scrollTagsLeft: "Desplaça les etiquetes a l'esquerra",
|
|
11237
|
+
scrollTagsRight: "Desplaça les etiquetes a la dreta",
|
|
11238
|
+
copyMessage: "Copia el missatge",
|
|
11239
|
+
copied: "Copiat",
|
|
11240
|
+
like: "M'agrada",
|
|
11241
|
+
dislike: "No m'agrada",
|
|
11242
|
+
sourcesCited: "{count} fonts citades",
|
|
11243
|
+
moreSources: "+{count} més"
|
|
11244
|
+
},
|
|
11245
|
+
zh: {
|
|
11246
|
+
removeAttachment: "移除附件",
|
|
11247
|
+
categoryFilter: "类别筛选",
|
|
11248
|
+
filterByCategory: "按类别筛选",
|
|
11249
|
+
scrollCategoriesLeft: "向左滚动类别",
|
|
11250
|
+
scrollCategoriesRight: "向右滚动类别",
|
|
11251
|
+
scrollTagsLeft: "向左滚动标签",
|
|
11252
|
+
scrollTagsRight: "向右滚动标签",
|
|
11253
|
+
copyMessage: "复制消息",
|
|
11254
|
+
copied: "已复制",
|
|
11255
|
+
like: "赞",
|
|
11256
|
+
dislike: "踩",
|
|
11257
|
+
sourcesCited: "引用了 {count} 个来源",
|
|
11258
|
+
moreSources: "另外 {count} 个"
|
|
11259
|
+
},
|
|
11260
|
+
hr: {
|
|
11261
|
+
removeAttachment: "Ukloni privitak",
|
|
11262
|
+
categoryFilter: "Filtar kategorija",
|
|
11263
|
+
filterByCategory: "Filtriraj po kategoriji",
|
|
11264
|
+
scrollCategoriesLeft: "Pomakni kategorije ulijevo",
|
|
11265
|
+
scrollCategoriesRight: "Pomakni kategorije udesno",
|
|
11266
|
+
scrollTagsLeft: "Pomakni oznake ulijevo",
|
|
11267
|
+
scrollTagsRight: "Pomakni oznake udesno",
|
|
11268
|
+
copyMessage: "Kopiraj poruku",
|
|
11269
|
+
copied: "Kopirano",
|
|
11270
|
+
like: "Sviđa mi se",
|
|
11271
|
+
dislike: "Ne sviđa mi se",
|
|
11272
|
+
sourcesCited: "Citirani izvori: {count}",
|
|
11273
|
+
moreSources: "+{count} više"
|
|
11274
|
+
},
|
|
11275
|
+
cs: {
|
|
11276
|
+
removeAttachment: "Odebrat přílohu",
|
|
11277
|
+
categoryFilter: "Filtr kategorií",
|
|
11278
|
+
filterByCategory: "Filtrovat podle kategorie",
|
|
11279
|
+
scrollCategoriesLeft: "Posunout kategorie doleva",
|
|
11280
|
+
scrollCategoriesRight: "Posunout kategorie doprava",
|
|
11281
|
+
scrollTagsLeft: "Posunout štítky doleva",
|
|
11282
|
+
scrollTagsRight: "Posunout štítky doprava",
|
|
11283
|
+
copyMessage: "Kopírovat zprávu",
|
|
11284
|
+
copied: "Zkopírováno",
|
|
11285
|
+
like: "Líbí se mi",
|
|
11286
|
+
dislike: "Nelíbí se mi",
|
|
11287
|
+
sourcesCited: "Citované zdroje: {count}",
|
|
11288
|
+
moreSources: "+{count} další"
|
|
11289
|
+
},
|
|
11290
|
+
da: {
|
|
11291
|
+
removeAttachment: "Fjern vedhæftet fil",
|
|
11292
|
+
categoryFilter: "Kategorifilter",
|
|
11293
|
+
filterByCategory: "Filtrer efter kategori",
|
|
11294
|
+
scrollCategoriesLeft: "Rul kategorier til venstre",
|
|
11295
|
+
scrollCategoriesRight: "Rul kategorier til højre",
|
|
11296
|
+
scrollTagsLeft: "Rul tags til venstre",
|
|
11297
|
+
scrollTagsRight: "Rul tags til højre",
|
|
11298
|
+
copyMessage: "Kopiér besked",
|
|
11299
|
+
copied: "Kopieret",
|
|
11300
|
+
like: "Synes godt om",
|
|
11301
|
+
dislike: "Synes ikke om",
|
|
11302
|
+
sourcesCited: "{count} kilder citeret",
|
|
11303
|
+
moreSources: "+{count} mere"
|
|
11304
|
+
},
|
|
11305
|
+
nl: {
|
|
11306
|
+
removeAttachment: "Bijlage verwijderen",
|
|
11307
|
+
categoryFilter: "Categoriefilter",
|
|
11308
|
+
filterByCategory: "Filteren op categorie",
|
|
11309
|
+
scrollCategoriesLeft: "Categorieën naar links scrollen",
|
|
11310
|
+
scrollCategoriesRight: "Categorieën naar rechts scrollen",
|
|
11311
|
+
scrollTagsLeft: "Tags naar links scrollen",
|
|
11312
|
+
scrollTagsRight: "Tags naar rechts scrollen",
|
|
11313
|
+
copyMessage: "Bericht kopiëren",
|
|
11314
|
+
copied: "Gekopieerd",
|
|
11315
|
+
like: "Vind ik leuk",
|
|
11316
|
+
dislike: "Vind ik niet leuk",
|
|
11317
|
+
sourcesCited: "{count} bronnen geciteerd",
|
|
11318
|
+
moreSources: "+{count} meer"
|
|
11319
|
+
},
|
|
11320
|
+
et: {
|
|
11321
|
+
removeAttachment: "Eemalda manus",
|
|
11322
|
+
categoryFilter: "Kategooriafilter",
|
|
11323
|
+
filterByCategory: "Filtreeri kategooria järgi",
|
|
11324
|
+
scrollCategoriesLeft: "Keri kategooriaid vasakule",
|
|
11325
|
+
scrollCategoriesRight: "Keri kategooriaid paremale",
|
|
11326
|
+
scrollTagsLeft: "Keri silte vasakule",
|
|
11327
|
+
scrollTagsRight: "Keri silte paremale",
|
|
11328
|
+
copyMessage: "Kopeeri sõnum",
|
|
11329
|
+
copied: "Kopeeritud",
|
|
11330
|
+
like: "Meeldib",
|
|
11331
|
+
dislike: "Ei meeldi",
|
|
11332
|
+
sourcesCited: "Viidatud allikaid: {count}",
|
|
11333
|
+
moreSources: "+{count} veel"
|
|
11334
|
+
},
|
|
11335
|
+
fi: {
|
|
11336
|
+
removeAttachment: "Poista liite",
|
|
11337
|
+
categoryFilter: "Luokkasuodatin",
|
|
11338
|
+
filterByCategory: "Suodata luokan mukaan",
|
|
11339
|
+
scrollCategoriesLeft: "Vieritä luokkia vasemmalle",
|
|
11340
|
+
scrollCategoriesRight: "Vieritä luokkia oikealle",
|
|
11341
|
+
scrollTagsLeft: "Vieritä tunnisteita vasemmalle",
|
|
11342
|
+
scrollTagsRight: "Vieritä tunnisteita oikealle",
|
|
11343
|
+
copyMessage: "Kopioi viesti",
|
|
11344
|
+
copied: "Kopioitu",
|
|
11345
|
+
like: "Tykkää",
|
|
11346
|
+
dislike: "En tykkää",
|
|
11347
|
+
sourcesCited: "Lähteitä viitattu: {count}",
|
|
11348
|
+
moreSources: "+{count} lisää"
|
|
11349
|
+
},
|
|
11350
|
+
fr: {
|
|
11351
|
+
removeAttachment: "Supprimer la pièce jointe",
|
|
11352
|
+
categoryFilter: "Filtre de catégorie",
|
|
11353
|
+
filterByCategory: "Filtrer par catégorie",
|
|
11354
|
+
scrollCategoriesLeft: "Faire défiler les catégories vers la gauche",
|
|
11355
|
+
scrollCategoriesRight: "Faire défiler les catégories vers la droite",
|
|
11356
|
+
scrollTagsLeft: "Faire défiler les étiquettes vers la gauche",
|
|
11357
|
+
scrollTagsRight: "Faire défiler les étiquettes vers la droite",
|
|
11358
|
+
copyMessage: "Copier le message",
|
|
11359
|
+
copied: "Copié",
|
|
11360
|
+
like: "J'aime",
|
|
11361
|
+
dislike: "Je n'aime pas",
|
|
11362
|
+
sourcesCited: "{count} sources citées",
|
|
11363
|
+
moreSources: "+{count} de plus"
|
|
11364
|
+
},
|
|
11365
|
+
de: {
|
|
11366
|
+
removeAttachment: "Anhang entfernen",
|
|
11367
|
+
categoryFilter: "Kategoriefilter",
|
|
11368
|
+
filterByCategory: "Nach Kategorie filtern",
|
|
11369
|
+
scrollCategoriesLeft: "Kategorien nach links scrollen",
|
|
11370
|
+
scrollCategoriesRight: "Kategorien nach rechts scrollen",
|
|
11371
|
+
scrollTagsLeft: "Tags nach links scrollen",
|
|
11372
|
+
scrollTagsRight: "Tags nach rechts scrollen",
|
|
11373
|
+
copyMessage: "Nachricht kopieren",
|
|
11374
|
+
copied: "Kopiert",
|
|
11375
|
+
like: "Gefällt mir",
|
|
11376
|
+
dislike: "Gefällt mir nicht",
|
|
11377
|
+
sourcesCited: "{count} Quellen zitiert",
|
|
11378
|
+
moreSources: "+{count} weitere"
|
|
11379
|
+
},
|
|
11380
|
+
el: {
|
|
11381
|
+
removeAttachment: "Αφαίρεση συνημμένου",
|
|
11382
|
+
categoryFilter: "Φίλτρο κατηγορίας",
|
|
11383
|
+
filterByCategory: "Φιλτράρισμα κατά κατηγορία",
|
|
11384
|
+
scrollCategoriesLeft: "Κύλιση κατηγοριών αριστερά",
|
|
11385
|
+
scrollCategoriesRight: "Κύλιση κατηγοριών δεξιά",
|
|
11386
|
+
scrollTagsLeft: "Κύλιση ετικετών αριστερά",
|
|
11387
|
+
scrollTagsRight: "Κύλιση ετικετών δεξιά",
|
|
11388
|
+
copyMessage: "Αντιγραφή μηνύματος",
|
|
11389
|
+
copied: "Αντιγράφηκε",
|
|
11390
|
+
like: "Μου αρέσει",
|
|
11391
|
+
dislike: "Δεν μου αρέσει",
|
|
11392
|
+
sourcesCited: "{count} πηγές αναφέρονται",
|
|
11393
|
+
moreSources: "+{count} ακόμη"
|
|
11394
|
+
},
|
|
11395
|
+
hi: {
|
|
11396
|
+
removeAttachment: "अनुलग्नक हटाएँ",
|
|
11397
|
+
categoryFilter: "श्रेणी फ़िल्टर",
|
|
11398
|
+
filterByCategory: "श्रेणी के अनुसार फ़िल्टर करें",
|
|
11399
|
+
scrollCategoriesLeft: "श्रेणियों को बाईं ओर स्क्रॉल करें",
|
|
11400
|
+
scrollCategoriesRight: "श्रेणियों को दाईं ओर स्क्रॉल करें",
|
|
11401
|
+
scrollTagsLeft: "टैग को बाईं ओर स्क्रॉल करें",
|
|
11402
|
+
scrollTagsRight: "टैग को दाईं ओर स्क्रॉल करें",
|
|
11403
|
+
copyMessage: "संदेश कॉपी करें",
|
|
11404
|
+
copied: "कॉपी किया गया",
|
|
11405
|
+
like: "पसंद",
|
|
11406
|
+
dislike: "नापसंद",
|
|
11407
|
+
sourcesCited: "{count} स्रोत उद्धृत",
|
|
11408
|
+
moreSources: "+{count} और"
|
|
11409
|
+
},
|
|
11410
|
+
mr: {
|
|
11411
|
+
removeAttachment: "संलग्नक काढा",
|
|
11412
|
+
categoryFilter: "श्रेणी फिल्टर",
|
|
11413
|
+
filterByCategory: "श्रेणीनुसार फिल्टर करा",
|
|
11414
|
+
scrollCategoriesLeft: "श्रेण्या डावीकडे स्क्रोल करा",
|
|
11415
|
+
scrollCategoriesRight: "श्रेण्या उजवीकडे स्क्रोल करा",
|
|
11416
|
+
scrollTagsLeft: "टॅग डावीकडे स्क्रोल करा",
|
|
11417
|
+
scrollTagsRight: "टॅग उजवीकडे स्क्रोल करा",
|
|
11418
|
+
copyMessage: "संदेश कॉपी करा",
|
|
11419
|
+
copied: "कॉपी केले",
|
|
11420
|
+
like: "आवडले",
|
|
11421
|
+
dislike: "आवडले नाही",
|
|
11422
|
+
sourcesCited: "{count} स्रोत उद्धृत",
|
|
11423
|
+
moreSources: "+{count} अधिक"
|
|
11424
|
+
},
|
|
11425
|
+
hu: {
|
|
11426
|
+
removeAttachment: "Melléklet eltávolítása",
|
|
11427
|
+
categoryFilter: "Kategóriaszűrő",
|
|
11428
|
+
filterByCategory: "Szűrés kategória szerint",
|
|
11429
|
+
scrollCategoriesLeft: "Kategóriák görgetése balra",
|
|
11430
|
+
scrollCategoriesRight: "Kategóriák görgetése jobbra",
|
|
11431
|
+
scrollTagsLeft: "Címkék görgetése balra",
|
|
11432
|
+
scrollTagsRight: "Címkék görgetése jobbra",
|
|
11433
|
+
copyMessage: "Üzenet másolása",
|
|
11434
|
+
copied: "Másolva",
|
|
11435
|
+
like: "Tetszik",
|
|
11436
|
+
dislike: "Nem tetszik",
|
|
11437
|
+
sourcesCited: "{count} hivatkozott forrás",
|
|
11438
|
+
moreSources: "+{count} további"
|
|
11439
|
+
},
|
|
11440
|
+
is: {
|
|
11441
|
+
removeAttachment: "Fjarlægja viðhengi",
|
|
11442
|
+
categoryFilter: "Flokkasía",
|
|
11443
|
+
filterByCategory: "Sía eftir flokki",
|
|
11444
|
+
scrollCategoriesLeft: "Fletta flokkum til vinstri",
|
|
11445
|
+
scrollCategoriesRight: "Fletta flokkum til hægri",
|
|
11446
|
+
scrollTagsLeft: "Fletta merkjum til vinstri",
|
|
11447
|
+
scrollTagsRight: "Fletta merkjum til hægri",
|
|
11448
|
+
copyMessage: "Afrita skilaboð",
|
|
11449
|
+
copied: "Afritað",
|
|
11450
|
+
like: "Líkar",
|
|
11451
|
+
dislike: "Líkar ekki",
|
|
11452
|
+
sourcesCited: "Heimildir vísað í: {count}",
|
|
11453
|
+
moreSources: "+{count} í viðbót"
|
|
11454
|
+
},
|
|
11455
|
+
id: {
|
|
11456
|
+
removeAttachment: "Hapus lampiran",
|
|
11457
|
+
categoryFilter: "Filter kategori",
|
|
11458
|
+
filterByCategory: "Filter menurut kategori",
|
|
11459
|
+
scrollCategoriesLeft: "Gulir kategori ke kiri",
|
|
11460
|
+
scrollCategoriesRight: "Gulir kategori ke kanan",
|
|
11461
|
+
scrollTagsLeft: "Gulir tag ke kiri",
|
|
11462
|
+
scrollTagsRight: "Gulir tag ke kanan",
|
|
11463
|
+
copyMessage: "Salin pesan",
|
|
11464
|
+
copied: "Disalin",
|
|
11465
|
+
like: "Suka",
|
|
11466
|
+
dislike: "Tidak suka",
|
|
11467
|
+
sourcesCited: "{count} sumber dikutip",
|
|
11468
|
+
moreSources: "+{count} lainnya"
|
|
11469
|
+
},
|
|
11470
|
+
it: {
|
|
11471
|
+
removeAttachment: "Rimuovi allegato",
|
|
11472
|
+
categoryFilter: "Filtro categoria",
|
|
11473
|
+
filterByCategory: "Filtra per categoria",
|
|
11474
|
+
scrollCategoriesLeft: "Scorri le categorie a sinistra",
|
|
11475
|
+
scrollCategoriesRight: "Scorri le categorie a destra",
|
|
11476
|
+
scrollTagsLeft: "Scorri i tag a sinistra",
|
|
11477
|
+
scrollTagsRight: "Scorri i tag a destra",
|
|
11478
|
+
copyMessage: "Copia messaggio",
|
|
11479
|
+
copied: "Copiato",
|
|
11480
|
+
like: "Mi piace",
|
|
11481
|
+
dislike: "Non mi piace",
|
|
11482
|
+
sourcesCited: "{count} fonti citate",
|
|
11483
|
+
moreSources: "+{count} altre"
|
|
11484
|
+
},
|
|
11485
|
+
ja: {
|
|
11486
|
+
removeAttachment: "添付ファイルを削除",
|
|
11487
|
+
categoryFilter: "カテゴリフィルター",
|
|
11488
|
+
filterByCategory: "カテゴリで絞り込む",
|
|
11489
|
+
scrollCategoriesLeft: "カテゴリを左にスクロール",
|
|
11490
|
+
scrollCategoriesRight: "カテゴリを右にスクロール",
|
|
11491
|
+
scrollTagsLeft: "タグを左にスクロール",
|
|
11492
|
+
scrollTagsRight: "タグを右にスクロール",
|
|
11493
|
+
copyMessage: "メッセージをコピー",
|
|
11494
|
+
copied: "コピーしました",
|
|
11495
|
+
like: "いいね",
|
|
11496
|
+
dislike: "よくないね",
|
|
11497
|
+
sourcesCited: "{count} 件の出典",
|
|
11498
|
+
moreSources: "他 {count} 件"
|
|
11499
|
+
},
|
|
11500
|
+
ko: {
|
|
11501
|
+
removeAttachment: "첨부 파일 제거",
|
|
11502
|
+
categoryFilter: "카테고리 필터",
|
|
11503
|
+
filterByCategory: "카테고리별 필터",
|
|
11504
|
+
scrollCategoriesLeft: "카테고리를 왼쪽으로 스크롤",
|
|
11505
|
+
scrollCategoriesRight: "카테고리를 오른쪽으로 스크롤",
|
|
11506
|
+
scrollTagsLeft: "태그를 왼쪽으로 스크롤",
|
|
11507
|
+
scrollTagsRight: "태그를 오른쪽으로 스크롤",
|
|
11508
|
+
copyMessage: "메시지 복사",
|
|
11509
|
+
copied: "복사됨",
|
|
11510
|
+
like: "좋아요",
|
|
11511
|
+
dislike: "싫어요",
|
|
11512
|
+
sourcesCited: "인용된 출처 {count}개",
|
|
11513
|
+
moreSources: "외 {count}개"
|
|
11514
|
+
},
|
|
11515
|
+
lv: {
|
|
11516
|
+
removeAttachment: "Noņemt pielikumu",
|
|
11517
|
+
categoryFilter: "Kategoriju filtrs",
|
|
11518
|
+
filterByCategory: "Filtrēt pēc kategorijas",
|
|
11519
|
+
scrollCategoriesLeft: "Ritināt kategorijas pa kreisi",
|
|
11520
|
+
scrollCategoriesRight: "Ritināt kategorijas pa labi",
|
|
11521
|
+
scrollTagsLeft: "Ritināt birkas pa kreisi",
|
|
11522
|
+
scrollTagsRight: "Ritināt birkas pa labi",
|
|
11523
|
+
copyMessage: "Kopēt ziņojumu",
|
|
11524
|
+
copied: "Nokopēts",
|
|
11525
|
+
like: "Patīk",
|
|
11526
|
+
dislike: "Nepatīk",
|
|
11527
|
+
sourcesCited: "Citēti avoti: {count}",
|
|
11528
|
+
moreSources: "+{count} vēl"
|
|
11529
|
+
},
|
|
11530
|
+
lt: {
|
|
11531
|
+
removeAttachment: "Pašalinti priedą",
|
|
11532
|
+
categoryFilter: "Kategorijų filtras",
|
|
11533
|
+
filterByCategory: "Filtruoti pagal kategoriją",
|
|
11534
|
+
scrollCategoriesLeft: "Slinkti kategorijas į kairę",
|
|
11535
|
+
scrollCategoriesRight: "Slinkti kategorijas į dešinę",
|
|
11536
|
+
scrollTagsLeft: "Slinkti žymes į kairę",
|
|
11537
|
+
scrollTagsRight: "Slinkti žymes į dešinę",
|
|
11538
|
+
copyMessage: "Kopijuoti žinutę",
|
|
11539
|
+
copied: "Nukopijuota",
|
|
11540
|
+
like: "Patinka",
|
|
11541
|
+
dislike: "Nepatinka",
|
|
11542
|
+
sourcesCited: "Cituoti šaltiniai: {count}",
|
|
11543
|
+
moreSources: "+{count} daugiau"
|
|
11544
|
+
},
|
|
11545
|
+
mk: {
|
|
11546
|
+
removeAttachment: "Отстрани прилог",
|
|
11547
|
+
categoryFilter: "Филтер за категории",
|
|
11548
|
+
filterByCategory: "Филтрирај по категорија",
|
|
11549
|
+
scrollCategoriesLeft: "Лизгај ги категориите налево",
|
|
11550
|
+
scrollCategoriesRight: "Лизгај ги категориите надесно",
|
|
11551
|
+
scrollTagsLeft: "Лизгај ги ознаките налево",
|
|
11552
|
+
scrollTagsRight: "Лизгај ги ознаките надесно",
|
|
11553
|
+
copyMessage: "Копирај порака",
|
|
11554
|
+
copied: "Копирано",
|
|
11555
|
+
like: "Ми се допаѓа",
|
|
11556
|
+
dislike: "Не ми се допаѓа",
|
|
11557
|
+
sourcesCited: "Цитирани извори: {count}",
|
|
11558
|
+
moreSources: "+{count} уште"
|
|
11559
|
+
},
|
|
11560
|
+
ms: {
|
|
11561
|
+
removeAttachment: "Alih keluar lampiran",
|
|
11562
|
+
categoryFilter: "Penapis kategori",
|
|
11563
|
+
filterByCategory: "Tapis mengikut kategori",
|
|
11564
|
+
scrollCategoriesLeft: "Tatal kategori ke kiri",
|
|
11565
|
+
scrollCategoriesRight: "Tatal kategori ke kanan",
|
|
11566
|
+
scrollTagsLeft: "Tatal tag ke kiri",
|
|
11567
|
+
scrollTagsRight: "Tatal tag ke kanan",
|
|
11568
|
+
copyMessage: "Salin mesej",
|
|
11569
|
+
copied: "Disalin",
|
|
11570
|
+
like: "Suka",
|
|
11571
|
+
dislike: "Tidak suka",
|
|
11572
|
+
sourcesCited: "{count} sumber dipetik",
|
|
11573
|
+
moreSources: "+{count} lagi"
|
|
11574
|
+
},
|
|
11575
|
+
no: {
|
|
11576
|
+
removeAttachment: "Fjern vedlegg",
|
|
11577
|
+
categoryFilter: "Kategorifilter",
|
|
11578
|
+
filterByCategory: "Filtrer etter kategori",
|
|
11579
|
+
scrollCategoriesLeft: "Bla kategorier til venstre",
|
|
11580
|
+
scrollCategoriesRight: "Bla kategorier til høyre",
|
|
11581
|
+
scrollTagsLeft: "Bla emneknagger til venstre",
|
|
11582
|
+
scrollTagsRight: "Bla emneknagger til høyre",
|
|
11583
|
+
copyMessage: "Kopier melding",
|
|
11584
|
+
copied: "Kopiert",
|
|
11585
|
+
like: "Liker",
|
|
11586
|
+
dislike: "Liker ikke",
|
|
11587
|
+
sourcesCited: "{count} kilder sitert",
|
|
11588
|
+
moreSources: "+{count} til"
|
|
11589
|
+
},
|
|
11590
|
+
fa: {
|
|
11591
|
+
removeAttachment: "حذف پیوست",
|
|
11592
|
+
categoryFilter: "فیلتر دستهبندی",
|
|
11593
|
+
filterByCategory: "فیلتر بر اساس دستهبندی",
|
|
11594
|
+
scrollCategoriesLeft: "پیمایش دستهبندیها به چپ",
|
|
11595
|
+
scrollCategoriesRight: "پیمایش دستهبندیها به راست",
|
|
11596
|
+
scrollTagsLeft: "پیمایش برچسبها به چپ",
|
|
11597
|
+
scrollTagsRight: "پیمایش برچسبها به راست",
|
|
11598
|
+
copyMessage: "کپی پیام",
|
|
11599
|
+
copied: "کپی شد",
|
|
11600
|
+
like: "پسندیدم",
|
|
11601
|
+
dislike: "نپسندیدم",
|
|
11602
|
+
sourcesCited: "{count} منبع ذکر شده",
|
|
11603
|
+
moreSources: "+{count} مورد دیگر"
|
|
11604
|
+
},
|
|
11605
|
+
pl: {
|
|
11606
|
+
removeAttachment: "Usuń załącznik",
|
|
11607
|
+
categoryFilter: "Filtr kategorii",
|
|
11608
|
+
filterByCategory: "Filtruj według kategorii",
|
|
11609
|
+
scrollCategoriesLeft: "Przewiń kategorie w lewo",
|
|
11610
|
+
scrollCategoriesRight: "Przewiń kategorie w prawo",
|
|
11611
|
+
scrollTagsLeft: "Przewiń tagi w lewo",
|
|
11612
|
+
scrollTagsRight: "Przewiń tagi w prawo",
|
|
11613
|
+
copyMessage: "Kopiuj wiadomość",
|
|
11614
|
+
copied: "Skopiowano",
|
|
11615
|
+
like: "Lubię to",
|
|
11616
|
+
dislike: "Nie lubię tego",
|
|
11617
|
+
sourcesCited: "Cytowane źródła: {count}",
|
|
11618
|
+
moreSources: "+{count} więcej"
|
|
11619
|
+
},
|
|
11620
|
+
pt: {
|
|
11621
|
+
removeAttachment: "Remover anexo",
|
|
11622
|
+
categoryFilter: "Filtro de categoria",
|
|
11623
|
+
filterByCategory: "Filtrar por categoria",
|
|
11624
|
+
scrollCategoriesLeft: "Rolar categorias para a esquerda",
|
|
11625
|
+
scrollCategoriesRight: "Rolar categorias para a direita",
|
|
11626
|
+
scrollTagsLeft: "Rolar etiquetas para a esquerda",
|
|
11627
|
+
scrollTagsRight: "Rolar etiquetas para a direita",
|
|
11628
|
+
copyMessage: "Copiar mensagem",
|
|
11629
|
+
copied: "Copiado",
|
|
11630
|
+
like: "Gostei",
|
|
11631
|
+
dislike: "Não gostei",
|
|
11632
|
+
sourcesCited: "{count} fontes citadas",
|
|
11633
|
+
moreSources: "+{count} mais"
|
|
11634
|
+
},
|
|
11635
|
+
ro: {
|
|
11636
|
+
removeAttachment: "Elimină atașamentul",
|
|
11637
|
+
categoryFilter: "Filtru de categorie",
|
|
11638
|
+
filterByCategory: "Filtrează după categorie",
|
|
11639
|
+
scrollCategoriesLeft: "Derulează categoriile la stânga",
|
|
11640
|
+
scrollCategoriesRight: "Derulează categoriile la dreapta",
|
|
11641
|
+
scrollTagsLeft: "Derulează etichetele la stânga",
|
|
11642
|
+
scrollTagsRight: "Derulează etichetele la dreapta",
|
|
11643
|
+
copyMessage: "Copiază mesajul",
|
|
11644
|
+
copied: "Copiat",
|
|
11645
|
+
like: "Îmi place",
|
|
11646
|
+
dislike: "Nu îmi place",
|
|
11647
|
+
sourcesCited: "Surse citate: {count}",
|
|
11648
|
+
moreSources: "+{count} în plus"
|
|
11649
|
+
},
|
|
11650
|
+
ru: {
|
|
11651
|
+
removeAttachment: "Удалить вложение",
|
|
11652
|
+
categoryFilter: "Фильтр категорий",
|
|
11653
|
+
filterByCategory: "Фильтровать по категории",
|
|
11654
|
+
scrollCategoriesLeft: "Прокрутить категории влево",
|
|
11655
|
+
scrollCategoriesRight: "Прокрутить категории вправо",
|
|
11656
|
+
scrollTagsLeft: "Прокрутить теги влево",
|
|
11657
|
+
scrollTagsRight: "Прокрутить теги вправо",
|
|
11658
|
+
copyMessage: "Копировать сообщение",
|
|
11659
|
+
copied: "Скопировано",
|
|
11660
|
+
like: "Нравится",
|
|
11661
|
+
dislike: "Не нравится",
|
|
11662
|
+
sourcesCited: "Цитируемые источники: {count}",
|
|
11663
|
+
moreSources: "+{count} ещё"
|
|
11664
|
+
},
|
|
11665
|
+
sr: {
|
|
11666
|
+
removeAttachment: "Уклони прилог",
|
|
11667
|
+
categoryFilter: "Филтер категорија",
|
|
11668
|
+
filterByCategory: "Филтрирај по категорији",
|
|
11669
|
+
scrollCategoriesLeft: "Скролуј категорије лево",
|
|
11670
|
+
scrollCategoriesRight: "Скролуј категорије десно",
|
|
11671
|
+
scrollTagsLeft: "Скролуј ознаке лево",
|
|
11672
|
+
scrollTagsRight: "Скролуј ознаке десно",
|
|
11673
|
+
copyMessage: "Копирај поруку",
|
|
11674
|
+
copied: "Копирано",
|
|
11675
|
+
like: "Свиђа ми се",
|
|
11676
|
+
dislike: "Не свиђа ми се",
|
|
11677
|
+
sourcesCited: "Цитирани извори: {count}",
|
|
11678
|
+
moreSources: "+{count} још"
|
|
11679
|
+
},
|
|
11680
|
+
sk: {
|
|
11681
|
+
removeAttachment: "Odstrániť prílohu",
|
|
11682
|
+
categoryFilter: "Filter kategórií",
|
|
11683
|
+
filterByCategory: "Filtrovať podľa kategórie",
|
|
11684
|
+
scrollCategoriesLeft: "Posunúť kategórie doľava",
|
|
11685
|
+
scrollCategoriesRight: "Posunúť kategórie doprava",
|
|
11686
|
+
scrollTagsLeft: "Posunúť štítky doľava",
|
|
11687
|
+
scrollTagsRight: "Posunúť štítky doprava",
|
|
11688
|
+
copyMessage: "Kopírovať správu",
|
|
11689
|
+
copied: "Skopírované",
|
|
11690
|
+
like: "Páči sa mi",
|
|
11691
|
+
dislike: "Nepáči sa mi",
|
|
11692
|
+
sourcesCited: "Citované zdroje: {count}",
|
|
11693
|
+
moreSources: "+{count} ďalšie"
|
|
11694
|
+
},
|
|
11695
|
+
sl: {
|
|
11696
|
+
removeAttachment: "Odstrani prilogo",
|
|
11697
|
+
categoryFilter: "Filter kategorij",
|
|
11698
|
+
filterByCategory: "Filtriraj po kategoriji",
|
|
11699
|
+
scrollCategoriesLeft: "Pomakni kategorije levo",
|
|
11700
|
+
scrollCategoriesRight: "Pomakni kategorije desno",
|
|
11701
|
+
scrollTagsLeft: "Pomakni oznake levo",
|
|
11702
|
+
scrollTagsRight: "Pomakni oznake desno",
|
|
11703
|
+
copyMessage: "Kopiraj sporočilo",
|
|
11704
|
+
copied: "Kopirano",
|
|
11705
|
+
like: "Všeč mi je",
|
|
11706
|
+
dislike: "Ni mi všeč",
|
|
11707
|
+
sourcesCited: "Navedeni viri: {count}",
|
|
11708
|
+
moreSources: "+{count} več"
|
|
11709
|
+
},
|
|
11710
|
+
sv: {
|
|
11711
|
+
removeAttachment: "Ta bort bilaga",
|
|
11712
|
+
categoryFilter: "Kategorifilter",
|
|
11713
|
+
filterByCategory: "Filtrera efter kategori",
|
|
11714
|
+
scrollCategoriesLeft: "Bläddra kategorier åt vänster",
|
|
11715
|
+
scrollCategoriesRight: "Bläddra kategorier åt höger",
|
|
11716
|
+
scrollTagsLeft: "Bläddra taggar åt vänster",
|
|
11717
|
+
scrollTagsRight: "Bläddra taggar åt höger",
|
|
11718
|
+
copyMessage: "Kopiera meddelande",
|
|
11719
|
+
copied: "Kopierat",
|
|
11720
|
+
like: "Gilla",
|
|
11721
|
+
dislike: "Gilla inte",
|
|
11722
|
+
sourcesCited: "{count} källor citerade",
|
|
11723
|
+
moreSources: "+{count} till"
|
|
11724
|
+
},
|
|
11725
|
+
th: {
|
|
11726
|
+
removeAttachment: "นำไฟล์แนบออก",
|
|
11727
|
+
categoryFilter: "ตัวกรองหมวดหมู่",
|
|
11728
|
+
filterByCategory: "กรองตามหมวดหมู่",
|
|
11729
|
+
scrollCategoriesLeft: "เลื่อนหมวดหมู่ไปทางซ้าย",
|
|
11730
|
+
scrollCategoriesRight: "เลื่อนหมวดหมู่ไปทางขวา",
|
|
11731
|
+
scrollTagsLeft: "เลื่อนแท็กไปทางซ้าย",
|
|
11732
|
+
scrollTagsRight: "เลื่อนแท็กไปทางขวา",
|
|
11733
|
+
copyMessage: "คัดลอกข้อความ",
|
|
11734
|
+
copied: "คัดลอกแล้ว",
|
|
11735
|
+
like: "ถูกใจ",
|
|
11736
|
+
dislike: "ไม่ถูกใจ",
|
|
11737
|
+
sourcesCited: "อ้างอิง {count} แหล่ง",
|
|
11738
|
+
moreSources: "อีก +{count}"
|
|
11739
|
+
},
|
|
11740
|
+
tr: {
|
|
11741
|
+
removeAttachment: "Eki kaldır",
|
|
11742
|
+
categoryFilter: "Kategori filtresi",
|
|
11743
|
+
filterByCategory: "Kategoriye göre filtrele",
|
|
11744
|
+
scrollCategoriesLeft: "Kategorileri sola kaydır",
|
|
11745
|
+
scrollCategoriesRight: "Kategorileri sağa kaydır",
|
|
11746
|
+
scrollTagsLeft: "Etiketleri sola kaydır",
|
|
11747
|
+
scrollTagsRight: "Etiketleri sağa kaydır",
|
|
11748
|
+
copyMessage: "Mesajı kopyala",
|
|
11749
|
+
copied: "Kopyalandı",
|
|
11750
|
+
like: "Beğen",
|
|
11751
|
+
dislike: "Beğenme",
|
|
11752
|
+
sourcesCited: "{count} kaynak alıntılandı",
|
|
11753
|
+
moreSources: "+{count} daha"
|
|
11754
|
+
},
|
|
11755
|
+
uk: {
|
|
11756
|
+
removeAttachment: "Видалити вкладення",
|
|
11757
|
+
categoryFilter: "Фільтр категорій",
|
|
11758
|
+
filterByCategory: "Фільтрувати за категорією",
|
|
11759
|
+
scrollCategoriesLeft: "Прокрутити категорії ліворуч",
|
|
11760
|
+
scrollCategoriesRight: "Прокрутити категорії праворуч",
|
|
11761
|
+
scrollTagsLeft: "Прокрутити теги ліворуч",
|
|
11762
|
+
scrollTagsRight: "Прокрутити теги праворуч",
|
|
11763
|
+
copyMessage: "Копіювати повідомлення",
|
|
11764
|
+
copied: "Скопійовано",
|
|
11765
|
+
like: "Подобається",
|
|
11766
|
+
dislike: "Не подобається",
|
|
11767
|
+
sourcesCited: "Цитовані джерела: {count}",
|
|
11768
|
+
moreSources: "+{count} ще"
|
|
11769
|
+
},
|
|
11770
|
+
ur: {
|
|
11771
|
+
removeAttachment: "منسلکہ ہٹائیں",
|
|
11772
|
+
categoryFilter: "زمرہ فلٹر",
|
|
11773
|
+
filterByCategory: "زمرے کے لحاظ سے فلٹر کریں",
|
|
11774
|
+
scrollCategoriesLeft: "زمرے بائیں طرف اسکرول کریں",
|
|
11775
|
+
scrollCategoriesRight: "زمرے دائیں طرف اسکرول کریں",
|
|
11776
|
+
scrollTagsLeft: "ٹیگز بائیں طرف اسکرول کریں",
|
|
11777
|
+
scrollTagsRight: "ٹیگز دائیں طرف اسکرول کریں",
|
|
11778
|
+
copyMessage: "پیغام کاپی کریں",
|
|
11779
|
+
copied: "کاپی ہو گیا",
|
|
11780
|
+
like: "پسند",
|
|
11781
|
+
dislike: "ناپسند",
|
|
11782
|
+
sourcesCited: "{count} حوالہ جاتی ذرائع",
|
|
11783
|
+
moreSources: "+{count} مزید"
|
|
11784
|
+
},
|
|
11785
|
+
vi: {
|
|
11786
|
+
removeAttachment: "Xóa tệp đính kèm",
|
|
11787
|
+
categoryFilter: "Bộ lọc danh mục",
|
|
11788
|
+
filterByCategory: "Lọc theo danh mục",
|
|
11789
|
+
scrollCategoriesLeft: "Cuộn danh mục sang trái",
|
|
11790
|
+
scrollCategoriesRight: "Cuộn danh mục sang phải",
|
|
11791
|
+
scrollTagsLeft: "Cuộn thẻ sang trái",
|
|
11792
|
+
scrollTagsRight: "Cuộn thẻ sang phải",
|
|
11793
|
+
copyMessage: "Sao chép tin nhắn",
|
|
11794
|
+
copied: "Đã sao chép",
|
|
11795
|
+
like: "Thích",
|
|
11796
|
+
dislike: "Không thích",
|
|
11797
|
+
sourcesCited: "Đã trích dẫn {count} nguồn",
|
|
11798
|
+
moreSources: "+{count} nữa"
|
|
11799
|
+
}
|
|
11800
|
+
};
|
|
11117
11801
|
const ONBOARDING_PLACEHOLDERS = {
|
|
11118
11802
|
en: {
|
|
11119
11803
|
onboardingNamePlaceholder: "Please enter your name",
|
|
@@ -11398,7 +12082,7 @@
|
|
|
11398
12082
|
const normalized = normalizeLocale(locale);
|
|
11399
12083
|
const dict = DICTIONARIES[normalized] || EN;
|
|
11400
12084
|
const onboarding = ONBOARDING_PLACEHOLDERS[normalized];
|
|
11401
|
-
return onboarding?.[key] ?? dict[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? EN[key] ?? key;
|
|
12085
|
+
return onboarding?.[key] ?? dict[key] ?? A11Y_LABELS[normalized]?.[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? A11Y_LABELS.en[key] ?? EN[key] ?? key;
|
|
11402
12086
|
}
|
|
11403
12087
|
function createTranslator(locale) {
|
|
11404
12088
|
const normalized = normalizeLocale(locale);
|
|
@@ -11911,81 +12595,99 @@
|
|
|
11911
12595
|
};
|
|
11912
12596
|
|
|
11913
12597
|
/**
|
|
11914
|
-
* Greeting personalisation using the onboarding-collected name
|
|
12598
|
+
* Greeting personalisation using the onboarding-collected name, shared by
|
|
12599
|
+
* the agent-sdk, the widget and the frontend Testing Lab (EV-4798 MERN-19).
|
|
11915
12600
|
*
|
|
11916
12601
|
* Product (2026-07-20): once onboarding captures the user's name, every
|
|
11917
|
-
* greeting (initial / follow-up / re-entry)
|
|
11918
|
-
*
|
|
11919
|
-
*
|
|
12602
|
+
* greeting (initial / follow-up / re-entry) addresses them by it - "Hi, how
|
|
12603
|
+
* can I help you?" -> "Hi Rishabh, how can I help you?" - and a name typed
|
|
12604
|
+
* all-lowercase is title-cased first ("rishabh" -> "Rishabh"). The name is
|
|
12605
|
+
* injected after the greeting's leading salutation so the org's configured
|
|
12606
|
+
* wording is kept. No name, no change, so callers apply it unconditionally.
|
|
11920
12607
|
*
|
|
11921
|
-
*
|
|
11922
|
-
*
|
|
11923
|
-
* tests for this logic - the widget bundles via rollup and can't import across
|
|
11924
|
-
* package boundaries, so the logic is duplicated here rather than shared. Keep
|
|
11925
|
-
* the two in sync; the SDK version is the source of truth.
|
|
12608
|
+
* Plain JavaScript (types in personalizeGreeting.d.ts), conservative syntax:
|
|
12609
|
+
* the widget's Rollup/Babel build compiles neither TypeScript nor this file.
|
|
11926
12610
|
*/
|
|
11927
12611
|
|
|
12612
|
+
function str(v) {
|
|
12613
|
+
return v === null || v === undefined ? '' : String(v);
|
|
12614
|
+
}
|
|
12615
|
+
|
|
11928
12616
|
/**
|
|
11929
|
-
* Title-case a person's name for display: "
|
|
11930
|
-
*
|
|
11931
|
-
*
|
|
11932
|
-
*
|
|
12617
|
+
* Title-case a person's name for display: "john doe" -> "John Doe". Only the
|
|
12618
|
+
* first letter of each word is upper-cased; the rest is left as typed so
|
|
12619
|
+
* intentional casing ("McDonald", "de la Cruz") is not flattened. Collapses
|
|
12620
|
+
* internal whitespace.
|
|
11933
12621
|
*/
|
|
11934
12622
|
function capitalizeName(name) {
|
|
11935
|
-
return
|
|
12623
|
+
return str(name).trim().split(/\s+/).filter(Boolean).map(function (w) {
|
|
12624
|
+
return w.charAt(0).toUpperCase() + w.slice(1);
|
|
12625
|
+
}).join(' ');
|
|
11936
12626
|
}
|
|
11937
12627
|
|
|
11938
12628
|
/**
|
|
11939
|
-
* Return `greeting` with the
|
|
11940
|
-
* salutation
|
|
11941
|
-
*
|
|
11942
|
-
*
|
|
12629
|
+
* Return `greeting` with the title-cased `name` injected after its leading
|
|
12630
|
+
* salutation:
|
|
12631
|
+
*
|
|
12632
|
+
* personalizeGreeting("Hi, how can I help you?", "rishabh")
|
|
12633
|
+
* -> "Hi Rishabh, how can I help you?"
|
|
12634
|
+
* personalizeGreeting("Hello! How can I help?", "john doe")
|
|
12635
|
+
* -> "Hello John Doe! How can I help?"
|
|
12636
|
+
* personalizeGreeting("Welcome to Acme", "sara")
|
|
12637
|
+
* -> "Hi Sara, Welcome to Acme"
|
|
12638
|
+
*
|
|
12639
|
+
* Idempotent: a greeting that already opens with "<salutation> <Name>" is
|
|
12640
|
+
* left alone, so applying twice cannot double-inject.
|
|
11943
12641
|
*/
|
|
11944
12642
|
function personalizeGreeting(greeting, name) {
|
|
11945
|
-
const g =
|
|
11946
|
-
const clean =
|
|
12643
|
+
const g = str(greeting);
|
|
12644
|
+
const clean = str(name).trim();
|
|
11947
12645
|
if (!clean || !g.trim()) return g;
|
|
11948
12646
|
const cap = capitalizeName(clean);
|
|
11949
12647
|
|
|
11950
|
-
// Already personalised with this name
|
|
11951
|
-
const already = new RegExp(
|
|
12648
|
+
// Already personalised with this name: do not inject again.
|
|
12649
|
+
const already = new RegExp('^\\s*(?:hi|hey|hello)\\s+' + cap.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\b', 'i');
|
|
11952
12650
|
if (already.test(g)) return g;
|
|
11953
12651
|
|
|
11954
12652
|
// Leading salutation ("Hi"/"Hey"/"Hello"), an optional "there", then any
|
|
11955
|
-
// opening punctuation. Kept tight so "Welcome to Acme"
|
|
12653
|
+
// opening punctuation. Kept tight so "Welcome to Acme" is not mangled into
|
|
12654
|
+
// "Welcome Sara, to Acme".
|
|
11956
12655
|
const m = g.match(/^\s*(hi|hey|hello)(?:\s+there)?\s*([-,!.:;]+)?\s*/i);
|
|
11957
12656
|
if (m) {
|
|
11958
12657
|
const salutation = m[1];
|
|
11959
|
-
const punct = m[2]
|
|
12658
|
+
const punct = m[2] !== undefined ? m[2] : ',';
|
|
11960
12659
|
const rest = g.slice(m[0].length);
|
|
11961
|
-
return
|
|
12660
|
+
return salutation + ' ' + cap + punct + (rest ? ' ' + rest : '');
|
|
11962
12661
|
}
|
|
11963
12662
|
|
|
11964
|
-
// No recognised salutation
|
|
11965
|
-
return
|
|
12663
|
+
// No recognised salutation: prepend a fresh one.
|
|
12664
|
+
return 'Hi ' + cap + ', ' + g;
|
|
11966
12665
|
}
|
|
12666
|
+
const NAME_FIELD_TYPES = new Set(['fullname', 'name', 'username']);
|
|
11967
12667
|
|
|
11968
12668
|
/**
|
|
11969
|
-
* Pull the user's name out of
|
|
11970
|
-
*
|
|
12669
|
+
* Pull the user's name out of onboarding answers keyed by `fieldType` (the
|
|
12670
|
+
* widget and the Testing Lab preview). The name is the FIRST question whose
|
|
11971
12671
|
* fieldType is a dedicated name type (fullName / name / userName,
|
|
11972
|
-
* case-insensitive)
|
|
11973
|
-
*
|
|
11974
|
-
*
|
|
11975
|
-
*
|
|
12672
|
+
* case-insensitive); a generic `text` field is deliberately not treated as a
|
|
12673
|
+
* name. "" when absent.
|
|
12674
|
+
*
|
|
12675
|
+
* The agent-sdk keys its answers by `askToType` instead and keeps its own
|
|
12676
|
+
* extractOnboardingName for that reason.
|
|
11976
12677
|
*/
|
|
11977
|
-
const NAME_FIELD_TYPES = new Set(["fullname", "name", "username"]);
|
|
11978
12678
|
function extractOnboardingName(questions, answers) {
|
|
11979
|
-
if (!Array.isArray(questions) || !answers) return
|
|
11980
|
-
for (
|
|
11981
|
-
const
|
|
12679
|
+
if (!Array.isArray(questions) || !answers) return '';
|
|
12680
|
+
for (let i = 0; i < questions.length; i += 1) {
|
|
12681
|
+
const q = questions[i];
|
|
12682
|
+
const fieldType = q ? q.fieldType : undefined;
|
|
12683
|
+
const ft = str(fieldType).toLowerCase();
|
|
11982
12684
|
if (!NAME_FIELD_TYPES.has(ft)) continue;
|
|
11983
|
-
const raw = answers[
|
|
11984
|
-
if (typeof raw !==
|
|
12685
|
+
const raw = answers[fieldType === null || fieldType === undefined ? '' : fieldType];
|
|
12686
|
+
if (typeof raw !== 'string') continue;
|
|
11985
12687
|
const trimmed = raw.trim();
|
|
11986
12688
|
if (trimmed) return trimmed;
|
|
11987
12689
|
}
|
|
11988
|
-
return
|
|
12690
|
+
return '';
|
|
11989
12691
|
}
|
|
11990
12692
|
|
|
11991
12693
|
// EV-4390: an agent's Inbox reply can carry files. The assistant bubble
|
|
@@ -13181,6 +13883,12 @@
|
|
|
13181
13883
|
...(attachmentsPayload.length ? {
|
|
13182
13884
|
attachments: attachmentsPayload
|
|
13183
13885
|
} : {}),
|
|
13886
|
+
// EV-4798 MERN-12: the approval card's answer by the held call's
|
|
13887
|
+
// id (utils/toolConfirmation.js). Only when the card carried the
|
|
13888
|
+
// id; the text above stays the message either way.
|
|
13889
|
+
...(opts?.toolConfirmation ? {
|
|
13890
|
+
tool_confirmation: opts.toolConfirmation
|
|
13891
|
+
} : {}),
|
|
13184
13892
|
messageHistory: messages.filter(msg => {
|
|
13185
13893
|
// Filter out processing messages, empty messages, and onboarding messages
|
|
13186
13894
|
return !msg.isProcessing && msg.content && msg.content.trim() && !['userName', 'email', 'phone'].includes(msg.type);
|
|
@@ -15543,12 +16251,13 @@
|
|
|
15543
16251
|
* absolute http(s) URLs pass; anything else (javascript:, data:, vbscript:,
|
|
15544
16252
|
* a bare relative path, non-string) is dropped rather than rendered.
|
|
15545
16253
|
*
|
|
15546
|
-
* EV-3956: the
|
|
15547
|
-
*
|
|
15548
|
-
*
|
|
15549
|
-
*
|
|
15550
|
-
*
|
|
15551
|
-
*
|
|
16254
|
+
* EV-3956 / EV-4798 MERN-19: this is the ONE implementation. The agent-sdk,
|
|
16255
|
+
* widget and frontend renderers all import this file (the published SDK and
|
|
16256
|
+
* widget bundle it at build time, so their consumers never resolve
|
|
16257
|
+
* @eshal/shared). A fix made here reaches all three surfaces. Do not re-inline.
|
|
16258
|
+
*
|
|
16259
|
+
* Plain JavaScript on purpose: the widget's Rollup/Babel build compiles no
|
|
16260
|
+
* TypeScript from another package. Types live in safeUrl.d.ts.
|
|
15552
16261
|
*/
|
|
15553
16262
|
function safeUrl(u) {
|
|
15554
16263
|
return typeof u === 'string' && /^https?:\/\//i.test(u) ? u : undefined;
|
|
@@ -15644,6 +16353,53 @@
|
|
|
15644
16353
|
return `${String(apiBaseUrl).replace(/\/$/, "")}${url.startsWith("/") ? "" : "/"}${url}`;
|
|
15645
16354
|
}
|
|
15646
16355
|
|
|
16356
|
+
/**
|
|
16357
|
+
* The filename a download's `Content-Disposition` header names, or null.
|
|
16358
|
+
*
|
|
16359
|
+
* A copy of `filenameFromContentDisposition` in @eshal/shared, which the
|
|
16360
|
+
* widget (published standalone) cannot import. Both run the cases in
|
|
16361
|
+
* packages/shared/fixtures/content-disposition-cases.json.
|
|
16362
|
+
*
|
|
16363
|
+
* Replaces `/filename\*?=(?:UTF-8'')?["']?([^"'\s;]+)["']?/`, whose
|
|
16364
|
+
* `[^"'\s;]+` stopped at the first space: every SharePoint citation saved
|
|
16365
|
+
* under the first word of its name ("Tech Textile Park Guidelines.pdf" came
|
|
16366
|
+
* down as "Tech.pdf"; dev, 27 Oct 2026).
|
|
16367
|
+
*
|
|
16368
|
+
* `filename*` wins (RFC 6266), then a quoted `filename="..."` read whole,
|
|
16369
|
+
* then a bare token.
|
|
16370
|
+
*/
|
|
16371
|
+
|
|
16372
|
+
function decodeExtValue(charset, encoded) {
|
|
16373
|
+
try {
|
|
16374
|
+
if (/^utf-8$/i.test(charset)) return decodeURIComponent(encoded);
|
|
16375
|
+
return encoded.replace(/%([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
16376
|
+
} catch {
|
|
16377
|
+
return null;
|
|
16378
|
+
}
|
|
16379
|
+
}
|
|
16380
|
+
function maybePercentDecoded(value) {
|
|
16381
|
+
if (!/%[0-9a-f]{2}/i.test(value)) return value;
|
|
16382
|
+
try {
|
|
16383
|
+
return decodeURIComponent(value);
|
|
16384
|
+
} catch {
|
|
16385
|
+
return value;
|
|
16386
|
+
}
|
|
16387
|
+
}
|
|
16388
|
+
function filenameFromContentDisposition(header) {
|
|
16389
|
+
if (!header) return null;
|
|
16390
|
+
const star = /(?:^|;)\s*filename\*\s*=\s*([^;]+)/i.exec(header);
|
|
16391
|
+
if (star) {
|
|
16392
|
+
const ext = /^\s*"?([^']*)'[^']*'([^"]*)"?\s*$/.exec(star[1]);
|
|
16393
|
+
const decoded = ext ? decodeExtValue(ext[1], ext[2]) : null;
|
|
16394
|
+
if (decoded) return decoded;
|
|
16395
|
+
}
|
|
16396
|
+
const quoted = /(?:^|;)\s*filename\s*=\s*"((?:[^"\\]|\\.)*)"/i.exec(header);
|
|
16397
|
+
if (quoted) return maybePercentDecoded(quoted[1].replace(/\\(.)/g, "$1")) || null;
|
|
16398
|
+
const token = /(?:^|;)\s*filename\s*=\s*([^;]+)/i.exec(header);
|
|
16399
|
+
if (token) return maybePercentDecoded(token[1].trim()) || null;
|
|
16400
|
+
return null;
|
|
16401
|
+
}
|
|
16402
|
+
|
|
15647
16403
|
// Runtime loader for the lazy markdown/chart chunk in the vanilla/IIFE
|
|
15648
16404
|
// build (EV-2023). Rollup's IIFE output format has no module system of its
|
|
15649
16405
|
// own, so it can't code-split a native `import()` the way the ESM build
|
|
@@ -16167,14 +16923,7 @@
|
|
|
16167
16923
|
// Content-Disposition holds the UUID-prefixed storage key we
|
|
16168
16924
|
// don't want to show. Skip CD parsing for those.
|
|
16169
16925
|
if (!isAttachment) {
|
|
16170
|
-
|
|
16171
|
-
if (match) {
|
|
16172
|
-
try {
|
|
16173
|
-
filename = decodeURIComponent(match[1].replace(/\\"/g, '"'));
|
|
16174
|
-
} catch {
|
|
16175
|
-
/* keep fallback */
|
|
16176
|
-
}
|
|
16177
|
-
}
|
|
16926
|
+
filename = filenameFromContentDisposition(disposition) || filename;
|
|
16178
16927
|
}
|
|
16179
16928
|
const a = document.createElement("a");
|
|
16180
16929
|
const objectUrl = URL.createObjectURL(blob);
|
|
@@ -16204,8 +16953,13 @@
|
|
|
16204
16953
|
// state are common, unlike the desktop-first admin Inbox.
|
|
16205
16954
|
function CopyMessageButton({
|
|
16206
16955
|
content,
|
|
16207
|
-
isDark
|
|
16956
|
+
isDark,
|
|
16957
|
+
t
|
|
16208
16958
|
}) {
|
|
16959
|
+
// EV-4798 (MERN-21): localised accessible name; English when no translator
|
|
16960
|
+
// reaches this button.
|
|
16961
|
+
const copyLabel = t ? t("copyMessage") : "Copy message";
|
|
16962
|
+
const copiedLabel = t ? t("copied") : "Copied";
|
|
16209
16963
|
const [copied, setCopied] = reactExports.useState(false);
|
|
16210
16964
|
const handleCopy = reactExports.useCallback(() => {
|
|
16211
16965
|
if (!content) return;
|
|
@@ -16224,8 +16978,8 @@
|
|
|
16224
16978
|
WebkitAppearance: "none",
|
|
16225
16979
|
cursor: "pointer"
|
|
16226
16980
|
},
|
|
16227
|
-
"aria-label": copied ?
|
|
16228
|
-
title: copied ?
|
|
16981
|
+
"aria-label": copied ? copiedLabel : copyLabel,
|
|
16982
|
+
title: copied ? copiedLabel : copyLabel,
|
|
16229
16983
|
children: copied ? /*#__PURE__*/jsxRuntimeExports.jsx(Check, {
|
|
16230
16984
|
className: "w-3 h-3 text-green-500"
|
|
16231
16985
|
}) : /*#__PURE__*/jsxRuntimeExports.jsx(Copy, {
|
|
@@ -16381,8 +17135,12 @@
|
|
|
16381
17135
|
sourcesPreliminary: !!message.sourcesPreliminary,
|
|
16382
17136
|
onSourceActivate,
|
|
16383
17137
|
downloadingKey,
|
|
16384
|
-
textColor: messageTextColor
|
|
16385
|
-
|
|
17138
|
+
textColor: messageTextColor,
|
|
17139
|
+
// EV-4798 (MERN-21): the pill's accessible names follow the widget
|
|
17140
|
+
// locale. Optional on the reader side: a cross-bundle provider without
|
|
17141
|
+
// it falls back to English.
|
|
17142
|
+
t
|
|
17143
|
+
}), [message.sources, message.sourcesPreliminary, onSourceActivate, downloadingKey, messageTextColor, t]);
|
|
16386
17144
|
return (
|
|
16387
17145
|
/*#__PURE__*/
|
|
16388
17146
|
// `min-w-0` on the outer flex-row mirrors the same guard in the
|
|
@@ -16486,7 +17244,8 @@
|
|
|
16486
17244
|
children: formatTime(message.timestamp)
|
|
16487
17245
|
}), !isTypingMessage && !message.isProcessing && displayContent && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
|
|
16488
17246
|
content: displayContent,
|
|
16489
|
-
isDark: isDark
|
|
17247
|
+
isDark: isDark,
|
|
17248
|
+
t: t
|
|
16490
17249
|
}), allowFeedback !== false && onFeedback && !isTypingMessage && !message.isProcessing && displayContent && message.type !== 'welcome' && !message.isWelcome && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
16491
17250
|
className: "flex items-center gap-0.5 ms-0.5",
|
|
16492
17251
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
@@ -16500,7 +17259,8 @@
|
|
|
16500
17259
|
WebkitAppearance: "none",
|
|
16501
17260
|
cursor: "pointer"
|
|
16502
17261
|
},
|
|
16503
|
-
"aria-label": "
|
|
17262
|
+
"aria-label": t("like"),
|
|
17263
|
+
"aria-pressed": activeFeedback === 'like',
|
|
16504
17264
|
children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsUp, {
|
|
16505
17265
|
className: "w-3 h-3"
|
|
16506
17266
|
})
|
|
@@ -16515,7 +17275,8 @@
|
|
|
16515
17275
|
WebkitAppearance: "none",
|
|
16516
17276
|
cursor: "pointer"
|
|
16517
17277
|
},
|
|
16518
|
-
"aria-label": "
|
|
17278
|
+
"aria-label": t("dislike"),
|
|
17279
|
+
"aria-pressed": activeFeedback === 'dislike',
|
|
16519
17280
|
children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsDown, {
|
|
16520
17281
|
className: "w-3 h-3"
|
|
16521
17282
|
})
|
|
@@ -16691,7 +17452,8 @@
|
|
|
16691
17452
|
children: formatTime(message.timestamp)
|
|
16692
17453
|
}), message.content && message.content.trim() !== "" && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
|
|
16693
17454
|
content: message.content,
|
|
16694
|
-
isDark: isDark
|
|
17455
|
+
isDark: isDark,
|
|
17456
|
+
t: t
|
|
16695
17457
|
})]
|
|
16696
17458
|
}), message.status === "failed" && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
16697
17459
|
className: "flex items-center gap-1.5 mt-1 px-1",
|
|
@@ -16984,7 +17746,8 @@
|
|
|
16984
17746
|
isRtl,
|
|
16985
17747
|
onQuestionClick,
|
|
16986
17748
|
applyHoverState,
|
|
16987
|
-
headingLabel
|
|
17749
|
+
headingLabel,
|
|
17750
|
+
defaultLanguage
|
|
16988
17751
|
}) => {
|
|
16989
17752
|
const scrollRef = reactExports.useRef(null);
|
|
16990
17753
|
const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
|
|
@@ -17031,7 +17794,7 @@
|
|
|
17031
17794
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
17032
17795
|
onClick: () => scroll("left"),
|
|
17033
17796
|
disabled: !canScrollLeft,
|
|
17034
|
-
"aria-label":
|
|
17797
|
+
"aria-label": translate(defaultLanguage, "scrollLeft"),
|
|
17035
17798
|
className: "flex-shrink-0 flex items-center justify-center w-7 h-7 rounded-full shadow-sm transition-all duration-200 hover:shadow-md active:scale-95",
|
|
17036
17799
|
style: {
|
|
17037
17800
|
backgroundColor: arrowBg,
|
|
@@ -17091,7 +17854,7 @@
|
|
|
17091
17854
|
}), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
17092
17855
|
onClick: () => scroll("right"),
|
|
17093
17856
|
disabled: !canScrollRight,
|
|
17094
|
-
"aria-label":
|
|
17857
|
+
"aria-label": translate(defaultLanguage, "scrollRight"),
|
|
17095
17858
|
className: "flex-shrink-0 flex items-center justify-center w-7 h-7 rounded-full shadow-sm transition-all duration-200 hover:shadow-md active:scale-95",
|
|
17096
17859
|
style: {
|
|
17097
17860
|
backgroundColor: arrowBg,
|
|
@@ -17127,7 +17890,9 @@
|
|
|
17127
17890
|
userTextColor,
|
|
17128
17891
|
// Optional localized heading rendered above the vertical pill list,
|
|
17129
17892
|
// styled to match the inline category picker's helper-text heading.
|
|
17130
|
-
headingLabel
|
|
17893
|
+
headingLabel,
|
|
17894
|
+
// Locale for the scroll arrows' accessible names (EV-4798 MERN-21).
|
|
17895
|
+
defaultLanguage = "en"
|
|
17131
17896
|
}) => {
|
|
17132
17897
|
if (!questions.length || isTyping) {
|
|
17133
17898
|
return null;
|
|
@@ -17150,7 +17915,8 @@
|
|
|
17150
17915
|
isRtl: isRtl,
|
|
17151
17916
|
onQuestionClick: onQuestionClick,
|
|
17152
17917
|
applyHoverState: applyHoverState,
|
|
17153
|
-
headingLabel: headingLabel
|
|
17918
|
+
headingLabel: headingLabel,
|
|
17919
|
+
defaultLanguage: defaultLanguage
|
|
17154
17920
|
});
|
|
17155
17921
|
}
|
|
17156
17922
|
|
|
@@ -17627,6 +18393,47 @@
|
|
|
17627
18393
|
return result;
|
|
17628
18394
|
}
|
|
17629
18395
|
|
|
18396
|
+
/**
|
|
18397
|
+
* Framework-free A2UI core shared by the three A2uiBlock renderers - the
|
|
18398
|
+
* agent-sdk, the widget and the frontend Testing Lab (EV-4798 MERN-19).
|
|
18399
|
+
*
|
|
18400
|
+
* It owns what the renderers must agree on and that is not presentation:
|
|
18401
|
+
* - the component registry: which `type` values route to a chart and which
|
|
18402
|
+
* to a component, and how a type string is normalised;
|
|
18403
|
+
* - sanitizeChartTitle: no DB/SQL annotation reaches a visible title;
|
|
18404
|
+
* - toolConfirmationFor: the structured answer of an approval card;
|
|
18405
|
+
* - linkSegments: which spans of card text become links (every href passes
|
|
18406
|
+
* safeUrl, so a `javascript:` link stays plain text);
|
|
18407
|
+
* - matchAnsweredChoice / findNextUserAnswer: the answered state of a
|
|
18408
|
+
* one-shot card, read from conversation history.
|
|
18409
|
+
*
|
|
18410
|
+
* Each renderer keeps its own components and styling (inline SVG in the SDK,
|
|
18411
|
+
* lucide + inline styles in the widget, Tailwind + shadcn in the frontend).
|
|
18412
|
+
*
|
|
18413
|
+
* Plain JavaScript (types in a2ui.d.ts) because the widget's Rollup/Babel
|
|
18414
|
+
* build compiles no TypeScript from another package; conservative syntax
|
|
18415
|
+
* (no `??`, no `?.`) because that build does not run this file through its
|
|
18416
|
+
* Babel preset either.
|
|
18417
|
+
*/
|
|
18418
|
+
function firstDefined(a, b) {
|
|
18419
|
+
return a !== null && a !== undefined ? a : b;
|
|
18420
|
+
}
|
|
18421
|
+
|
|
18422
|
+
/**
|
|
18423
|
+
* The text of the first delivered user message after `index`, or undefined
|
|
18424
|
+
* when the assistant message at `index` has not been answered yet. A user
|
|
18425
|
+
* turn whose send failed never reached the agent, so it does not count.
|
|
18426
|
+
*/
|
|
18427
|
+
function findNextUserAnswer(messages, index) {
|
|
18428
|
+
const list = messages || [];
|
|
18429
|
+
for (let i = index + 1; i < list.length; i += 1) {
|
|
18430
|
+
const m = list[i];
|
|
18431
|
+
if (!m || m.role !== 'user' || m.sendFailed) continue;
|
|
18432
|
+
return typeof m.content === 'string' ? m.content : String(firstDefined(m.content, ''));
|
|
18433
|
+
}
|
|
18434
|
+
return undefined;
|
|
18435
|
+
}
|
|
18436
|
+
|
|
17630
18437
|
// Kept in its own tiny module (not A2uiBlock.jsx): MessageList imports it
|
|
17631
18438
|
// eagerly, and A2uiBlock/MarkdownRenderer are lazy-loaded to keep charts and
|
|
17632
18439
|
// react-markdown out of the widget's initial bundle.
|
|
@@ -17639,16 +18446,6 @@
|
|
|
17639
18446
|
// threaded through MessageBubble -> StreamingMarkdown -> MarkdownRenderer.
|
|
17640
18447
|
const A2uiAnsweredContext = /*#__PURE__*/reactExports.createContext(undefined);
|
|
17641
18448
|
|
|
17642
|
-
/** First delivered user turn after `index`, or undefined (see above). */
|
|
17643
|
-
function findNextUserAnswer(messages, index) {
|
|
17644
|
-
for (let i = index + 1; i < (messages || []).length; i += 1) {
|
|
17645
|
-
const m = messages[i];
|
|
17646
|
-
if (m?.role !== 'user' || m.sendFailed) continue;
|
|
17647
|
-
return typeof m.content === 'string' ? m.content : String(m.content ?? '');
|
|
17648
|
-
}
|
|
17649
|
-
return undefined;
|
|
17650
|
-
}
|
|
17651
|
-
|
|
17652
18449
|
const MessageList = ({
|
|
17653
18450
|
messages = [],
|
|
17654
18451
|
isDark,
|
|
@@ -18001,7 +18798,8 @@
|
|
|
18001
18798
|
resolvedUserMessageColor: resolvedUserMessageColor,
|
|
18002
18799
|
userMessageBoxColor: userMessageBoxColor,
|
|
18003
18800
|
userTextColor: userTextColor,
|
|
18004
|
-
headingLabel: quickQuestionsHeadingLabel
|
|
18801
|
+
headingLabel: quickQuestionsHeadingLabel,
|
|
18802
|
+
defaultLanguage: defaultLanguage
|
|
18005
18803
|
})
|
|
18006
18804
|
}), isVoiceSessionActive && voiceStatus === "connected" && !isLoading && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
18007
18805
|
className: "flex gap-3 flex-row-reverse animate-in",
|
|
@@ -18636,10 +19434,14 @@
|
|
|
18636
19434
|
}
|
|
18637
19435
|
return `${val.toFixed(val >= 10 ? 0 : 1)} ${units[unit]}`;
|
|
18638
19436
|
}
|
|
19437
|
+
|
|
19438
|
+
// removeLabel: the remove button's accessible name, localised by the caller
|
|
19439
|
+
// (EV-4798 MERN-21). Defaults to the English the chip always shipped.
|
|
18639
19440
|
function AttachmentChip({
|
|
18640
19441
|
attachment,
|
|
18641
19442
|
onRemove,
|
|
18642
|
-
isDark
|
|
19443
|
+
isDark,
|
|
19444
|
+
removeLabel = "Remove attachment"
|
|
18643
19445
|
}) {
|
|
18644
19446
|
const isError = attachment.status === "error";
|
|
18645
19447
|
const isUploading = attachment.status === "uploading";
|
|
@@ -18656,6 +19458,7 @@
|
|
|
18656
19458
|
color: textColor,
|
|
18657
19459
|
maxWidth: 240
|
|
18658
19460
|
},
|
|
19461
|
+
role: "group",
|
|
18659
19462
|
title: isError ? attachment.error?.message : attachment.filename,
|
|
18660
19463
|
"aria-label": statusLabel,
|
|
18661
19464
|
children: [isError ? /*#__PURE__*/jsxRuntimeExports.jsx(CircleAlert, {
|
|
@@ -18691,7 +19494,7 @@
|
|
|
18691
19494
|
color: textColor,
|
|
18692
19495
|
cursor: "pointer"
|
|
18693
19496
|
},
|
|
18694
|
-
"aria-label":
|
|
19497
|
+
"aria-label": removeLabel,
|
|
18695
19498
|
children: /*#__PURE__*/jsxRuntimeExports.jsx(X, {
|
|
18696
19499
|
size: 12
|
|
18697
19500
|
})
|
|
@@ -19233,7 +20036,8 @@
|
|
|
19233
20036
|
children: attachments.map(att => /*#__PURE__*/jsxRuntimeExports.jsx(AttachmentChip, {
|
|
19234
20037
|
attachment: att,
|
|
19235
20038
|
onRemove: removeAttachment,
|
|
19236
|
-
isDark: isDark
|
|
20039
|
+
isDark: isDark,
|
|
20040
|
+
removeLabel: t("removeAttachment")
|
|
19237
20041
|
}, att.id))
|
|
19238
20042
|
}), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
19239
20043
|
className: "flex items-center px-5 gap-1.5",
|
|
@@ -19594,6 +20398,80 @@
|
|
|
19594
20398
|
};
|
|
19595
20399
|
}
|
|
19596
20400
|
|
|
20401
|
+
/**
|
|
20402
|
+
* Keyboard helpers for the widget's menus and custom controls
|
|
20403
|
+
* (EV-4798, MERN-21).
|
|
20404
|
+
*
|
|
20405
|
+
* The widget renders inside a Shadow DOM, where `document.activeElement`
|
|
20406
|
+
* resolves to the shadow host rather than the focused control. Every helper
|
|
20407
|
+
* here therefore asks the container's own root node (the shadow root inside
|
|
20408
|
+
* the widget, the document elsewhere) which element has focus.
|
|
20409
|
+
*/
|
|
20410
|
+
|
|
20411
|
+
const MENU_ITEM_SELECTOR = '[role="menuitem"]';
|
|
20412
|
+
|
|
20413
|
+
/** The focused element in the tree that holds `container`. */
|
|
20414
|
+
function activeElementIn(container) {
|
|
20415
|
+
const root = container && typeof container.getRootNode === "function" ? container.getRootNode() : null;
|
|
20416
|
+
return root && root.activeElement || document.activeElement;
|
|
20417
|
+
}
|
|
20418
|
+
function menuItems(container, selector) {
|
|
20419
|
+
if (!container) return [];
|
|
20420
|
+
return Array.from(container.querySelectorAll(selector)).filter(el => !el.disabled && el.getAttribute("aria-disabled") !== "true");
|
|
20421
|
+
}
|
|
20422
|
+
|
|
20423
|
+
/**
|
|
20424
|
+
* Arrow-key navigation for a `role="menu"`: ArrowDown / ArrowUp move to the
|
|
20425
|
+
* next / previous item (wrapping), Home / End jump to the first / last.
|
|
20426
|
+
* Returns true when the key was handled so the caller can stop there.
|
|
20427
|
+
*/
|
|
20428
|
+
function handleMenuArrowKeys(event, container, selector = MENU_ITEM_SELECTOR) {
|
|
20429
|
+
const {
|
|
20430
|
+
key
|
|
20431
|
+
} = event;
|
|
20432
|
+
if (key !== "ArrowDown" && key !== "ArrowUp" && key !== "Home" && key !== "End") {
|
|
20433
|
+
return false;
|
|
20434
|
+
}
|
|
20435
|
+
const items = menuItems(container, selector);
|
|
20436
|
+
if (items.length === 0) return false;
|
|
20437
|
+
event.preventDefault();
|
|
20438
|
+
const index = items.indexOf(activeElementIn(container));
|
|
20439
|
+
let next;
|
|
20440
|
+
if (key === "Home") next = 0;else if (key === "End") next = items.length - 1;else if (key === "ArrowDown") next = index < 0 ? 0 : (index + 1) % items.length;else next = index < 0 ? items.length - 1 : (index - 1 + items.length) % items.length;
|
|
20441
|
+
items[next].focus();
|
|
20442
|
+
return true;
|
|
20443
|
+
}
|
|
20444
|
+
|
|
20445
|
+
/**
|
|
20446
|
+
* Keep Tab inside an open menu: Tab on the last item wraps to the first,
|
|
20447
|
+
* Shift+Tab on the first wraps to the last. Returns true when it moved focus.
|
|
20448
|
+
*/
|
|
20449
|
+
function trapMenuTab(event, container, selector = MENU_ITEM_SELECTOR) {
|
|
20450
|
+
if (event.key !== "Tab") return false;
|
|
20451
|
+
const items = menuItems(container, selector);
|
|
20452
|
+
if (items.length === 0) return false;
|
|
20453
|
+
const first = items[0];
|
|
20454
|
+
const last = items[items.length - 1];
|
|
20455
|
+
const active = activeElementIn(container);
|
|
20456
|
+
if (event.shiftKey && active === first) {
|
|
20457
|
+
event.preventDefault();
|
|
20458
|
+
last.focus();
|
|
20459
|
+
return true;
|
|
20460
|
+
}
|
|
20461
|
+
if (!event.shiftKey && active === last) {
|
|
20462
|
+
event.preventDefault();
|
|
20463
|
+
first.focus();
|
|
20464
|
+
return true;
|
|
20465
|
+
}
|
|
20466
|
+
return false;
|
|
20467
|
+
}
|
|
20468
|
+
|
|
20469
|
+
/** Focus the first item of a menu container, if it has one. */
|
|
20470
|
+
function focusFirstMenuItem(container, selector = MENU_ITEM_SELECTOR) {
|
|
20471
|
+
const [first] = menuItems(container, selector);
|
|
20472
|
+
first?.focus();
|
|
20473
|
+
}
|
|
20474
|
+
|
|
19597
20475
|
const ChatHeader = ({
|
|
19598
20476
|
conciergeName,
|
|
19599
20477
|
companyName,
|
|
@@ -19770,7 +20648,11 @@
|
|
|
19770
20648
|
})
|
|
19771
20649
|
}), showMenu && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
19772
20650
|
role: "menu",
|
|
19773
|
-
"aria-label": t("menu")
|
|
20651
|
+
"aria-label": t("menu")
|
|
20652
|
+
// EV-4798 (MERN-21): a menu container must be focusable to
|
|
20653
|
+
// carry its keyboard handling; -1 keeps it out of the Tab order.
|
|
20654
|
+
,
|
|
20655
|
+
tabIndex: -1,
|
|
19774
20656
|
dir: isRtl ? "rtl" : "ltr",
|
|
19775
20657
|
onKeyDown: event => {
|
|
19776
20658
|
if (event.key === "Escape") {
|
|
@@ -19778,26 +20660,18 @@
|
|
|
19778
20660
|
setShowMenu(false);
|
|
19779
20661
|
return;
|
|
19780
20662
|
}
|
|
20663
|
+
// EV-4798 (MERN-21): Arrow Up/Down, Home and End move between
|
|
20664
|
+
// the items, as a role="menu" promises assistive tech.
|
|
20665
|
+
if (handleMenuArrowKeys(event, menuRef.current)) return;
|
|
19781
20666
|
// EV-3332: keep Tab focus inside the open menu. Focus enters on
|
|
19782
20667
|
// open and returns to the trigger on close (effect above), but
|
|
19783
20668
|
// without this a Tab from the last item / Shift+Tab from the
|
|
19784
20669
|
// first escaped into the page behind the menu - the gap QA
|
|
19785
20670
|
// flagged (a real trap already exists on CitationPill; the
|
|
19786
20671
|
// header menu had Escape-only). Cycle within the menuitems.
|
|
19787
|
-
|
|
19788
|
-
|
|
19789
|
-
|
|
19790
|
-
const first = items[0];
|
|
19791
|
-
const last = items[items.length - 1];
|
|
19792
|
-
const active = document.activeElement;
|
|
19793
|
-
if (event.shiftKey && active === first) {
|
|
19794
|
-
event.preventDefault();
|
|
19795
|
-
last.focus();
|
|
19796
|
-
} else if (!event.shiftKey && active === last) {
|
|
19797
|
-
event.preventDefault();
|
|
19798
|
-
first.focus();
|
|
19799
|
-
}
|
|
19800
|
-
}
|
|
20672
|
+
// The focused item is read from the menu's own root node, so
|
|
20673
|
+
// the trap also works inside the widget's Shadow DOM.
|
|
20674
|
+
trapMenuTab(event, menuRef.current);
|
|
19801
20675
|
},
|
|
19802
20676
|
className: `absolute top-full mt-1 w-44 rounded-xl border shadow-lg py-1 z-[9999] animate-in fade-in slide-in-from-top-1 duration-150 ${isRtl ? "left-0" : "right-0"} ${isDark ? "bg-gray-800 border-gray-700" : "bg-white border-gray-200"}`,
|
|
19803
20677
|
style: {
|
|
@@ -20088,8 +20962,10 @@
|
|
|
20088
20962
|
isDark = false,
|
|
20089
20963
|
primaryColor = "#2563eb",
|
|
20090
20964
|
fontFamily = "Inter",
|
|
20091
|
-
isRtl = false
|
|
20965
|
+
isRtl = false,
|
|
20966
|
+
defaultLanguage = "en"
|
|
20092
20967
|
}) => {
|
|
20968
|
+
const t = reactExports.useMemo(() => createTranslator(defaultLanguage), [defaultLanguage]);
|
|
20093
20969
|
const scrollRef = reactExports.useRef(null);
|
|
20094
20970
|
const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
|
|
20095
20971
|
const [canScrollRight, setCanScrollRight] = reactExports.useState(false);
|
|
@@ -20136,12 +21012,12 @@
|
|
|
20136
21012
|
direction: isRtl ? "rtl" : "ltr"
|
|
20137
21013
|
},
|
|
20138
21014
|
role: "region",
|
|
20139
|
-
"aria-label": "
|
|
21015
|
+
"aria-label": t("filterByCategory"),
|
|
20140
21016
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
20141
21017
|
type: "button",
|
|
20142
21018
|
onClick: () => scroll("left"),
|
|
20143
21019
|
disabled: !canScrollLeft,
|
|
20144
|
-
"aria-label": "
|
|
21020
|
+
"aria-label": t("scrollCategoriesLeft"),
|
|
20145
21021
|
className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
|
|
20146
21022
|
style: {
|
|
20147
21023
|
backgroundColor: arrowBg,
|
|
@@ -20185,7 +21061,7 @@
|
|
|
20185
21061
|
type: "button",
|
|
20186
21062
|
onClick: () => scroll("right"),
|
|
20187
21063
|
disabled: !canScrollRight,
|
|
20188
|
-
"aria-label": "
|
|
21064
|
+
"aria-label": t("scrollCategoriesRight"),
|
|
20189
21065
|
className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
|
|
20190
21066
|
style: {
|
|
20191
21067
|
backgroundColor: arrowBg,
|
|
@@ -20222,7 +21098,9 @@
|
|
|
20222
21098
|
fontFamily = "Inter",
|
|
20223
21099
|
fontSize = "14px",
|
|
20224
21100
|
isRtl = false,
|
|
20225
|
-
label = "Choose a topic to get started:"
|
|
21101
|
+
label = "Choose a topic to get started:",
|
|
21102
|
+
// Accessible name of the region; the caller passes the localised one.
|
|
21103
|
+
regionLabel = "Category filter"
|
|
20226
21104
|
}) => {
|
|
20227
21105
|
if (!Array.isArray(categories) || categories.length === 0) return null;
|
|
20228
21106
|
const helperColor = isDark ? "#9ca3af" : "#6b7280";
|
|
@@ -20234,7 +21112,7 @@
|
|
|
20234
21112
|
paddingRight: isRtl ? 50 : undefined
|
|
20235
21113
|
},
|
|
20236
21114
|
role: "region",
|
|
20237
|
-
"aria-label":
|
|
21115
|
+
"aria-label": regionLabel,
|
|
20238
21116
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
20239
21117
|
className: "mb-2",
|
|
20240
21118
|
style: {
|
|
@@ -20422,7 +21300,10 @@
|
|
|
20422
21300
|
children: ratings.map(rating => /*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
20423
21301
|
onClick: () => handleRating(rating.value),
|
|
20424
21302
|
disabled: disabled || isSubmitting,
|
|
20425
|
-
className: cn("flex items-center justify-center text-2xl transition-transform", "bg-transparent border-0 p-0 cursor-pointer", "hover:scale-110 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed", "focus:outline-none focus:ring-0",
|
|
21303
|
+
className: cn("flex items-center justify-center text-2xl transition-transform", "bg-transparent border-0 p-0 cursor-pointer", "hover:scale-110 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed", "focus:outline-none focus:ring-0",
|
|
21304
|
+
// EV-4798 (MERN-21): keyboard focus stays visible; the
|
|
21305
|
+
// mouse-focus reset above is unchanged.
|
|
21306
|
+
"rounded-md focus-visible:ring-2 focus-visible:ring-blue-700", selectedRating === rating.value ? "" : "opacity-80"),
|
|
20426
21307
|
children: /*#__PURE__*/jsxRuntimeExports.jsx("span", {
|
|
20427
21308
|
role: "img",
|
|
20428
21309
|
"aria-label": `${t("rate")} ${rating.value}`,
|
|
@@ -20471,7 +21352,9 @@
|
|
|
20471
21352
|
onClick: () => handleRating(rating.value),
|
|
20472
21353
|
onMouseEnter: () => setHoveredStar(rating.value),
|
|
20473
21354
|
disabled: disabled || isSubmitting,
|
|
20474
|
-
className: cn("flex items-center justify-center text-2xl", "bg-transparent border-0 p-0 cursor-pointer focus:outline-none",
|
|
21355
|
+
className: cn("flex items-center justify-center text-2xl", "bg-transparent border-0 p-0 cursor-pointer focus:outline-none",
|
|
21356
|
+
// EV-4798 (MERN-21): visible keyboard focus.
|
|
21357
|
+
"rounded-md focus-visible:ring-2 focus-visible:ring-blue-700", "disabled:opacity-50 disabled:cursor-not-allowed"),
|
|
20475
21358
|
style: {
|
|
20476
21359
|
transform: isHovered ? "scale(1.25)" : "scale(1)",
|
|
20477
21360
|
filter: isHovered ? "brightness(1.1) drop-shadow(0 2px 4px rgba(0,0,0,0.15))" : "none",
|
|
@@ -20829,7 +21712,14 @@
|
|
|
20829
21712
|
if (prompt && typeof prompt === "object") {
|
|
20830
21713
|
reportChipClick(text, prompt, index);
|
|
20831
21714
|
}
|
|
20832
|
-
|
|
21715
|
+
// EV-4798 MERN-12: an approval card's pick arrives as
|
|
21716
|
+
// (value, label, { toolConfirmation }) from A2uiBlock's Confirmation.
|
|
21717
|
+
// The structured answer rides on the send; the text is still the
|
|
21718
|
+
// message. A host override (onPromptSuggestionClick) keeps the text.
|
|
21719
|
+
const toolConfirmation = index && typeof index === "object" && index.toolConfirmation ? index.toolConfirmation : null;
|
|
21720
|
+
if (onPromptSuggestionClick) onPromptSuggestionClick(text);else if (toolConfirmation) onDirectSend?.(text, undefined, {
|
|
21721
|
+
toolConfirmation
|
|
21722
|
+
});else onDirectSend?.(text);
|
|
20833
21723
|
}, [onPromptSuggestionClick, onDirectSend, reportChipClick]);
|
|
20834
21724
|
|
|
20835
21725
|
// ─── Resizable widget ────────────────────────────────────────────
|
|
@@ -21375,7 +22265,9 @@
|
|
|
21375
22265
|
onClick: handleResolveSubmission,
|
|
21376
22266
|
disabled: resolveRating === 0 || isSubmittingResolve,
|
|
21377
22267
|
"aria-describedby": resolveRating === 0 ? "resolve-rating-hint" : undefined,
|
|
21378
|
-
className: cn("w-full py-3.5 rounded-xl text-sm font-semibold [font-family:inherit] transition-all duration-200 border-none outline-none focus:outline-none active:outline-none focus:ring-0 active:ring-0", "disabled:opacity-50 disabled:cursor-not-allowed",
|
|
22268
|
+
className: cn("w-full py-3.5 rounded-xl text-sm font-semibold [font-family:inherit] transition-all duration-200 border-none outline-none focus:outline-none active:outline-none focus:ring-0 active:ring-0", "disabled:opacity-50 disabled:cursor-not-allowed",
|
|
22269
|
+
// EV-4798 (MERN-21): keyboard focus stays visible.
|
|
22270
|
+
"focus-visible:ring-2 focus-visible:ring-blue-700", isDark ? "bg-gray-700 text-gray-100 hover:bg-gray-600" : "bg-gray-100 text-gray-700 hover:bg-gray-200"),
|
|
21379
22271
|
children: isSubmittingResolve ? t("submitting") : t("submitFeedback")
|
|
21380
22272
|
}), resolveRating === 0 && !isSubmittingResolve && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
21381
22273
|
id: "resolve-rating-hint",
|
|
@@ -21465,7 +22357,8 @@
|
|
|
21465
22357
|
isDark: isDark,
|
|
21466
22358
|
primaryColor: primaryColor,
|
|
21467
22359
|
fontFamily: fontFamily,
|
|
21468
|
-
isRtl: isRtlLanguage
|
|
22360
|
+
isRtl: isRtlLanguage,
|
|
22361
|
+
defaultLanguage: defaultLanguage
|
|
21469
22362
|
}), !isMinimized && /*#__PURE__*/jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
|
21470
22363
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
21471
22364
|
ref: messagesContainerRef,
|
|
@@ -21545,7 +22438,8 @@
|
|
|
21545
22438
|
fontFamily: fontFamily,
|
|
21546
22439
|
fontSize: fontSize,
|
|
21547
22440
|
isRtl: isRtlLanguage,
|
|
21548
|
-
label: t("chooseTopicLabel")
|
|
22441
|
+
label: t("chooseTopicLabel"),
|
|
22442
|
+
regionLabel: t("categoryFilter")
|
|
21549
22443
|
}) : null,
|
|
21550
22444
|
quickQuestionsHeadingLabel: filterEnabled ? t("quickQuestionsHeadingLabel") : undefined
|
|
21551
22445
|
}), (showCsat && csatEnabled || csatRequest) && !csatSubmitted && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
@@ -21739,12 +22633,20 @@
|
|
|
21739
22633
|
};
|
|
21740
22634
|
}
|
|
21741
22635
|
|
|
21742
|
-
|
|
21743
|
-
|
|
21744
|
-
|
|
21745
|
-
|
|
21746
|
-
|
|
21747
|
-
|
|
22636
|
+
/**
|
|
22637
|
+
* EV-4233: multi-channel entry point, shared by the widget and the agent-sdk
|
|
22638
|
+
* (EV-4798 MERN-19). An operator can list other channels (WhatsApp,
|
|
22639
|
+
* Telegram, Messenger, Instagram) next to the in-widget chat; the launcher
|
|
22640
|
+
* then opens a small picker instead of the chat panel directly.
|
|
22641
|
+
*
|
|
22642
|
+
* Only https deep links on each channel's own host are accepted, so a
|
|
22643
|
+
* misconfigured or injected value cannot turn the launcher into an open
|
|
22644
|
+
* redirect to an arbitrary site. One copy, so a tightened host list reaches
|
|
22645
|
+
* both surfaces.
|
|
22646
|
+
*
|
|
22647
|
+
* Plain JavaScript (types in channelLinks.d.ts), conservative syntax: the
|
|
22648
|
+
* widget's Rollup/Babel build compiles neither TypeScript nor this file.
|
|
22649
|
+
*/
|
|
21748
22650
|
|
|
21749
22651
|
const CHANNEL_HOSTS = {
|
|
21750
22652
|
whatsapp: ['wa.me', 'api.whatsapp.com'],
|
|
@@ -21761,20 +22663,21 @@
|
|
|
21761
22663
|
function normalizeChannelLinks(links) {
|
|
21762
22664
|
if (!Array.isArray(links)) return [];
|
|
21763
22665
|
const out = [];
|
|
21764
|
-
for (
|
|
22666
|
+
for (let i = 0; i < links.length; i += 1) {
|
|
22667
|
+
const link = links[i];
|
|
21765
22668
|
if (!link || typeof link !== 'object') continue;
|
|
21766
22669
|
const type = typeof link.type === 'string' ? link.type.toLowerCase() : '';
|
|
21767
|
-
const hosts = CHANNEL_HOSTS[type];
|
|
22670
|
+
const hosts = Object.prototype.hasOwnProperty.call(CHANNEL_HOSTS, type) ? CHANNEL_HOSTS[type] : undefined;
|
|
21768
22671
|
if (!hosts || typeof link.url !== 'string') continue;
|
|
21769
22672
|
let parsed;
|
|
21770
22673
|
try {
|
|
21771
22674
|
parsed = new URL(link.url);
|
|
21772
|
-
} catch {
|
|
22675
|
+
} catch (e) {
|
|
21773
22676
|
continue;
|
|
21774
22677
|
}
|
|
21775
|
-
if (parsed.protocol !== 'https:' ||
|
|
22678
|
+
if (parsed.protocol !== 'https:' || hosts.indexOf(parsed.hostname.toLowerCase()) === -1) continue;
|
|
21776
22679
|
out.push({
|
|
21777
|
-
type,
|
|
22680
|
+
type: type,
|
|
21778
22681
|
url: parsed.toString(),
|
|
21779
22682
|
label: typeof link.label === 'string' && link.label.trim() ? link.label.trim() : CHANNEL_LABELS[type]
|
|
21780
22683
|
});
|
|
@@ -21799,6 +22702,30 @@
|
|
|
21799
22702
|
const links = reactExports.useMemo(() => normalizeChannelLinks(channelLinks), [channelLinks]);
|
|
21800
22703
|
const [pickerOpen, setPickerOpen] = reactExports.useState(false);
|
|
21801
22704
|
const hasPicker = links.length > 0;
|
|
22705
|
+
|
|
22706
|
+
// EV-4798 (MERN-21): keyboard support for the channel picker menu. Focus
|
|
22707
|
+
// moves to the first option when it opens, Escape closes it and returns
|
|
22708
|
+
// focus to the launcher, and the arrow keys move between options. The
|
|
22709
|
+
// launcher ref is kept locally as well as forwarded to the caller.
|
|
22710
|
+
const pickerRef = reactExports.useRef(null);
|
|
22711
|
+
const launcherRef = reactExports.useRef(null);
|
|
22712
|
+
const setLauncherRef = reactExports.useCallback(node => {
|
|
22713
|
+
launcherRef.current = node;
|
|
22714
|
+
if (typeof ref === "function") ref(node);else if (ref) ref.current = node;
|
|
22715
|
+
}, [ref]);
|
|
22716
|
+
const pickerVisible = hasPicker && pickerOpen && !isOpen;
|
|
22717
|
+
reactExports.useEffect(() => {
|
|
22718
|
+
if (pickerVisible) focusFirstMenuItem(pickerRef.current);
|
|
22719
|
+
}, [pickerVisible]);
|
|
22720
|
+
const handlePickerKeyDown = event => {
|
|
22721
|
+
if (event.key === "Escape") {
|
|
22722
|
+
event.preventDefault();
|
|
22723
|
+
setPickerOpen(false);
|
|
22724
|
+
launcherRef.current?.focus();
|
|
22725
|
+
return;
|
|
22726
|
+
}
|
|
22727
|
+
handleMenuArrowKeys(event, pickerRef.current);
|
|
22728
|
+
};
|
|
21802
22729
|
const launcherBg = primaryColor;
|
|
21803
22730
|
const iconColor = headerTextColor || "#FFFFFF";
|
|
21804
22731
|
const handleLauncherClick = () => {
|
|
@@ -21827,9 +22754,12 @@
|
|
|
21827
22754
|
};
|
|
21828
22755
|
return /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
21829
22756
|
className: `relative ${className || ""}`,
|
|
21830
|
-
children: [
|
|
22757
|
+
children: [pickerVisible && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
22758
|
+
ref: pickerRef,
|
|
21831
22759
|
role: "menu",
|
|
21832
22760
|
"aria-label": t("chooseChannel"),
|
|
22761
|
+
tabIndex: -1,
|
|
22762
|
+
onKeyDown: handlePickerKeyDown,
|
|
21833
22763
|
"data-testid": "channel-picker",
|
|
21834
22764
|
style: {
|
|
21835
22765
|
position: "absolute",
|
|
@@ -21858,7 +22788,7 @@
|
|
|
21858
22788
|
children: link.label
|
|
21859
22789
|
}, `${link.type}-${link.url}`))]
|
|
21860
22790
|
}), /*#__PURE__*/jsxRuntimeExports.jsxs("button", {
|
|
21861
|
-
ref:
|
|
22791
|
+
ref: setLauncherRef,
|
|
21862
22792
|
onClick: handleLauncherClick,
|
|
21863
22793
|
className: "group relative w-16 h-16 rounded-full shadow-2xl transition-all duration-300 flex items-center justify-center text-white overflow-hidden hover:scale-110",
|
|
21864
22794
|
style: {
|
|
@@ -21903,7 +22833,7 @@
|
|
|
21903
22833
|
* value by its own test (that constant sat at 0.1.113 while this package was
|
|
21904
22834
|
* at 0.2.2 precisely because nothing enforced it - EV-2431).
|
|
21905
22835
|
*/
|
|
21906
|
-
const WIDGET_VERSION = '0.2.
|
|
22836
|
+
const WIDGET_VERSION = '0.2.29';
|
|
21907
22837
|
|
|
21908
22838
|
/**
|
|
21909
22839
|
* API utility functions
|