@eshal-bot/chat-widget 0.2.28 → 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-DoWoY9R7.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 +1135 -245
- 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-BPiJscyi.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,11 +9024,89 @@
|
|
|
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
|
+
}
|
|
9107
9032
|
};
|
|
9108
9033
|
}
|
|
9034
|
+
const INT16_MAX = 0x7fff;
|
|
9035
|
+
|
|
9036
|
+
/** Float32 worklet samples (-1..1) to a 16-bit PCM ArrayBuffer. */
|
|
9037
|
+
function convertFloat32ToPCM(float32Array) {
|
|
9038
|
+
const pcm16 = new Int16Array(float32Array.length);
|
|
9039
|
+
for (let i = 0; i < float32Array.length; i += 1) {
|
|
9040
|
+
pcm16[i] = Math.max(-1, Math.min(1, float32Array[i])) * INT16_MAX;
|
|
9041
|
+
}
|
|
9042
|
+
return pcm16.buffer;
|
|
9043
|
+
}
|
|
9044
|
+
|
|
9045
|
+
/** Stop every track of a microphone stream; a no-op without one. */
|
|
9046
|
+
function stopMicrophone(stream) {
|
|
9047
|
+
if (!stream) return;
|
|
9048
|
+
stream.getTracks().forEach(function (track) {
|
|
9049
|
+
track.stop();
|
|
9050
|
+
});
|
|
9051
|
+
}
|
|
9052
|
+
|
|
9053
|
+
/**
|
|
9054
|
+
* Bootstraps the PCM recorder audio worklet, captures mic audio at 16kHz
|
|
9055
|
+
* mono, and forwards buffers through the provided handler.
|
|
9056
|
+
*/
|
|
9057
|
+
async function startAudioRecorderWorklet(onPcmChunk) {
|
|
9058
|
+
if (typeof window === 'undefined') {
|
|
9059
|
+
throw new Error('Audio recorder can only run in the browser');
|
|
9060
|
+
}
|
|
9061
|
+
const audioRecorderContext = new AudioContext({
|
|
9062
|
+
sampleRate: 16000
|
|
9063
|
+
});
|
|
9064
|
+
|
|
9065
|
+
// Use inline worklet code with Blob URL (works reliably with all bundlers)
|
|
9066
|
+
// This approach is more compatible than using import.meta.url which may not resolve
|
|
9067
|
+
// correctly in bundled builds (especially with Rollup)
|
|
9068
|
+
const workletCode = `
|
|
9069
|
+
class PCMRecorderProcessor extends AudioWorkletProcessor {
|
|
9070
|
+
process(inputs) {
|
|
9071
|
+
if (!inputs.length || !inputs[0].length) {
|
|
9072
|
+
return true;
|
|
9073
|
+
}
|
|
9074
|
+
const inputChannel = inputs[0][0];
|
|
9075
|
+
this.port.postMessage(new Float32Array(inputChannel));
|
|
9076
|
+
return true;
|
|
9077
|
+
}
|
|
9078
|
+
}
|
|
9079
|
+
registerProcessor('pcm-recorder-processor', PCMRecorderProcessor);
|
|
9080
|
+
`;
|
|
9081
|
+
const blob = new Blob([workletCode], {
|
|
9082
|
+
type: 'application/javascript'
|
|
9083
|
+
});
|
|
9084
|
+
const workletUrl = URL.createObjectURL(blob);
|
|
9085
|
+
await audioRecorderContext.audioWorklet.addModule(workletUrl);
|
|
9086
|
+
|
|
9087
|
+
// Clean up the Blob URL after the worklet is loaded
|
|
9088
|
+
URL.revokeObjectURL(workletUrl);
|
|
9089
|
+
|
|
9090
|
+
// The reply plays through the speakers while the mic is open: without echo
|
|
9091
|
+
// cancellation it comes back in, and the voice gate takes it for the caller
|
|
9092
|
+
// barging in (dev, 16 Oct 2026).
|
|
9093
|
+
const micStream = await navigator.mediaDevices.getUserMedia({
|
|
9094
|
+
audio: {
|
|
9095
|
+
channelCount: 1,
|
|
9096
|
+
echoCancellation: true,
|
|
9097
|
+
noiseSuppression: true,
|
|
9098
|
+
autoGainControl: true
|
|
9099
|
+
}
|
|
9100
|
+
});
|
|
9101
|
+
const source = audioRecorderContext.createMediaStreamSource(micStream);
|
|
9102
|
+
const audioRecorderNode = new AudioWorkletNode(audioRecorderContext, 'pcm-recorder-processor');
|
|
9103
|
+
audioRecorderNode.port.onmessage = event => {
|
|
9104
|
+
const pcmData = convertFloat32ToPCM(event.data);
|
|
9105
|
+
onPcmChunk(pcmData);
|
|
9106
|
+
};
|
|
9107
|
+
source.connect(audioRecorderNode);
|
|
9108
|
+
return [audioRecorderNode, audioRecorderContext, micStream];
|
|
9109
|
+
}
|
|
9109
9110
|
|
|
9110
9111
|
/**
|
|
9111
9112
|
* What becomes of a reply's audio when the caller may be speaking over it.
|
|
@@ -11114,6 +11115,689 @@
|
|
|
11114
11115
|
allowMicAccess: "Cho phép truy cập micrô"
|
|
11115
11116
|
}
|
|
11116
11117
|
};
|
|
11118
|
+
|
|
11119
|
+
// EV-4798 (MERN-21): accessible names for icon-only controls and labelled
|
|
11120
|
+
// regions that used to be hardcoded English. Kept as its own table, like
|
|
11121
|
+
// ONBOARDING_PLACEHOLDERS below, so every supported locale carries the full
|
|
11122
|
+
// set in one place. translate() reads it after the locale's main dictionary
|
|
11123
|
+
// and before the English fallback. `{count}` is substituted at the call site.
|
|
11124
|
+
const A11Y_LABELS = {
|
|
11125
|
+
en: {
|
|
11126
|
+
removeAttachment: "Remove attachment",
|
|
11127
|
+
categoryFilter: "Category filter",
|
|
11128
|
+
filterByCategory: "Filter by category",
|
|
11129
|
+
scrollCategoriesLeft: "Scroll categories left",
|
|
11130
|
+
scrollCategoriesRight: "Scroll categories right",
|
|
11131
|
+
scrollTagsLeft: "Scroll tags left",
|
|
11132
|
+
scrollTagsRight: "Scroll tags right",
|
|
11133
|
+
copyMessage: "Copy message",
|
|
11134
|
+
copied: "Copied",
|
|
11135
|
+
like: "Like",
|
|
11136
|
+
dislike: "Dislike",
|
|
11137
|
+
sourcesCited: "{count} sources cited",
|
|
11138
|
+
moreSources: "+{count} more"
|
|
11139
|
+
},
|
|
11140
|
+
ar: {
|
|
11141
|
+
removeAttachment: "إزالة المرفق",
|
|
11142
|
+
categoryFilter: "تصفية الفئات",
|
|
11143
|
+
filterByCategory: "التصفية حسب الفئة",
|
|
11144
|
+
scrollCategoriesLeft: "تمرير الفئات لليسار",
|
|
11145
|
+
scrollCategoriesRight: "تمرير الفئات لليمين",
|
|
11146
|
+
scrollTagsLeft: "تمرير الوسوم لليسار",
|
|
11147
|
+
scrollTagsRight: "تمرير الوسوم لليمين",
|
|
11148
|
+
copyMessage: "نسخ الرسالة",
|
|
11149
|
+
copied: "تم النسخ",
|
|
11150
|
+
like: "أعجبني",
|
|
11151
|
+
dislike: "لم يعجبني",
|
|
11152
|
+
sourcesCited: "{count} مصادر مستشهد بها",
|
|
11153
|
+
moreSources: "+{count} أخرى"
|
|
11154
|
+
},
|
|
11155
|
+
es: {
|
|
11156
|
+
removeAttachment: "Quitar archivo adjunto",
|
|
11157
|
+
categoryFilter: "Filtro de categoría",
|
|
11158
|
+
filterByCategory: "Filtrar por categoría",
|
|
11159
|
+
scrollCategoriesLeft: "Desplazar categorías a la izquierda",
|
|
11160
|
+
scrollCategoriesRight: "Desplazar categorías a la derecha",
|
|
11161
|
+
scrollTagsLeft: "Desplazar etiquetas a la izquierda",
|
|
11162
|
+
scrollTagsRight: "Desplazar etiquetas a la derecha",
|
|
11163
|
+
copyMessage: "Copiar mensaje",
|
|
11164
|
+
copied: "Copiado",
|
|
11165
|
+
like: "Me gusta",
|
|
11166
|
+
dislike: "No me gusta",
|
|
11167
|
+
sourcesCited: "{count} fuentes citadas",
|
|
11168
|
+
moreSources: "+{count} más"
|
|
11169
|
+
},
|
|
11170
|
+
be: {
|
|
11171
|
+
removeAttachment: "Выдаліць улажэнне",
|
|
11172
|
+
categoryFilter: "Фільтр катэгорый",
|
|
11173
|
+
filterByCategory: "Фільтраваць па катэгорыі",
|
|
11174
|
+
scrollCategoriesLeft: "Пракруціць катэгорыі ўлева",
|
|
11175
|
+
scrollCategoriesRight: "Пракруціць катэгорыі ўправа",
|
|
11176
|
+
scrollTagsLeft: "Пракруціць тэгі ўлева",
|
|
11177
|
+
scrollTagsRight: "Пракруціць тэгі ўправа",
|
|
11178
|
+
copyMessage: "Капіраваць паведамленне",
|
|
11179
|
+
copied: "Скапіравана",
|
|
11180
|
+
like: "Падабаецца",
|
|
11181
|
+
dislike: "Не падабаецца",
|
|
11182
|
+
sourcesCited: "Цытаваныя крыніцы: {count}",
|
|
11183
|
+
moreSources: "+{count} яшчэ"
|
|
11184
|
+
},
|
|
11185
|
+
bs: {
|
|
11186
|
+
removeAttachment: "Ukloni prilog",
|
|
11187
|
+
categoryFilter: "Filter kategorija",
|
|
11188
|
+
filterByCategory: "Filtriraj po kategoriji",
|
|
11189
|
+
scrollCategoriesLeft: "Pomjeri kategorije lijevo",
|
|
11190
|
+
scrollCategoriesRight: "Pomjeri kategorije desno",
|
|
11191
|
+
scrollTagsLeft: "Pomjeri oznake lijevo",
|
|
11192
|
+
scrollTagsRight: "Pomjeri oznake desno",
|
|
11193
|
+
copyMessage: "Kopiraj poruku",
|
|
11194
|
+
copied: "Kopirano",
|
|
11195
|
+
like: "Sviđa mi se",
|
|
11196
|
+
dislike: "Ne sviđa mi se",
|
|
11197
|
+
sourcesCited: "Citirani izvori: {count}",
|
|
11198
|
+
moreSources: "+{count} više"
|
|
11199
|
+
},
|
|
11200
|
+
bg: {
|
|
11201
|
+
removeAttachment: "Премахване на прикачения файл",
|
|
11202
|
+
categoryFilter: "Филтър по категория",
|
|
11203
|
+
filterByCategory: "Филтриране по категория",
|
|
11204
|
+
scrollCategoriesLeft: "Превъртане на категориите наляво",
|
|
11205
|
+
scrollCategoriesRight: "Превъртане на категориите надясно",
|
|
11206
|
+
scrollTagsLeft: "Превъртане на етикетите наляво",
|
|
11207
|
+
scrollTagsRight: "Превъртане на етикетите надясно",
|
|
11208
|
+
copyMessage: "Копиране на съобщението",
|
|
11209
|
+
copied: "Копирано",
|
|
11210
|
+
like: "Харесва ми",
|
|
11211
|
+
dislike: "Не ми харесва",
|
|
11212
|
+
sourcesCited: "Цитирани източници: {count}",
|
|
11213
|
+
moreSources: "+{count} още"
|
|
11214
|
+
},
|
|
11215
|
+
my: {
|
|
11216
|
+
removeAttachment: "ပူးတွဲဖိုင်ကို ဖယ်ရှားပါ",
|
|
11217
|
+
categoryFilter: "အမျိုးအစား စစ်ထုတ်မှု",
|
|
11218
|
+
filterByCategory: "အမျိုးအစားအလိုက် စစ်ထုတ်ပါ",
|
|
11219
|
+
scrollCategoriesLeft: "အမျိုးအစားများကို ဘယ်ဘက်သို့ ရွှေ့ပါ",
|
|
11220
|
+
scrollCategoriesRight: "အမျိုးအစားများကို ညာဘက်သို့ ရွှေ့ပါ",
|
|
11221
|
+
scrollTagsLeft: "တဂ်များကို ဘယ်ဘက်သို့ ရွှေ့ပါ",
|
|
11222
|
+
scrollTagsRight: "တဂ်များကို ညာဘက်သို့ ရွှေ့ပါ",
|
|
11223
|
+
copyMessage: "မက်ဆေ့ချ်ကို ကူးယူပါ",
|
|
11224
|
+
copied: "ကူးယူပြီးပါပြီ",
|
|
11225
|
+
like: "နှစ်သက်သည်",
|
|
11226
|
+
dislike: "မနှစ်သက်ပါ",
|
|
11227
|
+
sourcesCited: "ကိုးကားထားသော ရင်းမြစ် {count} ခု",
|
|
11228
|
+
moreSources: "နောက်ထပ် +{count}"
|
|
11229
|
+
},
|
|
11230
|
+
ca: {
|
|
11231
|
+
removeAttachment: "Elimina el fitxer adjunt",
|
|
11232
|
+
categoryFilter: "Filtre de categoria",
|
|
11233
|
+
filterByCategory: "Filtra per categoria",
|
|
11234
|
+
scrollCategoriesLeft: "Desplaça les categories a l'esquerra",
|
|
11235
|
+
scrollCategoriesRight: "Desplaça les categories a la dreta",
|
|
11236
|
+
scrollTagsLeft: "Desplaça les etiquetes a l'esquerra",
|
|
11237
|
+
scrollTagsRight: "Desplaça les etiquetes a la dreta",
|
|
11238
|
+
copyMessage: "Copia el missatge",
|
|
11239
|
+
copied: "Copiat",
|
|
11240
|
+
like: "M'agrada",
|
|
11241
|
+
dislike: "No m'agrada",
|
|
11242
|
+
sourcesCited: "{count} fonts citades",
|
|
11243
|
+
moreSources: "+{count} més"
|
|
11244
|
+
},
|
|
11245
|
+
zh: {
|
|
11246
|
+
removeAttachment: "移除附件",
|
|
11247
|
+
categoryFilter: "类别筛选",
|
|
11248
|
+
filterByCategory: "按类别筛选",
|
|
11249
|
+
scrollCategoriesLeft: "向左滚动类别",
|
|
11250
|
+
scrollCategoriesRight: "向右滚动类别",
|
|
11251
|
+
scrollTagsLeft: "向左滚动标签",
|
|
11252
|
+
scrollTagsRight: "向右滚动标签",
|
|
11253
|
+
copyMessage: "复制消息",
|
|
11254
|
+
copied: "已复制",
|
|
11255
|
+
like: "赞",
|
|
11256
|
+
dislike: "踩",
|
|
11257
|
+
sourcesCited: "引用了 {count} 个来源",
|
|
11258
|
+
moreSources: "另外 {count} 个"
|
|
11259
|
+
},
|
|
11260
|
+
hr: {
|
|
11261
|
+
removeAttachment: "Ukloni privitak",
|
|
11262
|
+
categoryFilter: "Filtar kategorija",
|
|
11263
|
+
filterByCategory: "Filtriraj po kategoriji",
|
|
11264
|
+
scrollCategoriesLeft: "Pomakni kategorije ulijevo",
|
|
11265
|
+
scrollCategoriesRight: "Pomakni kategorije udesno",
|
|
11266
|
+
scrollTagsLeft: "Pomakni oznake ulijevo",
|
|
11267
|
+
scrollTagsRight: "Pomakni oznake udesno",
|
|
11268
|
+
copyMessage: "Kopiraj poruku",
|
|
11269
|
+
copied: "Kopirano",
|
|
11270
|
+
like: "Sviđa mi se",
|
|
11271
|
+
dislike: "Ne sviđa mi se",
|
|
11272
|
+
sourcesCited: "Citirani izvori: {count}",
|
|
11273
|
+
moreSources: "+{count} više"
|
|
11274
|
+
},
|
|
11275
|
+
cs: {
|
|
11276
|
+
removeAttachment: "Odebrat přílohu",
|
|
11277
|
+
categoryFilter: "Filtr kategorií",
|
|
11278
|
+
filterByCategory: "Filtrovat podle kategorie",
|
|
11279
|
+
scrollCategoriesLeft: "Posunout kategorie doleva",
|
|
11280
|
+
scrollCategoriesRight: "Posunout kategorie doprava",
|
|
11281
|
+
scrollTagsLeft: "Posunout štítky doleva",
|
|
11282
|
+
scrollTagsRight: "Posunout štítky doprava",
|
|
11283
|
+
copyMessage: "Kopírovat zprávu",
|
|
11284
|
+
copied: "Zkopírováno",
|
|
11285
|
+
like: "Líbí se mi",
|
|
11286
|
+
dislike: "Nelíbí se mi",
|
|
11287
|
+
sourcesCited: "Citované zdroje: {count}",
|
|
11288
|
+
moreSources: "+{count} další"
|
|
11289
|
+
},
|
|
11290
|
+
da: {
|
|
11291
|
+
removeAttachment: "Fjern vedhæftet fil",
|
|
11292
|
+
categoryFilter: "Kategorifilter",
|
|
11293
|
+
filterByCategory: "Filtrer efter kategori",
|
|
11294
|
+
scrollCategoriesLeft: "Rul kategorier til venstre",
|
|
11295
|
+
scrollCategoriesRight: "Rul kategorier til højre",
|
|
11296
|
+
scrollTagsLeft: "Rul tags til venstre",
|
|
11297
|
+
scrollTagsRight: "Rul tags til højre",
|
|
11298
|
+
copyMessage: "Kopiér besked",
|
|
11299
|
+
copied: "Kopieret",
|
|
11300
|
+
like: "Synes godt om",
|
|
11301
|
+
dislike: "Synes ikke om",
|
|
11302
|
+
sourcesCited: "{count} kilder citeret",
|
|
11303
|
+
moreSources: "+{count} mere"
|
|
11304
|
+
},
|
|
11305
|
+
nl: {
|
|
11306
|
+
removeAttachment: "Bijlage verwijderen",
|
|
11307
|
+
categoryFilter: "Categoriefilter",
|
|
11308
|
+
filterByCategory: "Filteren op categorie",
|
|
11309
|
+
scrollCategoriesLeft: "Categorieën naar links scrollen",
|
|
11310
|
+
scrollCategoriesRight: "Categorieën naar rechts scrollen",
|
|
11311
|
+
scrollTagsLeft: "Tags naar links scrollen",
|
|
11312
|
+
scrollTagsRight: "Tags naar rechts scrollen",
|
|
11313
|
+
copyMessage: "Bericht kopiëren",
|
|
11314
|
+
copied: "Gekopieerd",
|
|
11315
|
+
like: "Vind ik leuk",
|
|
11316
|
+
dislike: "Vind ik niet leuk",
|
|
11317
|
+
sourcesCited: "{count} bronnen geciteerd",
|
|
11318
|
+
moreSources: "+{count} meer"
|
|
11319
|
+
},
|
|
11320
|
+
et: {
|
|
11321
|
+
removeAttachment: "Eemalda manus",
|
|
11322
|
+
categoryFilter: "Kategooriafilter",
|
|
11323
|
+
filterByCategory: "Filtreeri kategooria järgi",
|
|
11324
|
+
scrollCategoriesLeft: "Keri kategooriaid vasakule",
|
|
11325
|
+
scrollCategoriesRight: "Keri kategooriaid paremale",
|
|
11326
|
+
scrollTagsLeft: "Keri silte vasakule",
|
|
11327
|
+
scrollTagsRight: "Keri silte paremale",
|
|
11328
|
+
copyMessage: "Kopeeri sõnum",
|
|
11329
|
+
copied: "Kopeeritud",
|
|
11330
|
+
like: "Meeldib",
|
|
11331
|
+
dislike: "Ei meeldi",
|
|
11332
|
+
sourcesCited: "Viidatud allikaid: {count}",
|
|
11333
|
+
moreSources: "+{count} veel"
|
|
11334
|
+
},
|
|
11335
|
+
fi: {
|
|
11336
|
+
removeAttachment: "Poista liite",
|
|
11337
|
+
categoryFilter: "Luokkasuodatin",
|
|
11338
|
+
filterByCategory: "Suodata luokan mukaan",
|
|
11339
|
+
scrollCategoriesLeft: "Vieritä luokkia vasemmalle",
|
|
11340
|
+
scrollCategoriesRight: "Vieritä luokkia oikealle",
|
|
11341
|
+
scrollTagsLeft: "Vieritä tunnisteita vasemmalle",
|
|
11342
|
+
scrollTagsRight: "Vieritä tunnisteita oikealle",
|
|
11343
|
+
copyMessage: "Kopioi viesti",
|
|
11344
|
+
copied: "Kopioitu",
|
|
11345
|
+
like: "Tykkää",
|
|
11346
|
+
dislike: "En tykkää",
|
|
11347
|
+
sourcesCited: "Lähteitä viitattu: {count}",
|
|
11348
|
+
moreSources: "+{count} lisää"
|
|
11349
|
+
},
|
|
11350
|
+
fr: {
|
|
11351
|
+
removeAttachment: "Supprimer la pièce jointe",
|
|
11352
|
+
categoryFilter: "Filtre de catégorie",
|
|
11353
|
+
filterByCategory: "Filtrer par catégorie",
|
|
11354
|
+
scrollCategoriesLeft: "Faire défiler les catégories vers la gauche",
|
|
11355
|
+
scrollCategoriesRight: "Faire défiler les catégories vers la droite",
|
|
11356
|
+
scrollTagsLeft: "Faire défiler les étiquettes vers la gauche",
|
|
11357
|
+
scrollTagsRight: "Faire défiler les étiquettes vers la droite",
|
|
11358
|
+
copyMessage: "Copier le message",
|
|
11359
|
+
copied: "Copié",
|
|
11360
|
+
like: "J'aime",
|
|
11361
|
+
dislike: "Je n'aime pas",
|
|
11362
|
+
sourcesCited: "{count} sources citées",
|
|
11363
|
+
moreSources: "+{count} de plus"
|
|
11364
|
+
},
|
|
11365
|
+
de: {
|
|
11366
|
+
removeAttachment: "Anhang entfernen",
|
|
11367
|
+
categoryFilter: "Kategoriefilter",
|
|
11368
|
+
filterByCategory: "Nach Kategorie filtern",
|
|
11369
|
+
scrollCategoriesLeft: "Kategorien nach links scrollen",
|
|
11370
|
+
scrollCategoriesRight: "Kategorien nach rechts scrollen",
|
|
11371
|
+
scrollTagsLeft: "Tags nach links scrollen",
|
|
11372
|
+
scrollTagsRight: "Tags nach rechts scrollen",
|
|
11373
|
+
copyMessage: "Nachricht kopieren",
|
|
11374
|
+
copied: "Kopiert",
|
|
11375
|
+
like: "Gefällt mir",
|
|
11376
|
+
dislike: "Gefällt mir nicht",
|
|
11377
|
+
sourcesCited: "{count} Quellen zitiert",
|
|
11378
|
+
moreSources: "+{count} weitere"
|
|
11379
|
+
},
|
|
11380
|
+
el: {
|
|
11381
|
+
removeAttachment: "Αφαίρεση συνημμένου",
|
|
11382
|
+
categoryFilter: "Φίλτρο κατηγορίας",
|
|
11383
|
+
filterByCategory: "Φιλτράρισμα κατά κατηγορία",
|
|
11384
|
+
scrollCategoriesLeft: "Κύλιση κατηγοριών αριστερά",
|
|
11385
|
+
scrollCategoriesRight: "Κύλιση κατηγοριών δεξιά",
|
|
11386
|
+
scrollTagsLeft: "Κύλιση ετικετών αριστερά",
|
|
11387
|
+
scrollTagsRight: "Κύλιση ετικετών δεξιά",
|
|
11388
|
+
copyMessage: "Αντιγραφή μηνύματος",
|
|
11389
|
+
copied: "Αντιγράφηκε",
|
|
11390
|
+
like: "Μου αρέσει",
|
|
11391
|
+
dislike: "Δεν μου αρέσει",
|
|
11392
|
+
sourcesCited: "{count} πηγές αναφέρονται",
|
|
11393
|
+
moreSources: "+{count} ακόμη"
|
|
11394
|
+
},
|
|
11395
|
+
hi: {
|
|
11396
|
+
removeAttachment: "अनुलग्नक हटाएँ",
|
|
11397
|
+
categoryFilter: "श्रेणी फ़िल्टर",
|
|
11398
|
+
filterByCategory: "श्रेणी के अनुसार फ़िल्टर करें",
|
|
11399
|
+
scrollCategoriesLeft: "श्रेणियों को बाईं ओर स्क्रॉल करें",
|
|
11400
|
+
scrollCategoriesRight: "श्रेणियों को दाईं ओर स्क्रॉल करें",
|
|
11401
|
+
scrollTagsLeft: "टैग को बाईं ओर स्क्रॉल करें",
|
|
11402
|
+
scrollTagsRight: "टैग को दाईं ओर स्क्रॉल करें",
|
|
11403
|
+
copyMessage: "संदेश कॉपी करें",
|
|
11404
|
+
copied: "कॉपी किया गया",
|
|
11405
|
+
like: "पसंद",
|
|
11406
|
+
dislike: "नापसंद",
|
|
11407
|
+
sourcesCited: "{count} स्रोत उद्धृत",
|
|
11408
|
+
moreSources: "+{count} और"
|
|
11409
|
+
},
|
|
11410
|
+
mr: {
|
|
11411
|
+
removeAttachment: "संलग्नक काढा",
|
|
11412
|
+
categoryFilter: "श्रेणी फिल्टर",
|
|
11413
|
+
filterByCategory: "श्रेणीनुसार फिल्टर करा",
|
|
11414
|
+
scrollCategoriesLeft: "श्रेण्या डावीकडे स्क्रोल करा",
|
|
11415
|
+
scrollCategoriesRight: "श्रेण्या उजवीकडे स्क्रोल करा",
|
|
11416
|
+
scrollTagsLeft: "टॅग डावीकडे स्क्रोल करा",
|
|
11417
|
+
scrollTagsRight: "टॅग उजवीकडे स्क्रोल करा",
|
|
11418
|
+
copyMessage: "संदेश कॉपी करा",
|
|
11419
|
+
copied: "कॉपी केले",
|
|
11420
|
+
like: "आवडले",
|
|
11421
|
+
dislike: "आवडले नाही",
|
|
11422
|
+
sourcesCited: "{count} स्रोत उद्धृत",
|
|
11423
|
+
moreSources: "+{count} अधिक"
|
|
11424
|
+
},
|
|
11425
|
+
hu: {
|
|
11426
|
+
removeAttachment: "Melléklet eltávolítása",
|
|
11427
|
+
categoryFilter: "Kategóriaszűrő",
|
|
11428
|
+
filterByCategory: "Szűrés kategória szerint",
|
|
11429
|
+
scrollCategoriesLeft: "Kategóriák görgetése balra",
|
|
11430
|
+
scrollCategoriesRight: "Kategóriák görgetése jobbra",
|
|
11431
|
+
scrollTagsLeft: "Címkék görgetése balra",
|
|
11432
|
+
scrollTagsRight: "Címkék görgetése jobbra",
|
|
11433
|
+
copyMessage: "Üzenet másolása",
|
|
11434
|
+
copied: "Másolva",
|
|
11435
|
+
like: "Tetszik",
|
|
11436
|
+
dislike: "Nem tetszik",
|
|
11437
|
+
sourcesCited: "{count} hivatkozott forrás",
|
|
11438
|
+
moreSources: "+{count} további"
|
|
11439
|
+
},
|
|
11440
|
+
is: {
|
|
11441
|
+
removeAttachment: "Fjarlægja viðhengi",
|
|
11442
|
+
categoryFilter: "Flokkasía",
|
|
11443
|
+
filterByCategory: "Sía eftir flokki",
|
|
11444
|
+
scrollCategoriesLeft: "Fletta flokkum til vinstri",
|
|
11445
|
+
scrollCategoriesRight: "Fletta flokkum til hægri",
|
|
11446
|
+
scrollTagsLeft: "Fletta merkjum til vinstri",
|
|
11447
|
+
scrollTagsRight: "Fletta merkjum til hægri",
|
|
11448
|
+
copyMessage: "Afrita skilaboð",
|
|
11449
|
+
copied: "Afritað",
|
|
11450
|
+
like: "Líkar",
|
|
11451
|
+
dislike: "Líkar ekki",
|
|
11452
|
+
sourcesCited: "Heimildir vísað í: {count}",
|
|
11453
|
+
moreSources: "+{count} í viðbót"
|
|
11454
|
+
},
|
|
11455
|
+
id: {
|
|
11456
|
+
removeAttachment: "Hapus lampiran",
|
|
11457
|
+
categoryFilter: "Filter kategori",
|
|
11458
|
+
filterByCategory: "Filter menurut kategori",
|
|
11459
|
+
scrollCategoriesLeft: "Gulir kategori ke kiri",
|
|
11460
|
+
scrollCategoriesRight: "Gulir kategori ke kanan",
|
|
11461
|
+
scrollTagsLeft: "Gulir tag ke kiri",
|
|
11462
|
+
scrollTagsRight: "Gulir tag ke kanan",
|
|
11463
|
+
copyMessage: "Salin pesan",
|
|
11464
|
+
copied: "Disalin",
|
|
11465
|
+
like: "Suka",
|
|
11466
|
+
dislike: "Tidak suka",
|
|
11467
|
+
sourcesCited: "{count} sumber dikutip",
|
|
11468
|
+
moreSources: "+{count} lainnya"
|
|
11469
|
+
},
|
|
11470
|
+
it: {
|
|
11471
|
+
removeAttachment: "Rimuovi allegato",
|
|
11472
|
+
categoryFilter: "Filtro categoria",
|
|
11473
|
+
filterByCategory: "Filtra per categoria",
|
|
11474
|
+
scrollCategoriesLeft: "Scorri le categorie a sinistra",
|
|
11475
|
+
scrollCategoriesRight: "Scorri le categorie a destra",
|
|
11476
|
+
scrollTagsLeft: "Scorri i tag a sinistra",
|
|
11477
|
+
scrollTagsRight: "Scorri i tag a destra",
|
|
11478
|
+
copyMessage: "Copia messaggio",
|
|
11479
|
+
copied: "Copiato",
|
|
11480
|
+
like: "Mi piace",
|
|
11481
|
+
dislike: "Non mi piace",
|
|
11482
|
+
sourcesCited: "{count} fonti citate",
|
|
11483
|
+
moreSources: "+{count} altre"
|
|
11484
|
+
},
|
|
11485
|
+
ja: {
|
|
11486
|
+
removeAttachment: "添付ファイルを削除",
|
|
11487
|
+
categoryFilter: "カテゴリフィルター",
|
|
11488
|
+
filterByCategory: "カテゴリで絞り込む",
|
|
11489
|
+
scrollCategoriesLeft: "カテゴリを左にスクロール",
|
|
11490
|
+
scrollCategoriesRight: "カテゴリを右にスクロール",
|
|
11491
|
+
scrollTagsLeft: "タグを左にスクロール",
|
|
11492
|
+
scrollTagsRight: "タグを右にスクロール",
|
|
11493
|
+
copyMessage: "メッセージをコピー",
|
|
11494
|
+
copied: "コピーしました",
|
|
11495
|
+
like: "いいね",
|
|
11496
|
+
dislike: "よくないね",
|
|
11497
|
+
sourcesCited: "{count} 件の出典",
|
|
11498
|
+
moreSources: "他 {count} 件"
|
|
11499
|
+
},
|
|
11500
|
+
ko: {
|
|
11501
|
+
removeAttachment: "첨부 파일 제거",
|
|
11502
|
+
categoryFilter: "카테고리 필터",
|
|
11503
|
+
filterByCategory: "카테고리별 필터",
|
|
11504
|
+
scrollCategoriesLeft: "카테고리를 왼쪽으로 스크롤",
|
|
11505
|
+
scrollCategoriesRight: "카테고리를 오른쪽으로 스크롤",
|
|
11506
|
+
scrollTagsLeft: "태그를 왼쪽으로 스크롤",
|
|
11507
|
+
scrollTagsRight: "태그를 오른쪽으로 스크롤",
|
|
11508
|
+
copyMessage: "메시지 복사",
|
|
11509
|
+
copied: "복사됨",
|
|
11510
|
+
like: "좋아요",
|
|
11511
|
+
dislike: "싫어요",
|
|
11512
|
+
sourcesCited: "인용된 출처 {count}개",
|
|
11513
|
+
moreSources: "외 {count}개"
|
|
11514
|
+
},
|
|
11515
|
+
lv: {
|
|
11516
|
+
removeAttachment: "Noņemt pielikumu",
|
|
11517
|
+
categoryFilter: "Kategoriju filtrs",
|
|
11518
|
+
filterByCategory: "Filtrēt pēc kategorijas",
|
|
11519
|
+
scrollCategoriesLeft: "Ritināt kategorijas pa kreisi",
|
|
11520
|
+
scrollCategoriesRight: "Ritināt kategorijas pa labi",
|
|
11521
|
+
scrollTagsLeft: "Ritināt birkas pa kreisi",
|
|
11522
|
+
scrollTagsRight: "Ritināt birkas pa labi",
|
|
11523
|
+
copyMessage: "Kopēt ziņojumu",
|
|
11524
|
+
copied: "Nokopēts",
|
|
11525
|
+
like: "Patīk",
|
|
11526
|
+
dislike: "Nepatīk",
|
|
11527
|
+
sourcesCited: "Citēti avoti: {count}",
|
|
11528
|
+
moreSources: "+{count} vēl"
|
|
11529
|
+
},
|
|
11530
|
+
lt: {
|
|
11531
|
+
removeAttachment: "Pašalinti priedą",
|
|
11532
|
+
categoryFilter: "Kategorijų filtras",
|
|
11533
|
+
filterByCategory: "Filtruoti pagal kategoriją",
|
|
11534
|
+
scrollCategoriesLeft: "Slinkti kategorijas į kairę",
|
|
11535
|
+
scrollCategoriesRight: "Slinkti kategorijas į dešinę",
|
|
11536
|
+
scrollTagsLeft: "Slinkti žymes į kairę",
|
|
11537
|
+
scrollTagsRight: "Slinkti žymes į dešinę",
|
|
11538
|
+
copyMessage: "Kopijuoti žinutę",
|
|
11539
|
+
copied: "Nukopijuota",
|
|
11540
|
+
like: "Patinka",
|
|
11541
|
+
dislike: "Nepatinka",
|
|
11542
|
+
sourcesCited: "Cituoti šaltiniai: {count}",
|
|
11543
|
+
moreSources: "+{count} daugiau"
|
|
11544
|
+
},
|
|
11545
|
+
mk: {
|
|
11546
|
+
removeAttachment: "Отстрани прилог",
|
|
11547
|
+
categoryFilter: "Филтер за категории",
|
|
11548
|
+
filterByCategory: "Филтрирај по категорија",
|
|
11549
|
+
scrollCategoriesLeft: "Лизгај ги категориите налево",
|
|
11550
|
+
scrollCategoriesRight: "Лизгај ги категориите надесно",
|
|
11551
|
+
scrollTagsLeft: "Лизгај ги ознаките налево",
|
|
11552
|
+
scrollTagsRight: "Лизгај ги ознаките надесно",
|
|
11553
|
+
copyMessage: "Копирај порака",
|
|
11554
|
+
copied: "Копирано",
|
|
11555
|
+
like: "Ми се допаѓа",
|
|
11556
|
+
dislike: "Не ми се допаѓа",
|
|
11557
|
+
sourcesCited: "Цитирани извори: {count}",
|
|
11558
|
+
moreSources: "+{count} уште"
|
|
11559
|
+
},
|
|
11560
|
+
ms: {
|
|
11561
|
+
removeAttachment: "Alih keluar lampiran",
|
|
11562
|
+
categoryFilter: "Penapis kategori",
|
|
11563
|
+
filterByCategory: "Tapis mengikut kategori",
|
|
11564
|
+
scrollCategoriesLeft: "Tatal kategori ke kiri",
|
|
11565
|
+
scrollCategoriesRight: "Tatal kategori ke kanan",
|
|
11566
|
+
scrollTagsLeft: "Tatal tag ke kiri",
|
|
11567
|
+
scrollTagsRight: "Tatal tag ke kanan",
|
|
11568
|
+
copyMessage: "Salin mesej",
|
|
11569
|
+
copied: "Disalin",
|
|
11570
|
+
like: "Suka",
|
|
11571
|
+
dislike: "Tidak suka",
|
|
11572
|
+
sourcesCited: "{count} sumber dipetik",
|
|
11573
|
+
moreSources: "+{count} lagi"
|
|
11574
|
+
},
|
|
11575
|
+
no: {
|
|
11576
|
+
removeAttachment: "Fjern vedlegg",
|
|
11577
|
+
categoryFilter: "Kategorifilter",
|
|
11578
|
+
filterByCategory: "Filtrer etter kategori",
|
|
11579
|
+
scrollCategoriesLeft: "Bla kategorier til venstre",
|
|
11580
|
+
scrollCategoriesRight: "Bla kategorier til høyre",
|
|
11581
|
+
scrollTagsLeft: "Bla emneknagger til venstre",
|
|
11582
|
+
scrollTagsRight: "Bla emneknagger til høyre",
|
|
11583
|
+
copyMessage: "Kopier melding",
|
|
11584
|
+
copied: "Kopiert",
|
|
11585
|
+
like: "Liker",
|
|
11586
|
+
dislike: "Liker ikke",
|
|
11587
|
+
sourcesCited: "{count} kilder sitert",
|
|
11588
|
+
moreSources: "+{count} til"
|
|
11589
|
+
},
|
|
11590
|
+
fa: {
|
|
11591
|
+
removeAttachment: "حذف پیوست",
|
|
11592
|
+
categoryFilter: "فیلتر دستهبندی",
|
|
11593
|
+
filterByCategory: "فیلتر بر اساس دستهبندی",
|
|
11594
|
+
scrollCategoriesLeft: "پیمایش دستهبندیها به چپ",
|
|
11595
|
+
scrollCategoriesRight: "پیمایش دستهبندیها به راست",
|
|
11596
|
+
scrollTagsLeft: "پیمایش برچسبها به چپ",
|
|
11597
|
+
scrollTagsRight: "پیمایش برچسبها به راست",
|
|
11598
|
+
copyMessage: "کپی پیام",
|
|
11599
|
+
copied: "کپی شد",
|
|
11600
|
+
like: "پسندیدم",
|
|
11601
|
+
dislike: "نپسندیدم",
|
|
11602
|
+
sourcesCited: "{count} منبع ذکر شده",
|
|
11603
|
+
moreSources: "+{count} مورد دیگر"
|
|
11604
|
+
},
|
|
11605
|
+
pl: {
|
|
11606
|
+
removeAttachment: "Usuń załącznik",
|
|
11607
|
+
categoryFilter: "Filtr kategorii",
|
|
11608
|
+
filterByCategory: "Filtruj według kategorii",
|
|
11609
|
+
scrollCategoriesLeft: "Przewiń kategorie w lewo",
|
|
11610
|
+
scrollCategoriesRight: "Przewiń kategorie w prawo",
|
|
11611
|
+
scrollTagsLeft: "Przewiń tagi w lewo",
|
|
11612
|
+
scrollTagsRight: "Przewiń tagi w prawo",
|
|
11613
|
+
copyMessage: "Kopiuj wiadomość",
|
|
11614
|
+
copied: "Skopiowano",
|
|
11615
|
+
like: "Lubię to",
|
|
11616
|
+
dislike: "Nie lubię tego",
|
|
11617
|
+
sourcesCited: "Cytowane źródła: {count}",
|
|
11618
|
+
moreSources: "+{count} więcej"
|
|
11619
|
+
},
|
|
11620
|
+
pt: {
|
|
11621
|
+
removeAttachment: "Remover anexo",
|
|
11622
|
+
categoryFilter: "Filtro de categoria",
|
|
11623
|
+
filterByCategory: "Filtrar por categoria",
|
|
11624
|
+
scrollCategoriesLeft: "Rolar categorias para a esquerda",
|
|
11625
|
+
scrollCategoriesRight: "Rolar categorias para a direita",
|
|
11626
|
+
scrollTagsLeft: "Rolar etiquetas para a esquerda",
|
|
11627
|
+
scrollTagsRight: "Rolar etiquetas para a direita",
|
|
11628
|
+
copyMessage: "Copiar mensagem",
|
|
11629
|
+
copied: "Copiado",
|
|
11630
|
+
like: "Gostei",
|
|
11631
|
+
dislike: "Não gostei",
|
|
11632
|
+
sourcesCited: "{count} fontes citadas",
|
|
11633
|
+
moreSources: "+{count} mais"
|
|
11634
|
+
},
|
|
11635
|
+
ro: {
|
|
11636
|
+
removeAttachment: "Elimină atașamentul",
|
|
11637
|
+
categoryFilter: "Filtru de categorie",
|
|
11638
|
+
filterByCategory: "Filtrează după categorie",
|
|
11639
|
+
scrollCategoriesLeft: "Derulează categoriile la stânga",
|
|
11640
|
+
scrollCategoriesRight: "Derulează categoriile la dreapta",
|
|
11641
|
+
scrollTagsLeft: "Derulează etichetele la stânga",
|
|
11642
|
+
scrollTagsRight: "Derulează etichetele la dreapta",
|
|
11643
|
+
copyMessage: "Copiază mesajul",
|
|
11644
|
+
copied: "Copiat",
|
|
11645
|
+
like: "Îmi place",
|
|
11646
|
+
dislike: "Nu îmi place",
|
|
11647
|
+
sourcesCited: "Surse citate: {count}",
|
|
11648
|
+
moreSources: "+{count} în plus"
|
|
11649
|
+
},
|
|
11650
|
+
ru: {
|
|
11651
|
+
removeAttachment: "Удалить вложение",
|
|
11652
|
+
categoryFilter: "Фильтр категорий",
|
|
11653
|
+
filterByCategory: "Фильтровать по категории",
|
|
11654
|
+
scrollCategoriesLeft: "Прокрутить категории влево",
|
|
11655
|
+
scrollCategoriesRight: "Прокрутить категории вправо",
|
|
11656
|
+
scrollTagsLeft: "Прокрутить теги влево",
|
|
11657
|
+
scrollTagsRight: "Прокрутить теги вправо",
|
|
11658
|
+
copyMessage: "Копировать сообщение",
|
|
11659
|
+
copied: "Скопировано",
|
|
11660
|
+
like: "Нравится",
|
|
11661
|
+
dislike: "Не нравится",
|
|
11662
|
+
sourcesCited: "Цитируемые источники: {count}",
|
|
11663
|
+
moreSources: "+{count} ещё"
|
|
11664
|
+
},
|
|
11665
|
+
sr: {
|
|
11666
|
+
removeAttachment: "Уклони прилог",
|
|
11667
|
+
categoryFilter: "Филтер категорија",
|
|
11668
|
+
filterByCategory: "Филтрирај по категорији",
|
|
11669
|
+
scrollCategoriesLeft: "Скролуј категорије лево",
|
|
11670
|
+
scrollCategoriesRight: "Скролуј категорије десно",
|
|
11671
|
+
scrollTagsLeft: "Скролуј ознаке лево",
|
|
11672
|
+
scrollTagsRight: "Скролуј ознаке десно",
|
|
11673
|
+
copyMessage: "Копирај поруку",
|
|
11674
|
+
copied: "Копирано",
|
|
11675
|
+
like: "Свиђа ми се",
|
|
11676
|
+
dislike: "Не свиђа ми се",
|
|
11677
|
+
sourcesCited: "Цитирани извори: {count}",
|
|
11678
|
+
moreSources: "+{count} још"
|
|
11679
|
+
},
|
|
11680
|
+
sk: {
|
|
11681
|
+
removeAttachment: "Odstrániť prílohu",
|
|
11682
|
+
categoryFilter: "Filter kategórií",
|
|
11683
|
+
filterByCategory: "Filtrovať podľa kategórie",
|
|
11684
|
+
scrollCategoriesLeft: "Posunúť kategórie doľava",
|
|
11685
|
+
scrollCategoriesRight: "Posunúť kategórie doprava",
|
|
11686
|
+
scrollTagsLeft: "Posunúť štítky doľava",
|
|
11687
|
+
scrollTagsRight: "Posunúť štítky doprava",
|
|
11688
|
+
copyMessage: "Kopírovať správu",
|
|
11689
|
+
copied: "Skopírované",
|
|
11690
|
+
like: "Páči sa mi",
|
|
11691
|
+
dislike: "Nepáči sa mi",
|
|
11692
|
+
sourcesCited: "Citované zdroje: {count}",
|
|
11693
|
+
moreSources: "+{count} ďalšie"
|
|
11694
|
+
},
|
|
11695
|
+
sl: {
|
|
11696
|
+
removeAttachment: "Odstrani prilogo",
|
|
11697
|
+
categoryFilter: "Filter kategorij",
|
|
11698
|
+
filterByCategory: "Filtriraj po kategoriji",
|
|
11699
|
+
scrollCategoriesLeft: "Pomakni kategorije levo",
|
|
11700
|
+
scrollCategoriesRight: "Pomakni kategorije desno",
|
|
11701
|
+
scrollTagsLeft: "Pomakni oznake levo",
|
|
11702
|
+
scrollTagsRight: "Pomakni oznake desno",
|
|
11703
|
+
copyMessage: "Kopiraj sporočilo",
|
|
11704
|
+
copied: "Kopirano",
|
|
11705
|
+
like: "Všeč mi je",
|
|
11706
|
+
dislike: "Ni mi všeč",
|
|
11707
|
+
sourcesCited: "Navedeni viri: {count}",
|
|
11708
|
+
moreSources: "+{count} več"
|
|
11709
|
+
},
|
|
11710
|
+
sv: {
|
|
11711
|
+
removeAttachment: "Ta bort bilaga",
|
|
11712
|
+
categoryFilter: "Kategorifilter",
|
|
11713
|
+
filterByCategory: "Filtrera efter kategori",
|
|
11714
|
+
scrollCategoriesLeft: "Bläddra kategorier åt vänster",
|
|
11715
|
+
scrollCategoriesRight: "Bläddra kategorier åt höger",
|
|
11716
|
+
scrollTagsLeft: "Bläddra taggar åt vänster",
|
|
11717
|
+
scrollTagsRight: "Bläddra taggar åt höger",
|
|
11718
|
+
copyMessage: "Kopiera meddelande",
|
|
11719
|
+
copied: "Kopierat",
|
|
11720
|
+
like: "Gilla",
|
|
11721
|
+
dislike: "Gilla inte",
|
|
11722
|
+
sourcesCited: "{count} källor citerade",
|
|
11723
|
+
moreSources: "+{count} till"
|
|
11724
|
+
},
|
|
11725
|
+
th: {
|
|
11726
|
+
removeAttachment: "นำไฟล์แนบออก",
|
|
11727
|
+
categoryFilter: "ตัวกรองหมวดหมู่",
|
|
11728
|
+
filterByCategory: "กรองตามหมวดหมู่",
|
|
11729
|
+
scrollCategoriesLeft: "เลื่อนหมวดหมู่ไปทางซ้าย",
|
|
11730
|
+
scrollCategoriesRight: "เลื่อนหมวดหมู่ไปทางขวา",
|
|
11731
|
+
scrollTagsLeft: "เลื่อนแท็กไปทางซ้าย",
|
|
11732
|
+
scrollTagsRight: "เลื่อนแท็กไปทางขวา",
|
|
11733
|
+
copyMessage: "คัดลอกข้อความ",
|
|
11734
|
+
copied: "คัดลอกแล้ว",
|
|
11735
|
+
like: "ถูกใจ",
|
|
11736
|
+
dislike: "ไม่ถูกใจ",
|
|
11737
|
+
sourcesCited: "อ้างอิง {count} แหล่ง",
|
|
11738
|
+
moreSources: "อีก +{count}"
|
|
11739
|
+
},
|
|
11740
|
+
tr: {
|
|
11741
|
+
removeAttachment: "Eki kaldır",
|
|
11742
|
+
categoryFilter: "Kategori filtresi",
|
|
11743
|
+
filterByCategory: "Kategoriye göre filtrele",
|
|
11744
|
+
scrollCategoriesLeft: "Kategorileri sola kaydır",
|
|
11745
|
+
scrollCategoriesRight: "Kategorileri sağa kaydır",
|
|
11746
|
+
scrollTagsLeft: "Etiketleri sola kaydır",
|
|
11747
|
+
scrollTagsRight: "Etiketleri sağa kaydır",
|
|
11748
|
+
copyMessage: "Mesajı kopyala",
|
|
11749
|
+
copied: "Kopyalandı",
|
|
11750
|
+
like: "Beğen",
|
|
11751
|
+
dislike: "Beğenme",
|
|
11752
|
+
sourcesCited: "{count} kaynak alıntılandı",
|
|
11753
|
+
moreSources: "+{count} daha"
|
|
11754
|
+
},
|
|
11755
|
+
uk: {
|
|
11756
|
+
removeAttachment: "Видалити вкладення",
|
|
11757
|
+
categoryFilter: "Фільтр категорій",
|
|
11758
|
+
filterByCategory: "Фільтрувати за категорією",
|
|
11759
|
+
scrollCategoriesLeft: "Прокрутити категорії ліворуч",
|
|
11760
|
+
scrollCategoriesRight: "Прокрутити категорії праворуч",
|
|
11761
|
+
scrollTagsLeft: "Прокрутити теги ліворуч",
|
|
11762
|
+
scrollTagsRight: "Прокрутити теги праворуч",
|
|
11763
|
+
copyMessage: "Копіювати повідомлення",
|
|
11764
|
+
copied: "Скопійовано",
|
|
11765
|
+
like: "Подобається",
|
|
11766
|
+
dislike: "Не подобається",
|
|
11767
|
+
sourcesCited: "Цитовані джерела: {count}",
|
|
11768
|
+
moreSources: "+{count} ще"
|
|
11769
|
+
},
|
|
11770
|
+
ur: {
|
|
11771
|
+
removeAttachment: "منسلکہ ہٹائیں",
|
|
11772
|
+
categoryFilter: "زمرہ فلٹر",
|
|
11773
|
+
filterByCategory: "زمرے کے لحاظ سے فلٹر کریں",
|
|
11774
|
+
scrollCategoriesLeft: "زمرے بائیں طرف اسکرول کریں",
|
|
11775
|
+
scrollCategoriesRight: "زمرے دائیں طرف اسکرول کریں",
|
|
11776
|
+
scrollTagsLeft: "ٹیگز بائیں طرف اسکرول کریں",
|
|
11777
|
+
scrollTagsRight: "ٹیگز دائیں طرف اسکرول کریں",
|
|
11778
|
+
copyMessage: "پیغام کاپی کریں",
|
|
11779
|
+
copied: "کاپی ہو گیا",
|
|
11780
|
+
like: "پسند",
|
|
11781
|
+
dislike: "ناپسند",
|
|
11782
|
+
sourcesCited: "{count} حوالہ جاتی ذرائع",
|
|
11783
|
+
moreSources: "+{count} مزید"
|
|
11784
|
+
},
|
|
11785
|
+
vi: {
|
|
11786
|
+
removeAttachment: "Xóa tệp đính kèm",
|
|
11787
|
+
categoryFilter: "Bộ lọc danh mục",
|
|
11788
|
+
filterByCategory: "Lọc theo danh mục",
|
|
11789
|
+
scrollCategoriesLeft: "Cuộn danh mục sang trái",
|
|
11790
|
+
scrollCategoriesRight: "Cuộn danh mục sang phải",
|
|
11791
|
+
scrollTagsLeft: "Cuộn thẻ sang trái",
|
|
11792
|
+
scrollTagsRight: "Cuộn thẻ sang phải",
|
|
11793
|
+
copyMessage: "Sao chép tin nhắn",
|
|
11794
|
+
copied: "Đã sao chép",
|
|
11795
|
+
like: "Thích",
|
|
11796
|
+
dislike: "Không thích",
|
|
11797
|
+
sourcesCited: "Đã trích dẫn {count} nguồn",
|
|
11798
|
+
moreSources: "+{count} nữa"
|
|
11799
|
+
}
|
|
11800
|
+
};
|
|
11117
11801
|
const ONBOARDING_PLACEHOLDERS = {
|
|
11118
11802
|
en: {
|
|
11119
11803
|
onboardingNamePlaceholder: "Please enter your name",
|
|
@@ -11398,7 +12082,7 @@
|
|
|
11398
12082
|
const normalized = normalizeLocale(locale);
|
|
11399
12083
|
const dict = DICTIONARIES[normalized] || EN;
|
|
11400
12084
|
const onboarding = ONBOARDING_PLACEHOLDERS[normalized];
|
|
11401
|
-
return onboarding?.[key] ?? dict[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? EN[key] ?? key;
|
|
12085
|
+
return onboarding?.[key] ?? dict[key] ?? A11Y_LABELS[normalized]?.[key] ?? ONBOARDING_PLACEHOLDERS.en[key] ?? A11Y_LABELS.en[key] ?? EN[key] ?? key;
|
|
11402
12086
|
}
|
|
11403
12087
|
function createTranslator(locale) {
|
|
11404
12088
|
const normalized = normalizeLocale(locale);
|
|
@@ -11911,81 +12595,99 @@
|
|
|
11911
12595
|
};
|
|
11912
12596
|
|
|
11913
12597
|
/**
|
|
11914
|
-
* Greeting personalisation using the onboarding-collected name
|
|
12598
|
+
* Greeting personalisation using the onboarding-collected name, shared by
|
|
12599
|
+
* the agent-sdk, the widget and the frontend Testing Lab (EV-4798 MERN-19).
|
|
11915
12600
|
*
|
|
11916
12601
|
* Product (2026-07-20): once onboarding captures the user's name, every
|
|
11917
|
-
* greeting (initial / follow-up / re-entry)
|
|
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;
|
|
@@ -16244,8 +16953,13 @@
|
|
|
16244
16953
|
// state are common, unlike the desktop-first admin Inbox.
|
|
16245
16954
|
function CopyMessageButton({
|
|
16246
16955
|
content,
|
|
16247
|
-
isDark
|
|
16956
|
+
isDark,
|
|
16957
|
+
t
|
|
16248
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";
|
|
16249
16963
|
const [copied, setCopied] = reactExports.useState(false);
|
|
16250
16964
|
const handleCopy = reactExports.useCallback(() => {
|
|
16251
16965
|
if (!content) return;
|
|
@@ -16264,8 +16978,8 @@
|
|
|
16264
16978
|
WebkitAppearance: "none",
|
|
16265
16979
|
cursor: "pointer"
|
|
16266
16980
|
},
|
|
16267
|
-
"aria-label": copied ?
|
|
16268
|
-
title: copied ?
|
|
16981
|
+
"aria-label": copied ? copiedLabel : copyLabel,
|
|
16982
|
+
title: copied ? copiedLabel : copyLabel,
|
|
16269
16983
|
children: copied ? /*#__PURE__*/jsxRuntimeExports.jsx(Check, {
|
|
16270
16984
|
className: "w-3 h-3 text-green-500"
|
|
16271
16985
|
}) : /*#__PURE__*/jsxRuntimeExports.jsx(Copy, {
|
|
@@ -16421,8 +17135,12 @@
|
|
|
16421
17135
|
sourcesPreliminary: !!message.sourcesPreliminary,
|
|
16422
17136
|
onSourceActivate,
|
|
16423
17137
|
downloadingKey,
|
|
16424
|
-
textColor: messageTextColor
|
|
16425
|
-
|
|
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]);
|
|
16426
17144
|
return (
|
|
16427
17145
|
/*#__PURE__*/
|
|
16428
17146
|
// `min-w-0` on the outer flex-row mirrors the same guard in the
|
|
@@ -16526,7 +17244,8 @@
|
|
|
16526
17244
|
children: formatTime(message.timestamp)
|
|
16527
17245
|
}), !isTypingMessage && !message.isProcessing && displayContent && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
|
|
16528
17246
|
content: displayContent,
|
|
16529
|
-
isDark: isDark
|
|
17247
|
+
isDark: isDark,
|
|
17248
|
+
t: t
|
|
16530
17249
|
}), allowFeedback !== false && onFeedback && !isTypingMessage && !message.isProcessing && displayContent && message.type !== 'welcome' && !message.isWelcome && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
16531
17250
|
className: "flex items-center gap-0.5 ms-0.5",
|
|
16532
17251
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
@@ -16540,7 +17259,8 @@
|
|
|
16540
17259
|
WebkitAppearance: "none",
|
|
16541
17260
|
cursor: "pointer"
|
|
16542
17261
|
},
|
|
16543
|
-
"aria-label": "
|
|
17262
|
+
"aria-label": t("like"),
|
|
17263
|
+
"aria-pressed": activeFeedback === 'like',
|
|
16544
17264
|
children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsUp, {
|
|
16545
17265
|
className: "w-3 h-3"
|
|
16546
17266
|
})
|
|
@@ -16555,7 +17275,8 @@
|
|
|
16555
17275
|
WebkitAppearance: "none",
|
|
16556
17276
|
cursor: "pointer"
|
|
16557
17277
|
},
|
|
16558
|
-
"aria-label": "
|
|
17278
|
+
"aria-label": t("dislike"),
|
|
17279
|
+
"aria-pressed": activeFeedback === 'dislike',
|
|
16559
17280
|
children: /*#__PURE__*/jsxRuntimeExports.jsx(ThumbsDown, {
|
|
16560
17281
|
className: "w-3 h-3"
|
|
16561
17282
|
})
|
|
@@ -16731,7 +17452,8 @@
|
|
|
16731
17452
|
children: formatTime(message.timestamp)
|
|
16732
17453
|
}), message.content && message.content.trim() !== "" && /*#__PURE__*/jsxRuntimeExports.jsx(CopyMessageButton, {
|
|
16733
17454
|
content: message.content,
|
|
16734
|
-
isDark: isDark
|
|
17455
|
+
isDark: isDark,
|
|
17456
|
+
t: t
|
|
16735
17457
|
})]
|
|
16736
17458
|
}), message.status === "failed" && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
16737
17459
|
className: "flex items-center gap-1.5 mt-1 px-1",
|
|
@@ -17024,7 +17746,8 @@
|
|
|
17024
17746
|
isRtl,
|
|
17025
17747
|
onQuestionClick,
|
|
17026
17748
|
applyHoverState,
|
|
17027
|
-
headingLabel
|
|
17749
|
+
headingLabel,
|
|
17750
|
+
defaultLanguage
|
|
17028
17751
|
}) => {
|
|
17029
17752
|
const scrollRef = reactExports.useRef(null);
|
|
17030
17753
|
const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
|
|
@@ -17071,7 +17794,7 @@
|
|
|
17071
17794
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
17072
17795
|
onClick: () => scroll("left"),
|
|
17073
17796
|
disabled: !canScrollLeft,
|
|
17074
|
-
"aria-label":
|
|
17797
|
+
"aria-label": translate(defaultLanguage, "scrollLeft"),
|
|
17075
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",
|
|
17076
17799
|
style: {
|
|
17077
17800
|
backgroundColor: arrowBg,
|
|
@@ -17131,7 +17854,7 @@
|
|
|
17131
17854
|
}), /*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
17132
17855
|
onClick: () => scroll("right"),
|
|
17133
17856
|
disabled: !canScrollRight,
|
|
17134
|
-
"aria-label":
|
|
17857
|
+
"aria-label": translate(defaultLanguage, "scrollRight"),
|
|
17135
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",
|
|
17136
17859
|
style: {
|
|
17137
17860
|
backgroundColor: arrowBg,
|
|
@@ -17167,7 +17890,9 @@
|
|
|
17167
17890
|
userTextColor,
|
|
17168
17891
|
// Optional localized heading rendered above the vertical pill list,
|
|
17169
17892
|
// styled to match the inline category picker's helper-text heading.
|
|
17170
|
-
headingLabel
|
|
17893
|
+
headingLabel,
|
|
17894
|
+
// Locale for the scroll arrows' accessible names (EV-4798 MERN-21).
|
|
17895
|
+
defaultLanguage = "en"
|
|
17171
17896
|
}) => {
|
|
17172
17897
|
if (!questions.length || isTyping) {
|
|
17173
17898
|
return null;
|
|
@@ -17190,7 +17915,8 @@
|
|
|
17190
17915
|
isRtl: isRtl,
|
|
17191
17916
|
onQuestionClick: onQuestionClick,
|
|
17192
17917
|
applyHoverState: applyHoverState,
|
|
17193
|
-
headingLabel: headingLabel
|
|
17918
|
+
headingLabel: headingLabel,
|
|
17919
|
+
defaultLanguage: defaultLanguage
|
|
17194
17920
|
});
|
|
17195
17921
|
}
|
|
17196
17922
|
|
|
@@ -17667,6 +18393,47 @@
|
|
|
17667
18393
|
return result;
|
|
17668
18394
|
}
|
|
17669
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
|
+
|
|
17670
18437
|
// Kept in its own tiny module (not A2uiBlock.jsx): MessageList imports it
|
|
17671
18438
|
// eagerly, and A2uiBlock/MarkdownRenderer are lazy-loaded to keep charts and
|
|
17672
18439
|
// react-markdown out of the widget's initial bundle.
|
|
@@ -17679,16 +18446,6 @@
|
|
|
17679
18446
|
// threaded through MessageBubble -> StreamingMarkdown -> MarkdownRenderer.
|
|
17680
18447
|
const A2uiAnsweredContext = /*#__PURE__*/reactExports.createContext(undefined);
|
|
17681
18448
|
|
|
17682
|
-
/** First delivered user turn after `index`, or undefined (see above). */
|
|
17683
|
-
function findNextUserAnswer(messages, index) {
|
|
17684
|
-
for (let i = index + 1; i < (messages || []).length; i += 1) {
|
|
17685
|
-
const m = messages[i];
|
|
17686
|
-
if (m?.role !== 'user' || m.sendFailed) continue;
|
|
17687
|
-
return typeof m.content === 'string' ? m.content : String(m.content ?? '');
|
|
17688
|
-
}
|
|
17689
|
-
return undefined;
|
|
17690
|
-
}
|
|
17691
|
-
|
|
17692
18449
|
const MessageList = ({
|
|
17693
18450
|
messages = [],
|
|
17694
18451
|
isDark,
|
|
@@ -18041,7 +18798,8 @@
|
|
|
18041
18798
|
resolvedUserMessageColor: resolvedUserMessageColor,
|
|
18042
18799
|
userMessageBoxColor: userMessageBoxColor,
|
|
18043
18800
|
userTextColor: userTextColor,
|
|
18044
|
-
headingLabel: quickQuestionsHeadingLabel
|
|
18801
|
+
headingLabel: quickQuestionsHeadingLabel,
|
|
18802
|
+
defaultLanguage: defaultLanguage
|
|
18045
18803
|
})
|
|
18046
18804
|
}), isVoiceSessionActive && voiceStatus === "connected" && !isLoading && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
18047
18805
|
className: "flex gap-3 flex-row-reverse animate-in",
|
|
@@ -18676,10 +19434,14 @@
|
|
|
18676
19434
|
}
|
|
18677
19435
|
return `${val.toFixed(val >= 10 ? 0 : 1)} ${units[unit]}`;
|
|
18678
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.
|
|
18679
19440
|
function AttachmentChip({
|
|
18680
19441
|
attachment,
|
|
18681
19442
|
onRemove,
|
|
18682
|
-
isDark
|
|
19443
|
+
isDark,
|
|
19444
|
+
removeLabel = "Remove attachment"
|
|
18683
19445
|
}) {
|
|
18684
19446
|
const isError = attachment.status === "error";
|
|
18685
19447
|
const isUploading = attachment.status === "uploading";
|
|
@@ -18696,6 +19458,7 @@
|
|
|
18696
19458
|
color: textColor,
|
|
18697
19459
|
maxWidth: 240
|
|
18698
19460
|
},
|
|
19461
|
+
role: "group",
|
|
18699
19462
|
title: isError ? attachment.error?.message : attachment.filename,
|
|
18700
19463
|
"aria-label": statusLabel,
|
|
18701
19464
|
children: [isError ? /*#__PURE__*/jsxRuntimeExports.jsx(CircleAlert, {
|
|
@@ -18731,7 +19494,7 @@
|
|
|
18731
19494
|
color: textColor,
|
|
18732
19495
|
cursor: "pointer"
|
|
18733
19496
|
},
|
|
18734
|
-
"aria-label":
|
|
19497
|
+
"aria-label": removeLabel,
|
|
18735
19498
|
children: /*#__PURE__*/jsxRuntimeExports.jsx(X, {
|
|
18736
19499
|
size: 12
|
|
18737
19500
|
})
|
|
@@ -19273,7 +20036,8 @@
|
|
|
19273
20036
|
children: attachments.map(att => /*#__PURE__*/jsxRuntimeExports.jsx(AttachmentChip, {
|
|
19274
20037
|
attachment: att,
|
|
19275
20038
|
onRemove: removeAttachment,
|
|
19276
|
-
isDark: isDark
|
|
20039
|
+
isDark: isDark,
|
|
20040
|
+
removeLabel: t("removeAttachment")
|
|
19277
20041
|
}, att.id))
|
|
19278
20042
|
}), /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
19279
20043
|
className: "flex items-center px-5 gap-1.5",
|
|
@@ -19634,6 +20398,80 @@
|
|
|
19634
20398
|
};
|
|
19635
20399
|
}
|
|
19636
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
|
+
|
|
19637
20475
|
const ChatHeader = ({
|
|
19638
20476
|
conciergeName,
|
|
19639
20477
|
companyName,
|
|
@@ -19810,7 +20648,11 @@
|
|
|
19810
20648
|
})
|
|
19811
20649
|
}), showMenu && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
19812
20650
|
role: "menu",
|
|
19813
|
-
"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,
|
|
19814
20656
|
dir: isRtl ? "rtl" : "ltr",
|
|
19815
20657
|
onKeyDown: event => {
|
|
19816
20658
|
if (event.key === "Escape") {
|
|
@@ -19818,26 +20660,18 @@
|
|
|
19818
20660
|
setShowMenu(false);
|
|
19819
20661
|
return;
|
|
19820
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;
|
|
19821
20666
|
// EV-3332: keep Tab focus inside the open menu. Focus enters on
|
|
19822
20667
|
// open and returns to the trigger on close (effect above), but
|
|
19823
20668
|
// without this a Tab from the last item / Shift+Tab from the
|
|
19824
20669
|
// first escaped into the page behind the menu - the gap QA
|
|
19825
20670
|
// flagged (a real trap already exists on CitationPill; the
|
|
19826
20671
|
// header menu had Escape-only). Cycle within the menuitems.
|
|
19827
|
-
|
|
19828
|
-
|
|
19829
|
-
|
|
19830
|
-
const first = items[0];
|
|
19831
|
-
const last = items[items.length - 1];
|
|
19832
|
-
const active = document.activeElement;
|
|
19833
|
-
if (event.shiftKey && active === first) {
|
|
19834
|
-
event.preventDefault();
|
|
19835
|
-
last.focus();
|
|
19836
|
-
} else if (!event.shiftKey && active === last) {
|
|
19837
|
-
event.preventDefault();
|
|
19838
|
-
first.focus();
|
|
19839
|
-
}
|
|
19840
|
-
}
|
|
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);
|
|
19841
20675
|
},
|
|
19842
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"}`,
|
|
19843
20677
|
style: {
|
|
@@ -20128,8 +20962,10 @@
|
|
|
20128
20962
|
isDark = false,
|
|
20129
20963
|
primaryColor = "#2563eb",
|
|
20130
20964
|
fontFamily = "Inter",
|
|
20131
|
-
isRtl = false
|
|
20965
|
+
isRtl = false,
|
|
20966
|
+
defaultLanguage = "en"
|
|
20132
20967
|
}) => {
|
|
20968
|
+
const t = reactExports.useMemo(() => createTranslator(defaultLanguage), [defaultLanguage]);
|
|
20133
20969
|
const scrollRef = reactExports.useRef(null);
|
|
20134
20970
|
const [canScrollLeft, setCanScrollLeft] = reactExports.useState(false);
|
|
20135
20971
|
const [canScrollRight, setCanScrollRight] = reactExports.useState(false);
|
|
@@ -20176,12 +21012,12 @@
|
|
|
20176
21012
|
direction: isRtl ? "rtl" : "ltr"
|
|
20177
21013
|
},
|
|
20178
21014
|
role: "region",
|
|
20179
|
-
"aria-label": "
|
|
21015
|
+
"aria-label": t("filterByCategory"),
|
|
20180
21016
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
20181
21017
|
type: "button",
|
|
20182
21018
|
onClick: () => scroll("left"),
|
|
20183
21019
|
disabled: !canScrollLeft,
|
|
20184
|
-
"aria-label": "
|
|
21020
|
+
"aria-label": t("scrollCategoriesLeft"),
|
|
20185
21021
|
className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
|
|
20186
21022
|
style: {
|
|
20187
21023
|
backgroundColor: arrowBg,
|
|
@@ -20225,7 +21061,7 @@
|
|
|
20225
21061
|
type: "button",
|
|
20226
21062
|
onClick: () => scroll("right"),
|
|
20227
21063
|
disabled: !canScrollRight,
|
|
20228
|
-
"aria-label": "
|
|
21064
|
+
"aria-label": t("scrollCategoriesRight"),
|
|
20229
21065
|
className: "flex-shrink-0 flex items-center justify-center w-6 h-6 rounded-full transition-all duration-200",
|
|
20230
21066
|
style: {
|
|
20231
21067
|
backgroundColor: arrowBg,
|
|
@@ -20262,7 +21098,9 @@
|
|
|
20262
21098
|
fontFamily = "Inter",
|
|
20263
21099
|
fontSize = "14px",
|
|
20264
21100
|
isRtl = false,
|
|
20265
|
-
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"
|
|
20266
21104
|
}) => {
|
|
20267
21105
|
if (!Array.isArray(categories) || categories.length === 0) return null;
|
|
20268
21106
|
const helperColor = isDark ? "#9ca3af" : "#6b7280";
|
|
@@ -20274,7 +21112,7 @@
|
|
|
20274
21112
|
paddingRight: isRtl ? 50 : undefined
|
|
20275
21113
|
},
|
|
20276
21114
|
role: "region",
|
|
20277
|
-
"aria-label":
|
|
21115
|
+
"aria-label": regionLabel,
|
|
20278
21116
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
20279
21117
|
className: "mb-2",
|
|
20280
21118
|
style: {
|
|
@@ -20462,7 +21300,10 @@
|
|
|
20462
21300
|
children: ratings.map(rating => /*#__PURE__*/jsxRuntimeExports.jsx("button", {
|
|
20463
21301
|
onClick: () => handleRating(rating.value),
|
|
20464
21302
|
disabled: disabled || isSubmitting,
|
|
20465
|
-
className: cn("flex items-center justify-center text-2xl transition-transform", "bg-transparent border-0 p-0 cursor-pointer", "hover:scale-110 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed", "focus:outline-none focus:ring-0",
|
|
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"),
|
|
20466
21307
|
children: /*#__PURE__*/jsxRuntimeExports.jsx("span", {
|
|
20467
21308
|
role: "img",
|
|
20468
21309
|
"aria-label": `${t("rate")} ${rating.value}`,
|
|
@@ -20511,7 +21352,9 @@
|
|
|
20511
21352
|
onClick: () => handleRating(rating.value),
|
|
20512
21353
|
onMouseEnter: () => setHoveredStar(rating.value),
|
|
20513
21354
|
disabled: disabled || isSubmitting,
|
|
20514
|
-
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"),
|
|
20515
21358
|
style: {
|
|
20516
21359
|
transform: isHovered ? "scale(1.25)" : "scale(1)",
|
|
20517
21360
|
filter: isHovered ? "brightness(1.1) drop-shadow(0 2px 4px rgba(0,0,0,0.15))" : "none",
|
|
@@ -20869,7 +21712,14 @@
|
|
|
20869
21712
|
if (prompt && typeof prompt === "object") {
|
|
20870
21713
|
reportChipClick(text, prompt, index);
|
|
20871
21714
|
}
|
|
20872
|
-
|
|
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);
|
|
20873
21723
|
}, [onPromptSuggestionClick, onDirectSend, reportChipClick]);
|
|
20874
21724
|
|
|
20875
21725
|
// ─── Resizable widget ────────────────────────────────────────────
|
|
@@ -21415,7 +22265,9 @@
|
|
|
21415
22265
|
onClick: handleResolveSubmission,
|
|
21416
22266
|
disabled: resolveRating === 0 || isSubmittingResolve,
|
|
21417
22267
|
"aria-describedby": resolveRating === 0 ? "resolve-rating-hint" : undefined,
|
|
21418
|
-
className: cn("w-full py-3.5 rounded-xl text-sm font-semibold [font-family:inherit] transition-all duration-200 border-none outline-none focus:outline-none active:outline-none focus:ring-0 active:ring-0", "disabled:opacity-50 disabled:cursor-not-allowed",
|
|
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"),
|
|
21419
22271
|
children: isSubmittingResolve ? t("submitting") : t("submitFeedback")
|
|
21420
22272
|
}), resolveRating === 0 && !isSubmittingResolve && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
21421
22273
|
id: "resolve-rating-hint",
|
|
@@ -21505,7 +22357,8 @@
|
|
|
21505
22357
|
isDark: isDark,
|
|
21506
22358
|
primaryColor: primaryColor,
|
|
21507
22359
|
fontFamily: fontFamily,
|
|
21508
|
-
isRtl: isRtlLanguage
|
|
22360
|
+
isRtl: isRtlLanguage,
|
|
22361
|
+
defaultLanguage: defaultLanguage
|
|
21509
22362
|
}), !isMinimized && /*#__PURE__*/jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
|
21510
22363
|
children: [/*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
21511
22364
|
ref: messagesContainerRef,
|
|
@@ -21585,7 +22438,8 @@
|
|
|
21585
22438
|
fontFamily: fontFamily,
|
|
21586
22439
|
fontSize: fontSize,
|
|
21587
22440
|
isRtl: isRtlLanguage,
|
|
21588
|
-
label: t("chooseTopicLabel")
|
|
22441
|
+
label: t("chooseTopicLabel"),
|
|
22442
|
+
regionLabel: t("categoryFilter")
|
|
21589
22443
|
}) : null,
|
|
21590
22444
|
quickQuestionsHeadingLabel: filterEnabled ? t("quickQuestionsHeadingLabel") : undefined
|
|
21591
22445
|
}), (showCsat && csatEnabled || csatRequest) && !csatSubmitted && /*#__PURE__*/jsxRuntimeExports.jsx("div", {
|
|
@@ -21779,12 +22633,20 @@
|
|
|
21779
22633
|
};
|
|
21780
22634
|
}
|
|
21781
22635
|
|
|
21782
|
-
|
|
21783
|
-
|
|
21784
|
-
|
|
21785
|
-
|
|
21786
|
-
|
|
21787
|
-
|
|
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
|
+
*/
|
|
21788
22650
|
|
|
21789
22651
|
const CHANNEL_HOSTS = {
|
|
21790
22652
|
whatsapp: ['wa.me', 'api.whatsapp.com'],
|
|
@@ -21801,20 +22663,21 @@
|
|
|
21801
22663
|
function normalizeChannelLinks(links) {
|
|
21802
22664
|
if (!Array.isArray(links)) return [];
|
|
21803
22665
|
const out = [];
|
|
21804
|
-
for (
|
|
22666
|
+
for (let i = 0; i < links.length; i += 1) {
|
|
22667
|
+
const link = links[i];
|
|
21805
22668
|
if (!link || typeof link !== 'object') continue;
|
|
21806
22669
|
const type = typeof link.type === 'string' ? link.type.toLowerCase() : '';
|
|
21807
|
-
const hosts = CHANNEL_HOSTS[type];
|
|
22670
|
+
const hosts = Object.prototype.hasOwnProperty.call(CHANNEL_HOSTS, type) ? CHANNEL_HOSTS[type] : undefined;
|
|
21808
22671
|
if (!hosts || typeof link.url !== 'string') continue;
|
|
21809
22672
|
let parsed;
|
|
21810
22673
|
try {
|
|
21811
22674
|
parsed = new URL(link.url);
|
|
21812
|
-
} catch {
|
|
22675
|
+
} catch (e) {
|
|
21813
22676
|
continue;
|
|
21814
22677
|
}
|
|
21815
|
-
if (parsed.protocol !== 'https:' ||
|
|
22678
|
+
if (parsed.protocol !== 'https:' || hosts.indexOf(parsed.hostname.toLowerCase()) === -1) continue;
|
|
21816
22679
|
out.push({
|
|
21817
|
-
type,
|
|
22680
|
+
type: type,
|
|
21818
22681
|
url: parsed.toString(),
|
|
21819
22682
|
label: typeof link.label === 'string' && link.label.trim() ? link.label.trim() : CHANNEL_LABELS[type]
|
|
21820
22683
|
});
|
|
@@ -21839,6 +22702,30 @@
|
|
|
21839
22702
|
const links = reactExports.useMemo(() => normalizeChannelLinks(channelLinks), [channelLinks]);
|
|
21840
22703
|
const [pickerOpen, setPickerOpen] = reactExports.useState(false);
|
|
21841
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
|
+
};
|
|
21842
22729
|
const launcherBg = primaryColor;
|
|
21843
22730
|
const iconColor = headerTextColor || "#FFFFFF";
|
|
21844
22731
|
const handleLauncherClick = () => {
|
|
@@ -21867,9 +22754,12 @@
|
|
|
21867
22754
|
};
|
|
21868
22755
|
return /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
21869
22756
|
className: `relative ${className || ""}`,
|
|
21870
|
-
children: [
|
|
22757
|
+
children: [pickerVisible && /*#__PURE__*/jsxRuntimeExports.jsxs("div", {
|
|
22758
|
+
ref: pickerRef,
|
|
21871
22759
|
role: "menu",
|
|
21872
22760
|
"aria-label": t("chooseChannel"),
|
|
22761
|
+
tabIndex: -1,
|
|
22762
|
+
onKeyDown: handlePickerKeyDown,
|
|
21873
22763
|
"data-testid": "channel-picker",
|
|
21874
22764
|
style: {
|
|
21875
22765
|
position: "absolute",
|
|
@@ -21898,7 +22788,7 @@
|
|
|
21898
22788
|
children: link.label
|
|
21899
22789
|
}, `${link.type}-${link.url}`))]
|
|
21900
22790
|
}), /*#__PURE__*/jsxRuntimeExports.jsxs("button", {
|
|
21901
|
-
ref:
|
|
22791
|
+
ref: setLauncherRef,
|
|
21902
22792
|
onClick: handleLauncherClick,
|
|
21903
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",
|
|
21904
22794
|
style: {
|
|
@@ -21943,7 +22833,7 @@
|
|
|
21943
22833
|
* value by its own test (that constant sat at 0.1.113 while this package was
|
|
21944
22834
|
* at 0.2.2 precisely because nothing enforced it - EV-2431).
|
|
21945
22835
|
*/
|
|
21946
|
-
const WIDGET_VERSION = '0.2.
|
|
22836
|
+
const WIDGET_VERSION = '0.2.29';
|
|
21947
22837
|
|
|
21948
22838
|
/**
|
|
21949
22839
|
* API utility functions
|