@katechat/ui 1.1.9 → 1.1.10
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/esm/index.js
CHANGED
|
@@ -448,7 +448,7 @@ $$${n}$$`):""}function Os(e,t=!1){return e?t?[Wk.parse(e,{renderer:Lr})]:(e=Vk(e
|
|
|
448
448
|
</svg>
|
|
449
449
|
<span class="action-btn-label">${ce.label}</span>
|
|
450
450
|
</div>`:"";ot.innerHTML=fe.replaceAll("<LANG>",Ne).replace("<EXECUTE_BTN>",tt).replace("<DOWNLOAD_TITLE>",z).replace("<COPY_TITLE>",X),Ke.appendChild(ot),Te.parentNode?.insertBefore(Ke,Te),Ke.appendChild(Te)}}),W.current.querySelectorAll("img").forEach(Te=>{if(!Te?.classList?.contains("message-image")){Te.classList.add("message-image");let ot=Te.src.split("/").pop()||"";Te.setAttribute("data-file-name",ot)}}),W.current.querySelectorAll("table").forEach(Te=>{if(!Te?.classList?.contains("message-table")){if(Te.classList.add("message-table"),!Te.tFoot){let Ne=document.createElement("tfoot");Te.appendChild(Ne);let Ke=document.createElement("tr");Ke.className="table-controls-row",Ne.appendChild(Ke);let ce=document.createElement("th");ce.classList.add("table-controls"),ce.colSpan=Te.querySelectorAll("th").length||1,Ke.appendChild(ce)}let ot=Te.querySelector("tfoot tr .table-controls");ot.innerHTML=Ee.replace("<COPY_CSV_TITLE>",J).replace("<DOWNLOAD_CSV_TITLE>",re);let We=0;Te.querySelectorAll("th").forEach(Ne=>{Ne.classList.contains("table-controls")||(Ne.classList.add("table-sort-btn"),Ne.setAttribute("data-col-index",String(We++)))})}}))},xi+10),[z,X,J,re,d]);Vv(()=>{if(!D&&W.current){let Te=new MutationObserver(me);return Te.observe(W.current,{childList:!0,subtree:!0}),me(),()=>Te.disconnect()}},[u,D,me]);let ve=()=>le(Te=>!Te),ke=mr(()=>s?s(t):null,[s,t]),Fe=mr(()=>{let Te=o?o(t):null,ot=l?.find(We=>We.modelId===t?.modelId);return Ce.createElement(Ce.Fragment,null,Ce.createElement(Ds,{align:"center",p:"0"},Ce.createElement(Ds,{gap:"sm",wrap:"nowrap",p:"0"},Ce.createElement(m3,{color:"gray",radius:"xl",size:"md",src:xe?t?.user?.avatarUrl:void 0},xe?Ce.createElement(b3,null):ot?Ce.createElement(Di,{apiProvider:ot.apiProvider,provider:ot.provider}):Ce.createElement(Qv,null)),Ce.createElement(wd,{size:"sm",fw:500,c:xe?"blue":"teal"},be),Ce.createElement(wd,{size:"sm",c:"dimmed"},ge)),Ce.createElement(Ds,{p:"0"},G&&Ce.createElement(Po,{status:G}),U&&G!=="reasoning"&&Ce.createElement(wd,{size:"sm",c:"dimmed"},U))),Ce.createElement(ws,{className:["katechat-message-content",D?"streaming":""].join(" ")},Ce.createElement(Oi,{status:G,content:T,statusInfo:U,streaming:D}),R?R.map((We,Ne)=>Ce.createElement("div",{key:Ne,dangerouslySetInnerHTML:{__html:We}})):Ce.createElement("div",null,T),Ce.createElement(ws,{className:"katechat-message-footer"},Ce.createElement(Bo,{messageId:p,messageIndex:n}),ke&&Ce.createElement(qv,{label:$("Details"),position:"top",withArrow:!0},Ce.createElement(Md,{className:"edit-message-btn","data-message-id":p,size:"sm",variant:"subtle",color:"gray",disabled:a,onClick:ve},Q?Ce.createElement(h3,null):Ce.createElement(f3,null))),Te),Ce.createElement(g3,{in:Q},Ce.createElement(ws,{className:"katechat-message-content-details"},ke))))},[u,be,ge,T,R,p,E,h,l,n,Y,ke,Q,D,ie.language]),[Ye,Je]=Ce.useState(0),[Et,ct]=Ce.useState("idle"),[yt,vt]=Ce.useState(!1);Vv(()=>{if(!M||M.length===0)return;let Te=M.findIndex(ot=>ot.streaming);Te>=0&&Je(Te)},[M]);let Xt=mr(()=>!M||M.length===0?[]:M.map(Te=>Ce.createElement(kd,{key:Te.id,message:Te,parentIndex:n,index:Ye,models:l,plugins:o?.(Te)})),[M,l,n,ie.language]),Ct=mr(()=>{if(!M||M.length===0)return null;let Te=M.length,ot=Ke=>{Ke.stopPropagation(),!yt&&(vt(!0),ct("exit-right"),setTimeout(()=>{Je(ce=>(ce-1+Te)%Te),ct("enter-left"),setTimeout(()=>{ct("idle"),vt(!1)},xi)},xi))},We=Ke=>{Ke.stopPropagation(),!yt&&(vt(!0),ct("exit-left"),setTimeout(()=>{Je(ce=>(ce+1)%Te),ct("enter-right"),setTimeout(()=>{ct("idle"),vt(!1)},xi)},xi))},Ne=Xt[Ye];return Ce.createElement("div",{className:"katechat-message-carousel"},Ce.createElement("div",{className:"message-carousel-header"},Ce.createElement("div",{className:"message-carousel-controls"},Te>1&&Ce.createElement(Ce.Fragment,null,Ce.createElement(Md,{onClick:ot,"aria-label":"Previous",radius:"xl",variant:"light"},Ce.createElement(E3,null)),Ce.createElement(Md,{onClick:We,"aria-label":"Next",radius:"xl",variant:"light"},Ce.createElement(S3,null))))),Ce.createElement("div",{className:`carousel-message-content animation-${Et}`},Ne),Te>1&&Ce.createElement(Ds,{className:"carousel-model-icons"},M.map((Ke,ce)=>{let tt=l?.find(qe=>qe.modelId===Ke.modelId),dt=ce===Ye;return Ce.createElement(qv,{key:Ke.id,label:tt?.name||$("AI"),position:"top"},Ce.createElement(ws,{key:Ke.id,c:dt?void 0:"dimmed",onClick:()=>Je(ce)},tt?Ce.createElement(Di,{apiProvider:tt.apiProvider,provider:tt.provider,size:20}):Ce.createElement(Qv,{size:20})))})))},[Xt,ie.language,Ye,Et,yt]);return Ct?Ce.createElement("div",{id:`message-${t.id}`,className:["katechat-message",`katechat-message__${u||""}`].join(" "),ref:W},Ce.createElement("div",{className:"katechat-message-linked-toggle"},Ce.createElement(p3,{checked:q,onChange:Te=>te(Te.currentTarget.checked),label:$(q?"Main":"Others"),size:"sm"})),Ce.createElement("div",{className:["katechat-message-main",q?"":"hidden"].join(" ")},Fe),Ce.createElement("div",{className:["katechat-message-linked",q?"hidden":""].join(" ")},Ct)):Ce.createElement("div",{id:`message-${t.id}`,className:["katechat-message",`katechat-message__${u||""}`].join(" "),ref:W},Ce.createElement("div",{className:"katechat-message-main"},Fe))});Ld.displayName="ChatMessage";import wi from"react";import{ScrollArea as v3}from"@mantine/core";var uU=({html:e,text:t})=>wi.createElement(v3,{type:"hover",offsetScrollbars:!0,className:["katechat-message-content","katechat-message-preview"].join(" ")},t?wi.createElement(wi.Fragment,null,e?e.map((n,a)=>wi.createElement("div",{key:a,dangerouslySetInnerHTML:{__html:n}})):wi.createElement("div",null,t)):"...");import Kt,{useMemo as x3}from"react";import{Text as Xv,Group as Zv,Avatar as D3,Box as w3}from"@mantine/core";import{IconRobot as M3}from"@tabler/icons-react";import pr from"react";import{IconBrandOpenai as C3,IconBrandAws as Kv,IconBrandYandex as R3,IconMessageChatbot as I3,IconAi as A3,IconBrandMeta as N3,IconBrandMedium as y3,IconBrandGoogle as O3}from"@tabler/icons-react";var Di=({apiProvider:e,provider:t,size:n=24})=>{switch(e){case"OPEN_AI":return pr.createElement(C3,{size:n});case"AWS_BEDROCK":switch(t?.toLowerCase()){case"amazon":return pr.createElement(Kv,{size:n});case"anthropic":return pr.createElement(A3,{size:n});case"mistral ai":return pr.createElement(y3,{size:n});case"meta":return pr.createElement(N3,{size:n});default:return pr.createElement(Kv,{size:n})}case"YANDEX_FM":return pr.createElement(R3,{size:n});case"GOOGLE_VERTEX_AI":return pr.createElement(O3,{size:n});default:return pr.createElement(I3,{size:n})}};var kd=({message:e,parentIndex:t,index:n,plugins:a,models:o})=>{let s=x3(()=>o?.find(l=>l.modelId===e.modelId),[o,e.modelId]);return Kt.createElement(w3,{key:e.id,"data-linked-message-id":e.id},Kt.createElement(Zv,{align:"center",pt:"sm"},Kt.createElement(D3,{radius:"xl",size:"md"},s?Kt.createElement(Di,{apiProvider:s.apiProvider,provider:s.provider}):Kt.createElement(M3,null)),Kt.createElement(Zv,{gap:"xs"},Kt.createElement(Xv,{size:"sm",fw:500,c:"teal"},e.modelName),e.status&&Kt.createElement(Po,{status:e.status}),e.statusInfo&&e.status!=="reasoning"&&Kt.createElement(Xv,{size:"xs",c:"dimmed"},e.statusInfo))),Kt.createElement("div",{className:"katechat-message-content"},Kt.createElement(Oi,{status:e.status,content:e.content,statusInfo:e.statusInfo,streaming:e.streaming||!1}),e.html?e.html.map((l,d)=>Kt.createElement("div",{key:d,dangerouslySetInnerHTML:{__html:l}})):Kt.createElement("div",null,e.content),Kt.createElement("div",{className:"katechat-message-footer"},Kt.createElement(Bo,{messageId:e.id,messageIndex:t,linkedMessageIndex:n}),a)))};kd.displayName="LinkedChatMessage";import rt,{forwardRef as V3,useCallback as Fd,useEffect as eC,useImperativeHandle as q3,useMemo as Q3,useRef as $3,useState as ks}from"react";import{Text as Ud,Textarea as K3,Button as tC,Group as nC,ActionIcon as rC,Stack as X3,Tooltip as Z3,Menu as Gd}from"@mantine/core";import{IconCirclePlus as J3,IconPlayerStopFilled as j3,IconSend as eP,IconX as tP}from"@tabler/icons-react";import{notifications as La}from"@mantine/notifications";import gr,{useState as L3,useCallback as Ms,useRef as Jv,useEffect as k3}from"react";import{Group as P3,Tooltip as B3,Box as jv,ActionIcon as F3}from"@mantine/core";import{IconFileUpload as U3}from"@tabler/icons-react";import{useTranslation as G3}from"react-i18next";var Mi={dropzone:"_dropzone_16zca_1",dragging:"_dragging_16zca_8",disabled:"_disabled_16zca_12"};var Y3=["image/jpeg","image/png","image/webp"],Pd=({onFilesAdd:e,disabled:t,uploadFormats:n=Y3})=>{let[a,o]=L3(!1),s=Jv(null),l=Jv(null),{t:d}=G3();k3(()=>{let R=I=>{if(!t&&I.clipboardData&&I.clipboardData.items){let A=Array.from(I.clipboardData.items).map(D=>D.getAsFile()).filter(Ni);A.length>0&&(I.preventDefault(),I.stopPropagation(),e(A))}};return document.addEventListener("paste",R),()=>{document.removeEventListener("paste",R)}},[e,t]);let u=Ms(R=>{R.preventDefault(),R.stopPropagation(),o(!0)},[]),p=Ms(R=>{R.preventDefault(),R.stopPropagation(),o(!1)},[]),E=Ms(R=>{if(R.preventDefault(),R.stopPropagation(),o(!1),t)return;let I=R.dataTransfer.files&&R.dataTransfer.files.length>0?Array.from(R.dataTransfer.files).filter(A=>A.size>0):[];e(I)},[e]),h=Ms(R=>{if(R.target.files&&R.target.files.length>0){let I=Array.from(R.target.files).filter(A=>A.size>0);I.length&&e(I),l.current&&(l.current.value="")}},[e]),T=()=>{t||l.current?.click()};return gr.createElement(gr.Fragment,null,gr.createElement(jv,{ref:s,className:`drop-zone ${Mi.dropzone} ${a?Mi.dragging:""} ${t?Mi.disabled:""}`,onDragOver:u,onDragLeave:p,onDrop:E,onClick:T},gr.createElement(P3,{justify:"start",className:"drop-zone-control",gap:"xs"},gr.createElement(B3,{label:d("Click or drop an image/document here to upload"),position:"top"},gr.createElement(F3,{variant:"default",size:"lg"},gr.createElement(U3,{size:"24"}))),gr.createElement(jv,{hiddenFrom:"xs",pe:"sm"},d("Upload File")),gr.createElement("input",{ref:l,type:"file",multiple:!0,accept:n?.join(","),onChange:h,className:Mi.fileInput,style:{display:"none"},disabled:t}))))};import Ls from"react";import{Text as z3}from"@mantine/core";import{IconFileUpload as H3}from"@tabler/icons-react";var Bd={overlay:"_overlay_vjudp_1",content:"_content_vjudp_16"};import{useTranslation as W3}from"react-i18next";var t9=({visible:e,message:t,onDragOver:n,onDragLeave:a,onDrop:o})=>{let{t:s}=W3();return e?Ls.createElement("div",{className:Bd.overlay,onDragOver:n,onDragLeave:a,onDrop:o},Ls.createElement("div",{className:Bd.content},Ls.createElement(H3,{size:48,color:"var(--mantine-color-blue-4)"}),Ls.createElement(z3,{size:"lg",fw:500,c:"blue.4"},t||s("Drop files here to upload")))):null};import{useTranslation as nP}from"react-i18next";var Gt={chatControlsContainer:"_chatControlsContainer_sg9gr_1",chatInputContainer:"_chatInputContainer_sg9gr_4",chatInputGroup:"_chatInputGroup_sg9gr_7",chatInput:"_chatInput_sg9gr_4",hidden:"_hidden_sg9gr_22",promptMode:"_promptMode_sg9gr_34",promptModeText:"_promptModeText_sg9gr_41",promptFadeInUp:"_promptFadeInUp_sg9gr_1",promptShimmer:"_promptShimmer_sg9gr_1",headerRow:"_headerRow_sg9gr_71",documentsInput:"_documentsInput_sg9gr_89",columned:"_columned_sg9gr_95",imagesList:"_imagesList_sg9gr_103",previewImage:"_previewImage_sg9gr_108",removeButton:"_removeButton_sg9gr_120"};var h9=V3(({loadCompleted:e=!1,disabled:t=!1,promptMode:n=!1,promptText:a,uploadAllowed:o=!0,streaming:s,setSending:l,previousMessages:d=[],header:u,inputPlugins:p,uploadFormats:E,maxUploadFileSize:h=64*1024*1024,maxImagesCount:T=0,onSendMessage:R,onStopRequest:I,onDocumentsUpload:A},D)=>{let[M,G]=ks(""),[U,W]=ks([]),[Y,q]=ks(0),[te,Q]=ks(!1),le=$3(null),{t:$}=nP();q3(D,()=>({handleAddFiles:X=>fe(X)})),eC(()=>{le.current?.focus()},[e,t]),eC(()=>{q(d?.length?d.length:0)},[e,d]);let ie=async()=>{if(!(!M?.trim()&&!U.length)){l(!0);try{G(""),W([]),await R(M,U)}catch(X){La.show({title:"Error",message:X instanceof Error?X.message:$("Failed to send message"),color:"red"})}finally{l(!1)}}},ge=Fd(X=>{let J=!M?.trim();if(X.key==="Enter"&&!X.shiftKey&&!X.altKey)X.preventDefault(),ie(),Q(!1);else if(X.key==="ArrowUp"&&(J||te)){let re=Math.max(0,Y-1);G(d[re]),q(re),Q(!0)}else if(X.key==="ArrowDown"&&(J||te)){let re=Math.min(d.length-1,Y+1);G(d[re]),q(re),Q(!0)}else Q(!1)},[ie,M,d,Y]),xe=Fd(X=>{G(X.currentTarget.value)},[]),be=Q3(()=>t||s||!M?.trim()&&!U.length,[M,U,s,t]),fe=Fd(X=>{let J=X.filter(me=>me.size<h);J.length<X.length&&La.show({title:$("Warning"),message:$("Some files are too large and were not added (max size: {{size}} MB)",{size:h/(1024*1024)}),color:"yellow"});let re=J.filter(me=>me.type?.startsWith("image/")),Ee=J.filter(me=>!me.type?.startsWith("image/"));re.length&&T<=0&&(La.show({title:$("Warning"),message:$("Image uploads are not allowed in this chat."),color:"yellow"}),re=[]),re.length+U.length>T&&(La.show({title:$("Warning"),message:$("You can only add up to {{count}} images at a time",{count:T}),color:"yellow"}),re=re.slice(0,T-U.length)),re.length&&Promise.all(re.map(me=>new Promise((ve,ke)=>{let Fe=new FileReader;Fe.onload=Ye=>{if(Ye.target?.result){let Je=Ye.target.result;ve({fileName:me.name,mimeType:me.type,bytesBase64:Je})}else ke(new Error($("Failed to read file: {{fileName}}",{fileName:me.name})))},Fe.onerror=Ye=>{ke(new Error($("Failed to read file: {{fileName}}, error: {{error}}",{fileName:me.name,error:Ye})))},Fe.readAsDataURL(me)}))).then(me=>{W(ve=>[...ve,...me])}).catch(me=>{La.show({title:$("Error"),message:me.message||$("Failed to read image files"),color:"red"})}),Ee.length&&A?A(Ee):Ee.length&&La.show({title:$("Warning"),message:$("Document upload is not available in this chat."),color:"orange"})},[U,A,T,h]),z=X=>J=>{J.stopPropagation(),W(re=>re.filter(Ee=>Ee.fileName!==X))};return rt.createElement("div",{className:[Gt.chatControlsContainer,n?Gt.promptMode:"",e?"":Gt.hidden].join(" ")},n?rt.createElement(X3,{align:"center",justify:"center",gap:"md",mb:"lg"},rt.createElement(Ud,{c:"dimmed",size:"lg",ta:"center",className:Gt.promptModeText},a||$("Start the conversation by sending a message"))):null,rt.createElement("div",{className:Gt.chatControls},u&&rt.createElement(nC,{align:"center",gap:"xs",className:Gt.headerRow},u),rt.createElement("div",{className:[Gt.chatInputContainer,U.length?Gt.columned:""].join(" ")},o&&rt.createElement("div",{className:Gt.documentsInput},rt.createElement(nC,{visibleFrom:"xs",gap:"xs"},rt.createElement(Pd,{onFilesAdd:fe,uploadFormats:E}),p),U?.length>0&&rt.createElement("div",{className:Gt.imagesList},U.map(X=>rt.createElement("div",{key:X.fileName,className:Gt.previewImage},rt.createElement("img",{src:X.bytesBase64,alt:X.fileName}),rt.createElement(rC,{className:Gt.removeButton,color:"red.9",size:"xs",onClick:z(X.fileName)},rt.createElement(tP,{size:16})))))),rt.createElement("div",{className:Gt.chatInputGroup},o&&rt.createElement(Gd,{shadow:"md",width:"content"},rt.createElement(Gd.Target,null,rt.createElement(rC,{size:"lg",variant:"subtle",hiddenFrom:"xs"},rt.createElement(Z3,{label:$("More..."),position:"right",withArrow:!0},rt.createElement(J3,{size:"24"})))),rt.createElement(Gd.Dropdown,null,rt.createElement(Pd,{onFilesAdd:fe,uploadFormats:E}),p)),rt.createElement(K3,{ref:le,className:Gt.chatInput,placeholder:$("Type your message..."),value:M||"",autosize:!0,minRows:1,maxRows:7,onChange:xe,onKeyDown:ge,disabled:t}),I&&s?rt.createElement(tC,{onClick:I,disabled:t},rt.createElement(j3,{size:24})," ",rt.createElement(Ud,{visibleFrom:"md"},$("Stop"))):rt.createElement(tC,{onClick:ie,disabled:be,className:I&&s?Gt.hidden:"",radius:"md"},rt.createElement(eP,{size:24})," ",rt.createElement(Ud,{visibleFrom:"md",ml:"xs"},$("Send")))))))});import Er,{useCallback as Li,useRef as hP,useState as Hd}from"react";import{Stack as bP}from"@mantine/core";import{notifications as Wd}from"@mantine/notifications";import{useTranslation as TP}from"react-i18next";import En,{useEffect as dP,useCallback as uC}from"react";import{Image as uP,Text as Ps,Group as _C,Stack as _P,ActionIcon as mP,Tooltip as pP,Drawer as gP}from"@mantine/core";import{useDisclosure as EP}from"@mantine/hooks";import{IconExternalLink as SP}from"@tabler/icons-react";var cC=sc(cc(),1);import lC from"i18next";import{initReactI18next as sP}from"react-i18next";import lP from"i18next-browser-languagedetector";var aC={AI:"AI","Are you sure you want to delete this item? This action cannot be undone.":"Are you sure you want to delete this item? This action cannot be undone.",Cancel:"Cancel",Cancelled:"Cancelled","Click or drop an image/document here to upload":"Click or drop an image/document here to upload","Code block is empty":"Code block is empty","Code Interpreter":"Code Interpreter",Completed:"Completed","Confirm Deletion":"Confirm Deletion",Copy:"Copy","Copy CSV":"Copy CSV","Copy message":"Copy message",Delete:"Delete",Details:"Details","Document upload is not available in this chat.":"Document upload is not available in this chat.",Download:"Download","Download CSV":"Download CSV","Drop files here to upload":"Drop files here to upload",Error:"Error","Failed to copy message":"Failed to copy message","Failed to read file: {{fileName}}":"Failed to read file: {{fileName}}","Failed to read file: {{fileName}}, error: {{error}}":"Failed to read file: {{fileName}}, error: {{error}}","Failed to read image files":"Failed to read image files","Failed to send message":"Failed to send message","Image Preview":"Image Preview","Image uploads are not allowed in this chat.":"Image uploads are not allowed in this chat.","In Progress":"In Progress",language:{de:"Deutsch",en:"English",label:"Language",ru:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",zh:"\u4E2D\u6587"},"Language is not specified for this code block":"Language is not specified for this code block",Main:"Main","More...":"More...","Open image source":"Open image source",Others:"Others","RAG Search":"RAG Search",Reasoning:"Reasoning",Send:"Send","Some files are too large and were not added (max size: {{size}} MB)":"Some files are too large and were not added (max size: {{size}} MB)",source:"source","Start the conversation by sending a message":"Start the conversation by sending a message",Started:"Started",Stop:"Stop","Tool Call":"Tool Call","Tool Call Completed":"Tool Call Completed","Type your message...":"Type your message...","Upload File":"Upload File",Warning:"Warning","Web Search":"Web Search",You:"You","You can only add up to {{count}} images at a time":"You can only add up to {{count}} images at a time"};var iC={AI:"KI","Are you sure you want to delete this item? This action cannot be undone.":"M\xF6chten Sie dieses Element wirklich l\xF6schen? Diese Aktion kann nicht r\xFCckg\xE4ngig gemacht werden.",Cancel:"Abbrechen",Cancelled:"Abgebrochen","Click or drop an image/document here to upload":"Klicken oder Bild/Dokument hierher ziehen zum Hochladen","Code block is empty":"Codeblock ist leer","Code Interpreter":"Code-Interpreter",Completed:"Abgeschlossen","Confirm Deletion":"L\xF6schen best\xE4tigen",Copy:"Kopieren","Copy CSV":"CSV kopieren","Copy message":"Nachricht kopieren",Delete:"L\xF6schen",Details:"Details","Document upload is not available in this chat.":"Dokumenten-Upload ist in diesem Chat nicht verf\xFCgbar.",Download:"Herunterladen","Download CSV":"CSV herunterladen","Drop files here to upload":"Dateien zum Hochladen hier ablegen",Error:"Fehler","Failed to copy message":"Nachricht konnte nicht kopiert werden","Failed to read file: {{fileName}}":"Datei konnte nicht gelesen werden: {{fileName}}","Failed to read file: {{fileName}}, error: {{error}}":"Datei konnte nicht gelesen werden: {{fileName}}, Fehler: {{error}}","Failed to read image files":"Bilddateien konnten nicht gelesen werden","Failed to send message":"Nachricht konnte nicht gesendet werden","Image Preview":"Bildvorschau","Image uploads are not allowed in this chat.":"Bild-Uploads sind in diesem Chat nicht erlaubt.","In Progress":"In Bearbeitung",language:{de:"Deutsch",en:"English",label:"Sprache",ru:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",zh:"\u4E2D\u6587"},"Language is not specified for this code block":"F\xFCr diesen Codeblock ist keine Sprache angegeben",Main:"Haupt","More...":"Mehr...","Open image source":"Bildquelle \xF6ffnen",Others:"Andere","RAG Search":"RAG-Suche",Reasoning:"Argumentation",Send:"Senden","Some files are too large and were not added (max size: {{size}} MB)":"Einige Dateien sind zu gro\xDF und wurden nicht hinzugef\xFCgt (max. Gr\xF6\xDFe: {{size}} MB)",source:"Quelle","Start the conversation by sending a message":"Beginnen Sie das Gespr\xE4ch, indem Sie eine Nachricht senden",Started:"Gestartet",Stop:"Stopp","Tool Call":"Tool-Aufruf","Tool Call Completed":"Tool-Aufruf abgeschlossen","Type your message...":"Nachricht eingeben...","Upload File":"Datei hochladen",Warning:"Warnung","Web Search":"Websuche",You:"Sie","You can only add up to {{count}} images at a time":"Sie k\xF6nnen nur bis zu {{count}} Bilder gleichzeitig hinzuf\xFCgen"};var oC={AI:"\u0418\u0418","Are you sure you want to delete this item? This action cannot be undone.":"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442? \u042D\u0442\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043D\u0435\u043B\u044C\u0437\u044F \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C.",Cancel:"\u041E\u0442\u043C\u0435\u043D\u0430",Cancelled:"\u041E\u0442\u043C\u0435\u043D\u0435\u043D\u043E","Click or drop an image/document here to upload":"\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435/\u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0441\u044E\u0434\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438","Code block is empty":"\u0411\u043B\u043E\u043A \u043A\u043E\u0434\u0430 \u043F\u0443\u0441\u0442","Code Interpreter":"\u0418\u043D\u0442\u0435\u0440\u043F\u0440\u0435\u0442\u0430\u0442\u043E\u0440 \u043A\u043E\u0434\u0430",Completed:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E","Confirm Deletion":"\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435",Copy:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C","Copy CSV":"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C CSV","Copy message":"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435",Delete:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",Details:"\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438","Document upload is not available in this chat.":"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0432 \u044D\u0442\u043E\u043C \u0447\u0430\u0442\u0435.",Download:"\u0421\u043A\u0430\u0447\u0430\u0442\u044C","Download CSV":"\u0421\u043A\u0430\u0447\u0430\u0442\u044C CSV","Drop files here to upload":"\u041F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0444\u0430\u0439\u043B\u044B \u0441\u044E\u0434\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438",Error:"\u041E\u0448\u0438\u0431\u043A\u0430","Failed to copy message":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435","Failed to read file: {{fileName}}":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u0444\u0430\u0439\u043B: {{fileName}}","Failed to read file: {{fileName}}, error: {{error}}":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u0444\u0430\u0439\u043B: {{fileName}}, \u043E\u0448\u0438\u0431\u043A\u0430: {{error}}","Failed to read image files":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u0444\u0430\u0439\u043B\u044B \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439","Failed to send message":"\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435","Image Preview":"\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F","Image uploads are not allowed in this chat.":"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u0432 \u044D\u0442\u043E\u043C \u0447\u0430\u0442\u0435 \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u0430.","In Progress":"\u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435",language:{de:"Deutsch",en:"English",label:"\u042F\u0437\u044B\u043A",ru:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",zh:"\u4E2D\u6587"},"Language is not specified for this code block":"\u042F\u0437\u044B\u043A \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0431\u043B\u043E\u043A\u0430 \u043A\u043E\u0434\u0430",Main:"\u041E\u0441\u043D\u043E\u0432\u043D\u043E\u0439","More...":"\u0415\u0449\u0451...","Open image source":"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",Others:"\u0414\u0440\u0443\u0433\u0438\u0435","RAG Search":"RAG-\u043F\u043E\u0438\u0441\u043A",Reasoning:"\u0420\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043D\u0438\u0435",Send:"\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C","Some files are too large and were not added (max size: {{size}} MB)":"\u041D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0444\u0430\u0439\u043B\u044B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438 \u043D\u0435 \u0431\u044B\u043B\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B (\u043C\u0430\u043A\u0441. \u0440\u0430\u0437\u043C\u0435\u0440: {{size}} \u041C\u0411)",source:"\u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A","Start the conversation by sending a message":"\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0434\u0438\u0430\u043B\u043E\u0433, \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435",Started:"\u041D\u0430\u0447\u0430\u0442\u043E",Stop:"\u0421\u0442\u043E\u043F","Tool Call":"\u0412\u044B\u0437\u043E\u0432 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430","Tool Call Completed":"\u0412\u044B\u0437\u043E\u0432 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043D","Type your message...":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435...","Upload File":"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0430\u0439\u043B",Warning:"\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","Web Search":"\u0412\u0435\u0431-\u043F\u043E\u0438\u0441\u043A",You:"\u0412\u044B","You can only add up to {{count}} images at a time":"\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0435 \u0431\u043E\u043B\u0435\u0435 {{count}} \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u0437\u0430 \u0440\u0430\u0437"};var sC={AI:"AI","Are you sure you want to delete this item? This action cannot be undone.":"\u60A8\u786E\u5B9A\u8981\u5220\u9664\u6B64\u9879\u5417\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u6D88\u3002",Cancel:"\u53D6\u6D88",Cancelled:"\u5DF2\u53D6\u6D88","Click or drop an image/document here to upload":"\u70B9\u51FB\u6216\u62D6\u653E\u56FE\u7247/\u6587\u6863\u5230\u6B64\u5904\u4E0A\u4F20","Code block is empty":"\u4EE3\u7801\u5757\u4E3A\u7A7A","Code Interpreter":"\u4EE3\u7801\u89E3\u91CA\u5668",Completed:"\u5DF2\u5B8C\u6210","Confirm Deletion":"\u786E\u8BA4\u5220\u9664",Copy:"\u590D\u5236","Copy CSV":"\u590D\u5236 CSV","Copy message":"\u590D\u5236\u6D88\u606F",Delete:"\u5220\u9664",Details:"\u8BE6\u60C5","Document upload is not available in this chat.":"\u6B64\u804A\u5929\u4E0D\u652F\u6301\u6587\u6863\u4E0A\u4F20\u3002",Download:"\u4E0B\u8F7D","Download CSV":"\u4E0B\u8F7D CSV","Drop files here to upload":"\u5C06\u6587\u4EF6\u62D6\u653E\u5230\u6B64\u5904\u4E0A\u4F20",Error:"\u9519\u8BEF","Failed to copy message":"\u590D\u5236\u6D88\u606F\u5931\u8D25","Failed to read file: {{fileName}}":"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A{{fileName}}","Failed to read file: {{fileName}}, error: {{error}}":"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A{{fileName}}\uFF0C\u9519\u8BEF\uFF1A{{error}}","Failed to read image files":"\u8BFB\u53D6\u56FE\u7247\u6587\u4EF6\u5931\u8D25","Failed to send message":"\u53D1\u9001\u6D88\u606F\u5931\u8D25","Image Preview":"\u56FE\u7247\u9884\u89C8","Image uploads are not allowed in this chat.":"\u6B64\u804A\u5929\u4E0D\u5141\u8BB8\u4E0A\u4F20\u56FE\u7247\u3002","In Progress":"\u8FDB\u884C\u4E2D",language:{de:"Deutsch",en:"English",label:"\u8BED\u8A00",ru:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",zh:"\u4E2D\u6587"},"Language is not specified for this code block":"\u6B64\u4EE3\u7801\u5757\u672A\u6307\u5B9A\u8BED\u8A00",Main:"\u4E3B\u8981","More...":"\u66F4\u591A...","Open image source":"\u6253\u5F00\u56FE\u7247\u6765\u6E90",Others:"\u5176\u4ED6","RAG Search":"RAG \u641C\u7D22",Reasoning:"\u63A8\u7406",Send:"\u53D1\u9001","Some files are too large and were not added (max size: {{size}} MB)":"\u90E8\u5206\u6587\u4EF6\u8FC7\u5927\uFF0C\u672A\u88AB\u6DFB\u52A0\uFF08\u6700\u5927\uFF1A{{size}} MB\uFF09",source:"\u6765\u6E90","Start the conversation by sending a message":"\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u5BF9\u8BDD",Started:"\u5DF2\u5F00\u59CB",Stop:"\u505C\u6B62","Tool Call":"\u5DE5\u5177\u8C03\u7528","Tool Call Completed":"\u5DE5\u5177\u8C03\u7528\u5B8C\u6210","Type your message...":"\u8F93\u5165\u6D88\u606F...","Upload File":"\u4E0A\u4F20\u6587\u4EF6",Warning:"\u8B66\u544A","Web Search":"\u7F51\u7EDC\u641C\u7D22",You:"\u4F60","You can only add up to {{count}} images at a time":"\u4E00\u6B21\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{count}} \u5F20\u56FE\u7247"};var Yd=["en","de","ru","zh"],zd="ui-language";function cP(e={}){return(0,cC.merge)({en:{translation:aC},de:{translation:iC},ru:{translation:oC},zh:{translation:sC}},e)}async function k9({lookupLocalStorage:e=zd,supportedLngs:t=Yd,fallbackLng:n="en",resources:a={}}={}){return lC.use(lP).use(sP).init({resources:cP(a),fallbackLng:n,supportedLngs:t,interpolation:{escapeValue:!1},detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:e,caches:["localStorage"]}})}function dC(e){return(typeof e=="string"?new Date(e):e).toLocaleDateString(lC.language||"ru-RU",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}import{useTranslation as fP}from"react-i18next";var mC=({fileName:e,fileUrl:t,mimeType:n,createdAt:a,onOpenSource:o,sourceTitle:s,onClose:l})=>{let[d,{open:u,close:p}]=EP(!1);dP(()=>{t&&u()},[t,u]);let E=uC(()=>{l(),p()},[l,p]),h=uC(()=>{o?.(),E()},[o,E]),{t:T}=fP();return En.createElement(gP,{size:"xl",opened:d,onClose:E,title:T("Image Preview")},t&&En.createElement(_P,{gap:"md"},En.createElement(uP,{src:t,alt:e,fit:"contain",mah:"70vh"}),En.createElement(_C,{justify:"space-between"},En.createElement("div",null,En.createElement(Ps,{size:"sm",fw:500},e),En.createElement(Ps,{size:"xs",c:"dimmed"},a?dC(a)+" \u2022":""," ",n)),o&&En.createElement(_C,{gap:"xs"},En.createElement(pP,{label:T("Open image source")},En.createElement(mP,{variant:"light",onClick:h},En.createElement(SP,{size:16}))))),o&&En.createElement(Ps,{size:"sm",c:"dimmed"},"From:"," ",En.createElement(Ps,{span:!0,c:"blue",style:{cursor:"pointer"},onClick:h},s||T("source")))))};var pC=e=>[...Array.from(e.tHead?.querySelectorAll("tr")??[]),...Array.from(e.tBodies[0]?.querySelectorAll("tr")??[])].map(n=>Array.from(n.querySelectorAll("th, td")).map(a=>`"${(a.textContent||"").replace(/"/g,'""')}"`).join(",")).join(`
|
|
451
|
-
`),gC=Er.memo(({messages:e,onMessageDeleted:t,onAddMessage:n,plugins:a=[],detailsPlugins:o=[],codePlugins:s,models:l=[]})=>{let{t:d}=TP(),u=hP(null),[p,E]=Hd(),[h,T]=Hd(),[R,I]=Hd(new Set),A=Li(Y=>I(q=>new Set(q).add(Y)),[]),D=Li(Y=>{I(q=>{let te=new Set(q);return te.delete(Y),te})},[]),M=()=>{E(void 0),T(void 0)},G=Li(Y=>{if(!Y.target)return;let q=["code-run-btn","code-copy-btn","code-download-btn","code-toggle-all","copy-message-btn","code-header","message-image","table-sort-btn","table-copy-csv-btn","table-download-csv-btn"],te=Y.target;for(let $ of q){let ie=te.closest(`.${$}`);if(ie){te=ie;break}}if(!te)return;let Q=te,le=$=>{let ie=$?.parentElement;ie.classList.contains("collapsed")?($.classList.remove("collapsed"),ie&&ie.classList.remove("collapsed")):($.classList.add("collapsed"),ie&&ie.classList.add("collapsed"))};if(Q.classList.contains("code-run-btn")||Q.classList.contains("code-download-btn")){let $=Q.dataset.lang,ie=Q.classList.contains("code-run-btn"),xe=Q.closest(".code-header")?.parentElement?.querySelector(".code-data");if(xe){let be=decodeURIComponent(xe.dataset.code||"").trim();if(!be)return Wd.show({title:d("Error"),message:d("Code block is empty"),color:"red"});if(ie){if(!$)return Wd.show({title:d("Error"),message:d("Language is not specified for this code block"),color:"red"});let fe=Q.closest('[id^="message-"]'),z=fe?.id.replace("message-",""),X=z?e.find(Je=>Je.id===z):void 0,J=Q.closest("[data-linked-message-id]"),re=J?.dataset.linkedMessageId,Ee=re?X?.linkedMessages?.find(Je=>Je.id===re):X,ve=(J??fe)?.querySelectorAll(".code-block"),ke=Q.closest(".code-block"),Fe=ve&&ke?Array.from(ve).indexOf(ke):0,Ye=Ee?{messageId:Ee.id,blockIndex:Fe,messageContent:Ee.content}:void 0;s?.[$]?.execute(be,$,Ye)}else{let fe=`code.${Pv($||"txt")}`,z=new Blob([be],{type:"text/plain"}),X=URL.createObjectURL(z),J=document.createElement("a");J.href=X,J.download=fe,J.click(),URL.revokeObjectURL(X)}}}else if(Q.classList.contains("code-copy-btn")){let $=Q.parentElement?.parentElement?.nextElementSibling?.querySelector(".code-data");if($){let xe=decodeURIComponent($.dataset.code||"").trim();navigator.clipboard.writeText(xe)}let ie=Q.querySelector(".copy-icon"),ge=Q.querySelector(".check-icon");ie&&ge&&(ie.style.display="none",ge.style.display="block",setTimeout(()=>{ie.style.display="block",ge.style.display="none"},2e3))}else if(Q.classList.contains("code-header"))le(Q);else if(Q.classList.contains("code-toggle-all"))u.current?.querySelectorAll(".code-header").forEach($=>{le($)});else if(Q.classList.contains("copy-message-btn")){if(Q.dataset.messageId){let $=Q.dataset.messageIndex,ie=Q.dataset.messageLinkedIndex,ge=Q.dataset.messageId,xe=$!=null?e[Number($)]:e.find(X=>X.id===ge);ie!=null&&(xe=xe?.linkedMessages?.[Number(ie)]),Rd(xe,"Message should exist to copy");let be=(xe.content||"").trim(),fe=xe.html||[];if(fe.length&&fe[0]){let X=new Blob([fe.join("<br/>")],{type:"text/html"}),J=new Blob([be],{type:"text/plain"});navigator.clipboard.write([new ClipboardItem({[X.type]:X,[J.type]:J})]).catch(re=>Wd.show({title:d("Error"),message:re.message||d("Failed to copy message"),color:"red"}))}else navigator.clipboard.writeText(be);let z=Q.parentElement?.querySelector(".check-icon");z&&(Q.style.display="none",z.style.display="inline-block",setTimeout(()=>{Q.style.display="inline-block",z.style.display="none"},2e3))}}else if(Q.classList.contains("message-image")){let $=Q.dataset.fileName,ie=Q.src;E(ie),T($)}else if(Q.classList.contains("table-sort-btn")){let $=parseInt(Q.dataset.colIndex||"0"),ie=Q.closest("table");if(!ie)return;let ge=ie.querySelector("tbody");if(!ge)return;let be=Q.dataset.sortDir==="asc"?"desc":"asc";ie.querySelectorAll("th.table-sort-btn").forEach(z=>{delete z.dataset.sortDir,z.classList.remove("sort-asc","sort-desc")}),Q.dataset.sortDir=be,Q.classList.add(be==="asc"?"sort-asc":"sort-desc");let fe=Array.from(ge.querySelectorAll("tr"));fe.sort((z,X)=>{let J=z.querySelectorAll("td")[$]?.textContent||"",re=X.querySelectorAll("td")[$]?.textContent||"",Ee=parseFloat(J),me=parseFloat(re);return!isNaN(Ee)&&!isNaN(me)?be==="asc"?Ee-me:me-Ee:be==="asc"?J.localeCompare(re):re.localeCompare(J)}),fe.forEach(z=>ge.appendChild(z))}else if(Q.classList.contains("table-copy-csv-btn")){let $=Q.closest(".message-table");if(!$)return;navigator.clipboard.writeText(pC($));let ie=Q.querySelector(".copy-icon"),ge=Q.querySelector(".check-icon");ie&&ge&&(ie.style.display="none",ge.style.display="block",setTimeout(()=>{ie.style.display="block",ge.style.display="none"},2e3))}else if(Q.classList.contains("table-download-csv-btn")){let $=Q.closest(".message-table");if(!$)return;let ie=new Blob([pC($)],{type:"text/csv"}),ge=URL.createObjectURL(ie),xe=document.createElement("a");xe.href=ge,xe.download="table.csv",xe.click(),URL.revokeObjectURL(ge)}},[e,s]),U=Li(Y=>Er.createElement(Er.Fragment,null,a.map((q,te)=>Er.createElement(q,{key:te,message:Y,onAddMessage:n,onAction:A,onActionEnd:D,onMessageDeleted:t,disabled:R.has(Y.id)}))),[a,n,t,R,A,D]),W=Li(Y=>{let q=o.map(te=>te(Y)).filter(Ni);return q.length?q:null},[o]);return Er.createElement(Er.Fragment,null,Er.createElement(bP,{gap:"sm",ref:u,onClick:G},e.map((Y,q)=>Er.createElement(Ld,{key:Y.id,message:Y,index:q,disabled:R.has(Y.id),pluginsLoader:U,messageDetailsLoader:W,models:l,codePlugins:s}))),Er.createElement(mC,{fileName:h??"",fileUrl:p??"",onClose:M}))});import kn,{useCallback as Bs,useEffect as TC,useImperativeHandle as NP,useRef as vC,useState as yP}from"react";import{Group as OP,Loader as xP}from"@mantine/core";import{IconCircleChevronDown as DP}from"@tabler/icons-react";import{useEffect as vP,useRef as EC}from"react";function Vd(e,t,n=0){let a=EC(null),o=EC(null);return vP(()=>{a.current?.disconnect();let s=setTimeout(()=>{a.current=new IntersectionObserver(l=>{l[0].isIntersecting&&e()}),o.current&&a.current.observe(o.current)},n);return()=>{clearTimeout(s),a.current?.disconnect()}},[t,e]),o}import CP,{createContext as RP,useContext as IP,useEffect as SC}from"react";import{useLocalStorage as AP}from"@mantine/hooks";var fC=RP(void 0),i8=({children:e})=>{let[t,n]=AP({key:"ui-theme",defaultValue:"light"});SC(()=>{if(t==="auto"){let o=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.dataset.mantine=o?"dark":"light"}else document.documentElement.dataset.mantine=t},[t]);let a=()=>{let o=t==="dark"?"light":"dark";n(o),document.documentElement.dataset.mantine=o};return SC(()=>{if(t==="auto"){let o=window.matchMedia("(prefers-color-scheme: dark)"),s=l=>{document.documentElement.dataset.mantine=l.matches?"dark":"light"};return o.addEventListener("change",s),()=>o.removeEventListener("change",s)}},[t]),CP.createElement(fC.Provider,{value:{colorScheme:t,setColorScheme:n,toggleColorScheme:a}},e)},o8=()=>{let e=IP(fC);if(!e)throw new Error("useTheme must be used within a ThemeProvider");return e};import{useState as qd,useEffect as hC,useCallback as ra}from"react";function _8(e){let[t,n]=qd([]),[a,o]=qd(!0),[s,l]=qd(null);hC(()=>{let I=new Ma(e);return l(I),()=>{I.close()}},[e]);let d=ra(async()=>{if(s)try{let I=await s.getAllChats();n(I)}catch(I){console.error("Failed to load chats:",I)}finally{o(!1)}},[s]);hC(()=>{d()},[d]);let u=ra(async I=>{Ut.ok(s,"Database instance is not available");let A={id:`chat-${Date.now()}`,title:"New Chat",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return s&&(await s.saveChat(A),await d()),A},[s,d]),p=ra(async I=>{Ut.ok(s,"Database instance is not available"),await s.saveChat(I),await d()},[s,d]),E=ra(async I=>{Ut.ok(s,"Database instance is not available"),await s.deleteChat(I),await d()},[s,d]),h=ra(async(I,A)=>{let D=t.find(M=>M.id===I);D&&(Ut.ok(s,"Database instance is not available"),await s.saveChat({...D,title:A,updatedAt:new Date().toISOString()}),await d())},[t,s,d]),T=ra(async I=>{Ut.ok(s,"Database instance is not available"),await s.saveMessage(I)},[s]),R=ra(async I=>(Ut.ok(s,"Database instance is not available"),s.getMessagesByChatId(I)),[s]);return{chats:t,loading:a,createChat:u,updateChat:p,deleteChat:E,updateChatTitle:h,refreshChats:d,saveMessage:T,getChatMessages:R}}import{useState as Qd,useEffect as bC,useCallback as ka}from"react";function f8(e,t){let[n,a]=Qd([]),[o,s]=Qd(!0),[l,d]=Qd(null);bC(()=>{let I=new Ma(t);return d(I),()=>{I.close()}},[t]);let u=ka(async()=>{if(!e){a([]),s(!1);return}try{Ut.ok(l,"Database instance is not available");let I=await l.getMessagesByChatId(e);a(I)}catch(I){console.error("Failed to load messages:",I)}finally{s(!1)}},[e,l]);bC(()=>{u()},[u]);let p=ka(async I=>{if(!e)return;Ut.ok(l,"Database instance is not available"),await l.saveMessage(I),a(D=>[...D,I]);let A=await l.getChat(e);A&&await l.saveChat({...A,updatedAt:new Date().toISOString()})},[e,l]),E=ka(async I=>{Ut.ok(l,"Database instance is not available"),await l.saveMessage(I),a(A=>A.map(D=>D.id===I.id?I:D))},[l]),h=ka(async I=>{Ut.ok(l,"Database instance is not available"),await l.deleteMessage(I),a(A=>A.filter(D=>D.id!==I))},[l]),T=ka(async I=>{Ut.ok(l,"Database instance is not available"),await l.deleteMessages(I),a(A=>A.filter(D=>!I.includes(D.id)))},[l]),R=ka(async()=>{if(!e)return;let I=n.map(A=>A.id);Ut.ok(l,"Database instance is not available"),await l.deleteMessages(I),a([])},[e,n,l]);return{messages:n,loading:o,addMessage:p,updateMessage:E,deleteMessage:h,deleteMessages:T,clearMessages:R,refreshMessages:u}}var CC=kn.forwardRef(({messages:e,models:t=[],addChatMessage:n,removeMessages:a,loadMoreMessages:o,plugins:s,detailsPlugins:l,codePlugins:d,streaming:u=!1,loadCompleted:p=!0,loading:E=!1,autoScroll:h=!0,id:T="chat"},R)=>{let[I,A]=yP(!1),D=vC(null),M=vC(null),G=Bs(()=>{D.current?.scrollTo(0,D.current?.scrollHeight??0)},[D]);NP(R,()=>({scrollToBottom:G}),[G]);let U=Bs(()=>{I||G()},[G,I]);TC(()=>{if(h)U();else{let te=D.current;if(te){let{scrollTop:Q,scrollHeight:le,clientHeight:$}=te;le-Q-$<2||A(!0)}}},[e,U,h]);let W=Bs(te=>{let{scrollTop:Q,scrollHeight:le,clientHeight:$}=te.target;M.current&&clearTimeout(M.current),le-Q-$<2?A(!1):e?.length&&(u?M.current=setTimeout(()=>{A(!0)},100):A(!0))},[e?.length,u]),Y=Bs(()=>{A(!1),G()},[G]);TC(()=>{p&&(A(!1),setTimeout(G,200))},[p,h]);let q=Vd(()=>o?.(),[o],200);return kn.createElement("div",{className:["katechat-messages-container",p?"container--load-completed":"",p&&e?.length===0?"container--empty":""].join(" ")},kn.createElement("div",{className:"katechat-messages-container-scroller",ref:D,onScroll:W},kn.createElement("div",{ref:q,id:`${T}-first-message`}),E&&kn.createElement(OP,{justify:"center",align:"center",py:"xl"},kn.createElement(xP,null)),kn.createElement("div",{className:"katechat-messages-list"},e&&kn.createElement(gC,{messages:e,onMessageDeleted:a,onAddMessage:n,models:t,plugins:s,detailsPlugins:l,codePlugins:d}))),kn.createElement("div",{className:["katechat-anchor-container",I?"container--visible":""].join(" ")},kn.createElement("div",{className:"katechat-anchor"},kn.createElement(DP,{size:32,color:"teal",onClick:Y}))))});CC.displayName="ChatMessagesContainer";import Pa from"react";import{Modal as wP,Button as RC,Group as MP,Text as LP,Stack as kP}from"@mantine/core";import{useTranslation as PP}from"react-i18next";var W8=({isOpen:e,onClose:t,onConfirm:n,title:a,message:o,confirmLabel:s,cancelLabel:l,isLoading:d=!1})=>{let{t:u}=PP();return Pa.createElement(wP,{opened:e,onClose:t,title:a||u("Confirm Deletion"),centered:!0},Pa.createElement(kP,null,Pa.createElement(LP,{style:{wordBreak:"break-word"}},o||u("Are you sure you want to delete this item? This action cannot be undone.")),Pa.createElement(MP,{mt:"md",justify:"flex-end"},Pa.createElement(RC,{variant:"outline",onClick:t,disabled:d},l||u("Cancel")),Pa.createElement(RC,{color:"red",onClick:n,loading:d},s||u("Delete")))))};import aa from"react";import{Menu as Fs,ActionIcon as BP,Tooltip as FP}from"@mantine/core";import{IconLanguage as UP}from"@tabler/icons-react";import{useTranslation as GP}from"react-i18next";var nG=({languages:e=Yd,size:t=20})=>{let{t:n,i18n:a}=GP(),o=s=>{a.changeLanguage(s),localStorage.setItem(zd,s)};return aa.createElement(Fs,{shadow:"md",width:150,position:"bottom-end"},aa.createElement(Fs.Target,null,aa.createElement(FP,{label:n("language.label")},aa.createElement(BP,{variant:"subtle","aria-label":n("language.label")},aa.createElement(UP,{size:t})))),aa.createElement(Fs.Dropdown,null,e.map(s=>aa.createElement(Fs.Item,{key:s,onClick:()=>o(s),fw:a.language===s?700:400},n(`language.${s}`)))))};export{Yd as BASE_SUPPORTED_LANGUAGES,Ma as ChatDatabase,R1 as ChatFileType,h9 as ChatInput,Ld as ChatMessage,uU as ChatMessagePreview,CC as ChatMessagesContainer,gC as ChatMessagesList,C1 as CustomModelProtocol,W8 as DeleteConfirmationModal,t9 as DropFilesOverlay,Pd as FileDropzone,Y3 as IMAGE_UPLOAD_FORMATS,mC as ImagePopup,zd as LANGUAGE_STORAGE_KEY,nG as LanguageSelector,kd as LinkedChatMessage,lc as MessageRole,Po as MessageStatus,T1 as MessageType,v1 as ModelType,Di as ProviderIcon,oi as ResponseStatus,fC as ThemeContext,i8 as ThemeProvider,Ut as assert,kr as escapeHtml,dC as formatDate,EF as formatFileSize,fF as formatTokensLimit,OF as getCSSVariableColor,Pv as getProgrammingLanguageExt,k9 as initI18n,Vk as normalizeMatJax,pF as parseChatMessages,Os as parseMarkdown,NF as sortItemsBySections,_8 as useDatabaseChats,f8 as useDatabaseMessages,Vd as useIntersectionObserver,o8 as useTheme};
|
|
451
|
+
`),gC=Er.memo(({messages:e,onMessageDeleted:t,onAddMessage:n,plugins:a=[],detailsPlugins:o=[],codePlugins:s,models:l=[]})=>{let{t:d}=TP(),u=hP(null),[p,E]=Hd(),[h,T]=Hd(),[R,I]=Hd(new Set),A=Li(Y=>I(q=>new Set(q).add(Y)),[]),D=Li(Y=>{I(q=>{let te=new Set(q);return te.delete(Y),te})},[]),M=()=>{E(void 0),T(void 0)},G=Li(Y=>{if(!Y.target)return;let q=["code-run-btn","code-copy-btn","code-download-btn","code-toggle-all","copy-message-btn","code-header","message-image","table-sort-btn","table-copy-csv-btn","table-download-csv-btn"],te=Y.target;for(let $ of q){let ie=te.closest(`.${$}`);if(ie){te=ie;break}}if(!te)return;let Q=te,le=$=>{let ie=$?.parentElement;ie.classList.contains("collapsed")?($.classList.remove("collapsed"),ie&&ie.classList.remove("collapsed")):($.classList.add("collapsed"),ie&&ie.classList.add("collapsed"))};if(Q.classList.contains("code-run-btn")||Q.classList.contains("code-download-btn")){let $=Q.dataset.lang,ie=Q.classList.contains("code-run-btn"),xe=Q.closest(".code-header")?.parentElement?.querySelector(".code-data");if(xe){let be=decodeURIComponent(xe.dataset.code||"").trim();if(!be)return Wd.show({title:d("Error"),message:d("Code block is empty"),color:"red"});if(ie){if(!$)return Wd.show({title:d("Error"),message:d("Language is not specified for this code block"),color:"red"});let fe=Q.closest('[id^="message-"]'),z=fe?.id.replace("message-",""),X=z?e.find(Je=>Je.id===z):void 0,J=Q.closest("[data-linked-message-id]"),re=J?.dataset.linkedMessageId,Ee=re?X?.linkedMessages?.find(Je=>Je.id===re):X,ve=(J??fe)?.querySelectorAll(".code-block"),ke=Q.closest(".code-block"),Fe=ve&&ke?Array.from(ve).indexOf(ke):0,Ye=Ee?{messageId:Ee.id,blockIndex:Fe,messageContent:Ee.content}:void 0;s?.[$]?.execute(be,$,Ye)}else{let fe=`code.${Pv($||"txt")}`,z=new Blob([be],{type:"text/plain"}),X=URL.createObjectURL(z),J=document.createElement("a");J.href=X,J.download=fe,J.click(),URL.revokeObjectURL(X)}}}else if(Q.classList.contains("code-copy-btn")){let $=Q.parentElement?.parentElement?.nextElementSibling?.querySelector(".code-data");if($){let xe=decodeURIComponent($.dataset.code||"").trim();navigator.clipboard.writeText(xe)}let ie=Q.querySelector(".copy-icon"),ge=Q.querySelector(".check-icon");ie&&ge&&(ie.style.display="none",ge.style.display="block",setTimeout(()=>{ie.style.display="block",ge.style.display="none"},2e3))}else if(Q.classList.contains("code-header"))le(Q);else if(Q.classList.contains("code-toggle-all"))u.current?.querySelectorAll(".code-header").forEach($=>{le($)});else if(Q.classList.contains("copy-message-btn")){if(Q.dataset.messageId){let $=Q.dataset.messageIndex,ie=Q.dataset.messageLinkedIndex,ge=Q.dataset.messageId,xe=$!=null?e[Number($)]:e.find(X=>X.id===ge);ie!=null&&(xe=xe?.linkedMessages?.[Number(ie)]),Rd(xe,"Message should exist to copy");let be=(xe.content||"").trim(),fe=xe.html||[];if(fe.length&&fe[0]){let X=new Blob([fe.join("<br/>")],{type:"text/html"}),J=new Blob([be],{type:"text/plain"});navigator.clipboard.write([new ClipboardItem({[X.type]:X,[J.type]:J})]).catch(re=>Wd.show({title:d("Error"),message:re.message||d("Failed to copy message"),color:"red"}))}else navigator.clipboard.writeText(be);let z=Q.parentElement?.querySelector(".check-icon");z&&(Q.style.display="none",z.style.display="inline-block",setTimeout(()=>{Q.style.display="inline-block",z.style.display="none"},2e3))}}else if(Q.classList.contains("message-image")){let $=Q.dataset.fileName,ie=Q.src;E(ie),T($)}else if(Q.classList.contains("table-sort-btn")){let $=parseInt(Q.dataset.colIndex||"0"),ie=Q.closest("table");if(!ie)return;let ge=ie.querySelector("tbody");if(!ge)return;let be=Q.dataset.sortDir==="asc"?"desc":"asc";ie.querySelectorAll("th.table-sort-btn").forEach(z=>{delete z.dataset.sortDir,z.classList.remove("sort-asc","sort-desc")}),Q.dataset.sortDir=be,Q.classList.add(be==="asc"?"sort-asc":"sort-desc");let fe=Array.from(ge.querySelectorAll("tr"));fe.sort((z,X)=>{let J=z.querySelectorAll("td")[$]?.textContent||"",re=X.querySelectorAll("td")[$]?.textContent||"",Ee=parseFloat(J),me=parseFloat(re);return!isNaN(Ee)&&!isNaN(me)?be==="asc"?Ee-me:me-Ee:be==="asc"?J.localeCompare(re):re.localeCompare(J)}),fe.forEach(z=>ge.appendChild(z))}else if(Q.classList.contains("table-copy-csv-btn")){let $=Q.closest(".message-table");if(!$)return;navigator.clipboard.writeText(pC($));let ie=Q.querySelector(".copy-icon"),ge=Q.querySelector(".check-icon");ie&&ge&&(ie.style.display="none",ge.style.display="block",setTimeout(()=>{ie.style.display="block",ge.style.display="none"},2e3))}else if(Q.classList.contains("table-download-csv-btn")){let $=Q.closest(".message-table");if(!$)return;let ie=new Blob([pC($)],{type:"text/csv"}),ge=URL.createObjectURL(ie),xe=document.createElement("a");xe.href=ge,xe.download="table.csv",xe.click(),URL.revokeObjectURL(ge)}},[e,s]),U=Li(Y=>Er.createElement(Er.Fragment,null,a.map((q,te)=>Er.createElement(q,{key:te,message:Y,onAddMessage:n,onAction:A,onActionEnd:D,onMessageDeleted:t,disabled:R.has(Y.id)}))),[a,n,t,R,A,D]),W=Li(Y=>{let q=o.map(te=>te(Y)).filter(Ni);return q.length?q:null},[o]);return Er.createElement(Er.Fragment,null,Er.createElement(bP,{gap:"sm",ref:u,onClick:G},e.map((Y,q)=>Er.createElement(Ld,{key:Y.id,message:Y,index:q,disabled:R.has(Y.id),pluginsLoader:U,messageDetailsLoader:W,models:l,codePlugins:s}))),Er.createElement(mC,{fileName:h??"",fileUrl:p??"",onClose:M}))});import kn,{useCallback as Bs,useEffect as TC,useImperativeHandle as NP,useRef as vC,useState as yP}from"react";import{Group as OP,Loader as xP}from"@mantine/core";import{IconCircleChevronDown as DP}from"@tabler/icons-react";import{useEffect as vP,useRef as EC}from"react";function Vd(e,t,n=0){let a=EC(null),o=EC(null);return vP(()=>{a.current?.disconnect();let s=setTimeout(()=>{a.current=new IntersectionObserver(l=>{l[0].isIntersecting&&e()}),o.current&&a.current.observe(o.current)},n);return()=>{clearTimeout(s),a.current?.disconnect()}},[t,e]),o}import CP,{createContext as RP,useContext as IP,useEffect as SC}from"react";import{useLocalStorage as AP}from"@mantine/hooks";var fC=RP(void 0),i8=({children:e})=>{let[t,n]=AP({key:"ui-theme",defaultValue:"light"});SC(()=>{if(t==="auto"){let o=window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.dataset.mantine=o?"dark":"light"}else document.documentElement.dataset.mantine=t},[t]);let a=()=>{let o=t==="dark"?"light":"dark";n(o),document.documentElement.dataset.mantine=o};return SC(()=>{if(t==="auto"){let o=window.matchMedia("(prefers-color-scheme: dark)"),s=l=>{document.documentElement.dataset.mantine=l.matches?"dark":"light"};return o.addEventListener("change",s),()=>o.removeEventListener("change",s)}},[t]),CP.createElement(fC.Provider,{value:{colorScheme:t,setColorScheme:n,toggleColorScheme:a}},e)},o8=()=>{let e=IP(fC);if(!e)throw new Error("useTheme must be used within a ThemeProvider");return e};import{useState as qd,useEffect as hC,useCallback as ra}from"react";function _8(e){let[t,n]=qd([]),[a,o]=qd(!0),[s,l]=qd(null);hC(()=>{let I=new Ma(e);return l(I),()=>{I.close()}},[e]);let d=ra(async()=>{if(s)try{let I=await s.getAllChats();n(I)}catch(I){console.error("Failed to load chats:",I)}finally{o(!1)}},[s]);hC(()=>{d()},[d]);let u=ra(async I=>{Ut.ok(s,"Database instance is not available");let A={id:`chat-${Date.now()}`,title:"New Chat",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return s&&(await s.saveChat(A),await d()),A},[s,d]),p=ra(async I=>{Ut.ok(s,"Database instance is not available"),await s.saveChat(I),await d()},[s,d]),E=ra(async I=>{Ut.ok(s,"Database instance is not available"),await s.deleteChat(I),await d()},[s,d]),h=ra(async(I,A)=>{let D=t.find(M=>M.id===I);D&&(Ut.ok(s,"Database instance is not available"),await s.saveChat({...D,title:A,updatedAt:new Date().toISOString()}),await d())},[t,s,d]),T=ra(async I=>{Ut.ok(s,"Database instance is not available"),await s.saveMessage(I)},[s]),R=ra(async I=>(Ut.ok(s,"Database instance is not available"),s.getMessagesByChatId(I)),[s]);return{chats:t,loading:a,createChat:u,updateChat:p,deleteChat:E,updateChatTitle:h,refreshChats:d,saveMessage:T,getChatMessages:R}}import{useState as Qd,useEffect as bC,useCallback as ka}from"react";function f8(e,t){let[n,a]=Qd([]),[o,s]=Qd(!0),[l,d]=Qd(null);bC(()=>{let I=new Ma(t);return d(I),()=>{I.close()}},[t]);let u=ka(async()=>{if(!e){a([]),s(!1);return}try{Ut.ok(l,"Database instance is not available");let I=await l.getMessagesByChatId(e);a(I)}catch(I){console.error("Failed to load messages:",I)}finally{s(!1)}},[e,l]);bC(()=>{u()},[u]);let p=ka(async I=>{if(!e)return;Ut.ok(l,"Database instance is not available"),await l.saveMessage(I),a(D=>[...D,I]);let A=await l.getChat(e);A&&await l.saveChat({...A,updatedAt:new Date().toISOString()})},[e,l]),E=ka(async I=>{Ut.ok(l,"Database instance is not available"),await l.saveMessage(I),a(A=>A.map(D=>D.id===I.id?I:D))},[l]),h=ka(async I=>{Ut.ok(l,"Database instance is not available"),await l.deleteMessage(I),a(A=>A.filter(D=>D.id!==I))},[l]),T=ka(async I=>{Ut.ok(l,"Database instance is not available"),await l.deleteMessages(I),a(A=>A.filter(D=>!I.includes(D.id)))},[l]),R=ka(async()=>{if(!e)return;let I=n.map(A=>A.id);Ut.ok(l,"Database instance is not available"),await l.deleteMessages(I),a([])},[e,n,l]);return{messages:n,loading:o,addMessage:p,updateMessage:E,deleteMessage:h,deleteMessages:T,clearMessages:R,refreshMessages:u}}var CC=kn.forwardRef(({messages:e,models:t=[],addChatMessage:n,removeMessages:a,loadMoreMessages:o,plugins:s,detailsPlugins:l,codePlugins:d,streaming:u=!1,loadCompleted:p=!0,loading:E=!1,autoScroll:h=!0,id:T="chat"},R)=>{let[I,A]=yP(!1),D=vC(null),M=vC(null),G=Bs(()=>{D.current?.scrollTo(0,D.current?.scrollHeight??0)},[D]);NP(R,()=>({scrollToBottom:G}),[G]);let U=Bs(()=>{I||G()},[G,I]);TC(()=>{if(h)U();else{let te=D.current;if(te){let{scrollTop:Q,scrollHeight:le,clientHeight:$}=te;le-Q-$<2||A(!0)}}},[e,U,h]);let W=Bs(te=>{let{scrollTop:Q,scrollHeight:le,clientHeight:$}=te.target;M.current&&clearTimeout(M.current),le-Q-$<2?A(!1):e?.length&&(u?M.current=setTimeout(()=>{A(!0)},100):A(!0))},[e?.length,u]),Y=Bs(()=>{A(!1),G()},[G]);TC(()=>{p&&(A(!1),setTimeout(G,200))},[p,h]);let q=Vd(()=>o?.(),[o],200);return kn.createElement("div",{className:["katechat-messages-container",p?"container--load-completed":"",p&&e?.length===0?"container--empty":""].join(" ")},kn.createElement("div",{className:"katechat-messages-container-scroller",ref:D,onScroll:W},kn.createElement("div",{ref:q,id:`${T}-first-message`}),E&&kn.createElement(OP,{justify:"center",align:"center",py:"xl"},kn.createElement(xP,null)),kn.createElement("div",{className:"katechat-messages-list"},e&&kn.createElement(gC,{messages:e,onMessageDeleted:a,onAddMessage:n,models:t,plugins:s,detailsPlugins:l,codePlugins:d}))),kn.createElement("div",{className:["katechat-anchor-container",I?"container--visible":""].join(" ")},kn.createElement("div",{className:"katechat-anchor"},kn.createElement(DP,{size:32,color:"teal",onClick:Y}))))});CC.displayName="ChatMessagesContainer";import Pa from"react";import{Modal as wP,Button as RC,Group as MP,Text as LP,Stack as kP}from"@mantine/core";import{useTranslation as PP}from"react-i18next";var W8=({isOpen:e,onClose:t,onConfirm:n,title:a,message:o,confirmLabel:s,cancelLabel:l,isLoading:d=!1})=>{let{t:u}=PP();return Pa.createElement(wP,{opened:e,onClose:t,title:a||u("Confirm Deletion"),centered:!0},Pa.createElement(kP,null,Pa.createElement(LP,{style:{wordBreak:"break-word"}},o||u("Are you sure you want to delete this item? This action cannot be undone.")),Pa.createElement(MP,{mt:"md",justify:"flex-end"},Pa.createElement(RC,{variant:"outline",onClick:t,disabled:d},l||u("Cancel")),Pa.createElement(RC,{color:"red",onClick:n,loading:d},s||u("Delete")))))};import aa from"react";import{Menu as Fs,ActionIcon as BP,Tooltip as FP}from"@mantine/core";import{IconLanguage as UP}from"@tabler/icons-react";import{useTranslation as GP}from"react-i18next";var nG=({languages:e=Yd,size:t=20})=>{let{t:n,i18n:a}=GP(),o=s=>{a.changeLanguage(s),localStorage.setItem(zd,s)};return aa.createElement(Fs,{shadow:"md",width:150,position:"bottom-end"},aa.createElement(Fs.Target,null,aa.createElement(FP,{label:n("language.label")},aa.createElement(BP,{variant:"subtle",radius:"xl","aria-label":n("language.label")},aa.createElement(UP,{size:t})))),aa.createElement(Fs.Dropdown,null,e.map(s=>aa.createElement(Fs.Item,{key:s,onClick:()=>o(s),fw:a.language===s?700:400},n(`language.${s}`)))))};export{Yd as BASE_SUPPORTED_LANGUAGES,Ma as ChatDatabase,R1 as ChatFileType,h9 as ChatInput,Ld as ChatMessage,uU as ChatMessagePreview,CC as ChatMessagesContainer,gC as ChatMessagesList,C1 as CustomModelProtocol,W8 as DeleteConfirmationModal,t9 as DropFilesOverlay,Pd as FileDropzone,Y3 as IMAGE_UPLOAD_FORMATS,mC as ImagePopup,zd as LANGUAGE_STORAGE_KEY,nG as LanguageSelector,kd as LinkedChatMessage,lc as MessageRole,Po as MessageStatus,T1 as MessageType,v1 as ModelType,Di as ProviderIcon,oi as ResponseStatus,fC as ThemeContext,i8 as ThemeProvider,Ut as assert,kr as escapeHtml,dC as formatDate,EF as formatFileSize,fF as formatTokensLimit,OF as getCSSVariableColor,Pv as getProgrammingLanguageExt,k9 as initI18n,Vk as normalizeMatJax,pF as parseChatMessages,Os as parseMarkdown,NF as sortItemsBySections,_8 as useDatabaseChats,f8 as useDatabaseMessages,Vd as useIntersectionObserver,o8 as useTheme};
|
|
452
452
|
/*! Bundled license information:
|
|
453
453
|
|
|
454
454
|
lodash/lodash.js:
|