{ openMenu = false }}> {#if $selectedCharID < 0} {#if $PlaygroundStore === 0}
{:else}
{/if} {:else}
{#if isInitialLoading}
{language.loading}
{/if}
{#if DBState.db.useChatSticker && currentCharacter.type !== 'group'}
{toggleStickers = !toggleStickers}} class={"ml-4 bg-textcolor2 flex justify-center items-center w-12 h-12 rounded-md hover:bg-green-500 transition-colors "+(toggleStickers ? 'text-green-500':'text-textcolor')}>
{/if} {#if !DBState.db.useAdvancedEditor}
{ if(e.key.toLocaleLowerCase() === "enter" && (!e.shiftKey) && !e.isComposing){ if(DBState.db.sendWithEnter){ send() e.preventDefault() } } if(e.key.toLocaleLowerCase() === "m" && (e.ctrlKey)){ reroll() e.preventDefault() } }} onpaste={(e) => { const items = e.clipboardData?.items if(!items){ return } let canceled = false for(const item of items){ if(item.kind === 'file' && item.type.startsWith('image')){ if(!canceled){ e.preventDefault() canceled = true } const file = item.getAsFile() if(file){ const reader = new FileReader() reader.onload = async (e) => { const buf = e.target?.result as ArrayBuffer const uint8 = new Uint8Array(buf) const res = await postChatFile({ name: file.name, data: uint8 }) if(res?.type === 'asset'){ fileInput.push(res.data) updateInputSizeAll() } if(res?.type === 'text'){ messageInput += `{{file::${res.name}::${res.data}}}` updateInputSizeAll() } } reader.readAsArrayBuffer(file) } } } }} oninput={()=>{updateInputSizeAll();updateInputTransateMessage(false)}} style:height={inputHeight} >
{:else}
{/if} {#if $doingChat || doingChatInputTranslate}
{:else}
{/if} {#if DBState.db.characters[$selectedCharID]?.chaId !== '§playground'}
{ openMenu = !openMenu e.stopPropagation() }} class="peer-focus:border-textcolor mr-2 flex border-y border-r border-darkborderc justify-center items-center text-gray-100 p-3 rounded-r-md hover:bg-blue-500 transition-colors" style:height={inputHeight} >
{:else}
{ DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.push({ role: 'char', data: '' }) DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] }} class="peer-focus:border-textcolor mr-2 flex border-y border-r border-darkborderc justify-center items-center text-gray-100 p-3 rounded-r-md hover:bg-blue-500 transition-colors" style:height={inputHeight} >
{/if}
{#if DBState.db.useAutoTranslateInput && !DBState.db.useAdvancedEditor && DBState.db.characters[$selectedCharID]?.chaId !== '§playground'}
{ if(e.key.toLocaleLowerCase() === "enter" && (!e.shiftKey)){ if(DBState.db.sendWithEnter){ send() e.preventDefault() } } if(e.key.toLocaleLowerCase() === "m" && (e.ctrlKey)){ reroll() e.preventDefault() } }} oninput={()=>{updateInputSizeAll();updateInputTransateMessage(true)}} placeholder={language.enterMessageForTranslateToEnglish} style:height={inputTranslateHeight} >
{/if} {#if fileInput.length > 0}
{#each fileInput as file, i} {#await getInlayAsset(file) then inlayAsset}
{#if inlayAsset.type === 'image'}
{:else if inlayAsset.type === 'video'}
Your browser does not support the video tag.
{:else if inlayAsset.type === 'audio'}
Your browser does not support the audio tag.
{:else}
{file}
{/if}
{ fileInput.splice(i, 1) updateInputSizeAll() }}>
{/await} {/each}
{/if} {#if toggleStickers}
{ let fileType = 'img' if(additionalAsset.length > 2 && additionalAsset[2]) { const fileExtension = additionalAsset[2] if(fileExtension === 'mp4' || fileExtension === 'webm') fileType = 'video' else if(fileExtension === 'mp3' || fileExtension === 'wav') fileType = 'audio' } messageInput += `
{{${fileType}::${additionalAsset[0]}}}
*${additionalAsset[0]} added*` updateInputSizeAll() }}/>
{/if} {#if DBState.db.useAutoSuggestions}
messageInput=( (DBState.db.subModel === "textgen_webui" || DBState.db.subModel === "mancer" || DBState.db.subModel.startsWith('local_')) && DBState.db.autoSuggestClean ? msg.replace(/ +\(.+?\) *$| - [^"'*]*?$/, '') : msg )} {send}/> {/if} {#key loadPages} {#each messageForm(DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message, loadPages) as chat, i} {#if !isScrolling || i < 20} {#if chat.role === 'char'} {#if DBState.db.characters[$selectedCharID].type !== 'group'}
{:else}
{/if} {:else}
{/if} {:else}
{/if} {/each} {/key} {#if DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length <= loadPages} {#if DBState.db.characters[$selectedCharID].type !== 'group' }
0} largePortrait={DBState.db.characters[$selectedCharID].largePortrait} firstMessage={true} onReroll={() => { const cha = DBState.db.characters[$selectedCharID] const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] if(cha.type !== 'group'){ if (chat.fmIndex >= (cha.alternateGreetings.length - 1)){ chat.fmIndex = -1 } else{ chat.fmIndex += 1 } } DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat }} unReroll={() => { const cha = DBState.db.characters[$selectedCharID] const chat = DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] if(cha.type !== 'group'){ if (chat.fmIndex === -1){ chat.fmIndex = (cha.alternateGreetings.length - 1) } else{ chat.fmIndex -= 1 } } DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage] = chat }} isLastMemory={false} /> {#if !DBState.db.characters[$selectedCharID].removedQuotes && DBState.db.characters[$selectedCharID].creatorNotes.length >= 2}
{ const cha = DBState.db.characters[$selectedCharID] if(cha.type !== 'group'){ cha.removedQuotes = true } DBState.db.characters[$selectedCharID] = cha }} /> {/if} {/if} {/if} {#if openMenu}
{ e.stopPropagation() }}> {#if DBState.db.characters[$selectedCharID].type === 'group'}
{language.autoMode}
{/if} {#if DBState.db.characters[$selectedCharID].ttsMode === 'webspeech' || DBState.db.characters[$selectedCharID].ttsMode === 'elevenlab'}
{ stopTTS() }}>
{language.ttsStop}
{/if}
{ if((DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length < 2) || (DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message[DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].message.length - 1].role !== 'char')){ return } sendContinue(); }} >
{language.continueResponse}
{#if DBState.db.showMenuChatList}
{ openChatList = true openMenu = false }}>
{language.chatList}
{/if} {#if DBState.db.translator !== ''}
{ DBState.db.useAutoTranslateInput = !DBState.db.useAutoTranslateInput }}>
{language.autoTranslateInput}
{/if}
{ screenShot() }}>
{language.screenshot}
{ const res = await postChatFile(messageInput) if(res?.type === 'asset'){ fileInput.push(res.data) updateInputSizeAll() } if(res?.type === 'text'){ messageInput += `{{file::${res.name}::${res.data}}}` updateInputSizeAll() } }}>
{language.postFile}
{ DBState.db.useAutoSuggestions = !DBState.db.useAutoSuggestions }}>
{language.autoSuggest}
{ DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].modules ??= [] openModuleList = true openMenu = false }}>
{language.modules}
{#if DBState.db.sideMenuRerollButton}
{language.reroll}
{/if}
{/if}
{/if}