forked from open-webui/open-webui
		
	feat: navbar ui update
This commit is contained in:
		
							parent
							
								
									ce20f05ef1
								
							
						
					
					
						commit
						0c367412c3
					
				
					 14 changed files with 408 additions and 152 deletions
				
			
		|  | @ -1,9 +1,12 @@ | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
|  | 	import { Collapsible } from 'bits-ui'; | ||||||
|  | 
 | ||||||
| 	import { setDefaultModels } from '$lib/apis/configs'; | 	import { setDefaultModels } from '$lib/apis/configs'; | ||||||
| 	import { models, showSettings, settings, user } from '$lib/stores'; | 	import { models, showSettings, settings, user } from '$lib/stores'; | ||||||
| 	import { onMount, tick, getContext } from 'svelte'; | 	import { onMount, tick, getContext } from 'svelte'; | ||||||
| 	import { toast } from 'svelte-sonner'; | 	import { toast } from 'svelte-sonner'; | ||||||
| 	import Selector from './ModelSelector/Selector.svelte'; | 	import Selector from './ModelSelector/Selector.svelte'; | ||||||
|  | 	import Tooltip from '../common/Tooltip.svelte'; | ||||||
| 
 | 
 | ||||||
| 	const i18n = getContext('i18n'); | 	const i18n = getContext('i18n'); | ||||||
| 
 | 
 | ||||||
|  | @ -33,11 +36,11 @@ | ||||||
| 	} | 	} | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <div class="flex flex-col my-2 w-full"> | <div class="flex flex-col mt-0.5 w-full"> | ||||||
| 	{#each selectedModels as selectedModel, selectedModelIdx} | 	{#each selectedModels as selectedModel, selectedModelIdx} | ||||||
| 		<div class="flex w-full"> | 		<div class="flex w-full"> | ||||||
| 			<div class="overflow-hidden w-full"> | 			<div class="overflow-hidden w-full"> | ||||||
| 				<div class="mr-2 max-w-full"> | 				<div class="mr-0.5 max-w-full"> | ||||||
| 					<Selector | 					<Selector | ||||||
| 						placeholder={$i18n.t('Select a model')} | 						placeholder={$i18n.t('Select a model')} | ||||||
| 						items={$models | 						items={$models | ||||||
|  | @ -53,84 +56,56 @@ | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			{#if selectedModelIdx === 0} | 			{#if selectedModelIdx === 0} | ||||||
| 				<button | 				<div class="  self-center mr-2 disabled:text-gray-600 disabled:hover:text-gray-600"> | ||||||
| 					class="  self-center {selectedModelIdx === 0 | 					<Tooltip content="Add Model"> | ||||||
| 						? 'mr-3' | 						<button | ||||||
| 						: 'mr-7'} disabled:text-gray-600 disabled:hover:text-gray-600" | 							class=" " | ||||||
| 					{disabled} | 							{disabled} | ||||||
| 					on:click={() => { | 							on:click={() => { | ||||||
| 						selectedModels = [...selectedModels, '']; | 								selectedModels = [...selectedModels, '']; | ||||||
| 					}} | 							}} | ||||||
| 				> | 						> | ||||||
| 					<svg | 							<svg | ||||||
| 						xmlns="http://www.w3.org/2000/svg" | 								xmlns="http://www.w3.org/2000/svg" | ||||||
| 						fill="none" | 								fill="none" | ||||||
| 						viewBox="0 0 24 24" | 								viewBox="0 0 24 24" | ||||||
| 						stroke-width="1.5" | 								stroke-width="1.5" | ||||||
| 						stroke="currentColor" | 								stroke="currentColor" | ||||||
| 						class="w-4 h-4" | 								class="w-4 h-4" | ||||||
| 					> | 							> | ||||||
| 						<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" /> | 								<path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" /> | ||||||
| 					</svg> | 							</svg> | ||||||
| 				</button> | 						</button> | ||||||
|  | 					</Tooltip> | ||||||
|  | 				</div> | ||||||
| 			{:else} | 			{:else} | ||||||
| 				<button | 				<div class="  self-center disabled:text-gray-600 disabled:hover:text-gray-600 mr-2"> | ||||||
| 					class="  self-center disabled:text-gray-600 disabled:hover:text-gray-600 {selectedModelIdx === | 					<Tooltip content="Remove Model"> | ||||||
| 					0 | 						<button | ||||||
| 						? 'mr-3' | 							{disabled} | ||||||
| 						: 'mr-7'}" | 							on:click={() => { | ||||||
| 					{disabled} | 								selectedModels.splice(selectedModelIdx, 1); | ||||||
| 					on:click={() => { | 								selectedModels = selectedModels; | ||||||
| 						selectedModels.splice(selectedModelIdx, 1); | 							}} | ||||||
| 						selectedModels = selectedModels; | 						> | ||||||
| 					}} | 							<svg | ||||||
| 				> | 								xmlns="http://www.w3.org/2000/svg" | ||||||
| 					<svg | 								fill="none" | ||||||
| 						xmlns="http://www.w3.org/2000/svg" | 								viewBox="0 0 24 24" | ||||||
| 						fill="none" | 								stroke-width="1.5" | ||||||
| 						viewBox="0 0 24 24" | 								stroke="currentColor" | ||||||
| 						stroke-width="1.5" | 								class="w-4 h-4" | ||||||
| 						stroke="currentColor" | 							> | ||||||
| 						class="w-4 h-4" | 								<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" /> | ||||||
| 					> | 							</svg> | ||||||
| 						<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" /> | 						</button> | ||||||
| 					</svg> | 					</Tooltip> | ||||||
| 				</button> | 				</div> | ||||||
| 			{/if} |  | ||||||
| 
 |  | ||||||
| 			{#if selectedModelIdx === 0} |  | ||||||
| 				<button |  | ||||||
| 					class=" self-center dark:hover:text-gray-300" |  | ||||||
| 					id="open-settings-button" |  | ||||||
| 					on:click={async () => { |  | ||||||
| 						await showSettings.set(!$showSettings); |  | ||||||
| 					}} |  | ||||||
| 				> |  | ||||||
| 					<svg |  | ||||||
| 						xmlns="http://www.w3.org/2000/svg" |  | ||||||
| 						fill="none" |  | ||||||
| 						viewBox="0 0 24 24" |  | ||||||
| 						stroke-width="1.5" |  | ||||||
| 						stroke="currentColor" |  | ||||||
| 						class="w-4 h-4" |  | ||||||
| 					> |  | ||||||
| 						<path |  | ||||||
| 							stroke-linecap="round" |  | ||||||
| 							stroke-linejoin="round" |  | ||||||
| 							d="M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z" |  | ||||||
| 						/> |  | ||||||
| 						<path |  | ||||||
| 							stroke-linecap="round" |  | ||||||
| 							stroke-linejoin="round" |  | ||||||
| 							d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" |  | ||||||
| 						/> |  | ||||||
| 					</svg> |  | ||||||
| 				</button> |  | ||||||
| 			{/if} | 			{/if} | ||||||
| 		</div> | 		</div> | ||||||
| 	{/each} | 	{/each} | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| <div class="text-left mt-1.5 ml-1 text-xs text-gray-500"> | <div class="text-left mt-0.5 ml-1 text-[0.7rem] text-gray-500"> | ||||||
| 	<button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button> | 	<button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -181,20 +181,20 @@ | ||||||
| 		searchValue = ''; | 		searchValue = ''; | ||||||
| 		window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0); | 		window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0); | ||||||
| 	}} | 	}} | ||||||
| 	selected={items.find((item) => item.value === value)} | 	selected={items.find((item) => item.value === value) ?? ''} | ||||||
| 	onSelectedChange={(selectedItem) => { | 	onSelectedChange={(selectedItem) => { | ||||||
| 		value = selectedItem.value; | 		value = selectedItem.value; | ||||||
| 	}} | 	}} | ||||||
| > | > | ||||||
| 	<Select.Trigger class="relative w-full" aria-label={placeholder}> | 	<Select.Trigger class="relative w-full" aria-label={placeholder}> | ||||||
| 		<Select.Value | 		<Select.Value | ||||||
| 			class="inline-flex h-input px-0.5 w-full outline-none bg-transparent truncate text-lg font-semibold placeholder-gray-400  focus:outline-none" | 			class="flex text-left px-0.5 outline-none bg-transparent truncate text-lg font-semibold placeholder-gray-400  focus:outline-none" | ||||||
| 			{placeholder} | 			{placeholder} | ||||||
| 		/> | 		/> | ||||||
| 		<ChevronDown className="absolute end-2 top-1/2 -translate-y-[45%] size-3.5" strokeWidth="2.5" /> | 		<ChevronDown className="absolute end-2 top-1/2 -translate-y-[45%] size-3.5" strokeWidth="2.5" /> | ||||||
| 	</Select.Trigger> | 	</Select.Trigger> | ||||||
| 	<Select.Content | 	<Select.Content | ||||||
| 		class="w-full rounded-lg  bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50  outline-none" | 		class=" z-40 w-full rounded-lg  bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50  outline-none" | ||||||
| 		transition={flyAndScale} | 		transition={flyAndScale} | ||||||
| 		sideOffset={4} | 		sideOffset={4} | ||||||
| 	> | 	> | ||||||
|  | @ -214,7 +214,7 @@ | ||||||
| 				<hr class="border-gray-100 dark:border-gray-800" /> | 				<hr class="border-gray-100 dark:border-gray-800" /> | ||||||
| 			{/if} | 			{/if} | ||||||
| 
 | 
 | ||||||
| 			<div class="px-3 my-2 max-h-80 overflow-y-auto"> | 			<div class="px-3 my-2 max-h-72 overflow-y-auto"> | ||||||
| 				{#each filteredItems as item} | 				{#each filteredItems as item} | ||||||
| 					<Select.Item | 					<Select.Item | ||||||
| 						class="flex w-full font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm  text-gray-700 dark:text-gray-100  outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg cursor-pointer data-[highlighted]:bg-muted" | 						class="flex w-full font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm  text-gray-700 dark:text-gray-100  outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg cursor-pointer data-[highlighted]:bg-muted" | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								src/lib/components/chat/TagChatModal.svelte
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/lib/components/chat/TagChatModal.svelte
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | <script lang="ts"> | ||||||
|  | 	import { getContext } from 'svelte'; | ||||||
|  | 	import Modal from '../common/Modal.svelte'; | ||||||
|  | 
 | ||||||
|  | 	import Tags from '../common/Tags.svelte'; | ||||||
|  | 
 | ||||||
|  | 	const i18n = getContext('i18n'); | ||||||
|  | 
 | ||||||
|  | 	export let tags; | ||||||
|  | 	export let deleteTag: Function; | ||||||
|  | 	export let addTag: Function; | ||||||
|  | 
 | ||||||
|  | 	export let show = false; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <Modal bind:show size="xs"> | ||||||
|  | 	<div class="px-4 pt-4 pb-5 w-full flex flex-col justify-center"> | ||||||
|  | 		<Tags {tags} {deleteTag} {addTag} /> | ||||||
|  | 	</div> | ||||||
|  | </Modal> | ||||||
|  | @ -8,7 +8,7 @@ | ||||||
| 	export let addTag: Function; | 	export let addTag: Function; | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <div class="flex flex-row space-x-0.5 line-clamp-1"> | <div class="flex flex-row flex-wrap gap-0.5 line-clamp-1"> | ||||||
| 	<TagList | 	<TagList | ||||||
| 		{tags} | 		{tags} | ||||||
| 		on:delete={(e) => { | 		on:delete={(e) => { | ||||||
|  | @ -17,6 +17,7 @@ | ||||||
| 	/> | 	/> | ||||||
| 
 | 
 | ||||||
| 	<TagInput | 	<TagInput | ||||||
|  | 		label={tags.length == 0 ? 'Add Tags' : ''} | ||||||
| 		on:add={(e) => { | 		on:add={(e) => { | ||||||
| 			addTag(e.detail); | 			addTag(e.detail); | ||||||
| 		}} | 		}} | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| 
 | 
 | ||||||
| 	const i18n = getContext('i18n'); | 	const i18n = getContext('i18n'); | ||||||
| 
 | 
 | ||||||
|  | 	export let label = ''; | ||||||
| 	let showTagInput = false; | 	let showTagInput = false; | ||||||
| 	let tagName = ''; | 	let tagName = ''; | ||||||
| 
 | 
 | ||||||
|  | @ -34,7 +35,7 @@ | ||||||
| 			</button> | 			</button> | ||||||
| 			<input | 			<input | ||||||
| 				bind:value={tagName} | 				bind:value={tagName} | ||||||
| 				class=" pl-2 cursor-pointer self-center text-xs h-fit bg-transparent outline-none line-clamp-1 w-[8rem]" | 				class=" pl-2 cursor-pointer self-center text-xs h-fit bg-transparent outline-none line-clamp-1 w-[5.5rem]" | ||||||
| 				placeholder={$i18n.t('Add a tag')} | 				placeholder={$i18n.t('Add a tag')} | ||||||
| 				list="tagOptions" | 				list="tagOptions" | ||||||
| 				on:keydown={(event) => { | 				on:keydown={(event) => { | ||||||
|  | @ -71,4 +72,8 @@ | ||||||
| 			</svg> | 			</svg> | ||||||
| 		</div> | 		</div> | ||||||
| 	</button> | 	</button> | ||||||
|  | 
 | ||||||
|  | 	{#if label && !showTagInput} | ||||||
|  | 		<span class="text-xs pl-1.5 self-center">{label}</span> | ||||||
|  | 	{/if} | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
| 
 | 
 | ||||||
| {#each tags as tag} | {#each tags as tag} | ||||||
| 	<div | 	<div | ||||||
| 		class="px-2 py-0.5 space-x-1 flex h-fit items-center rounded-full transition border dark:border-gray-600 dark:text-white" | 		class="px-2 py-0.5 space-x-1 flex h-fit items-center rounded-full transition border dark:border-gray-800 dark:text-white" | ||||||
| 	> | 	> | ||||||
| 		<div class=" text-[0.7rem] font-medium self-center line-clamp-1"> | 		<div class=" text-[0.7rem] font-medium self-center line-clamp-1"> | ||||||
| 			{tag.name} | 			{tag.name} | ||||||
|  |  | ||||||
|  | @ -29,6 +29,6 @@ | ||||||
| 	}); | 	}); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <div bind:this={tooltipElement} aria-label={content}> | <div bind:this={tooltipElement} aria-label={content} class="flex"> | ||||||
| 	<slot /> | 	<slot /> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								src/lib/components/icons/ChevronUpDown.svelte
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/lib/components/icons/ChevronUpDown.svelte
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | <script lang="ts"> | ||||||
|  | 	export let className = 'w-4 h-4'; | ||||||
|  | 	export let strokeWidth = '1.5'; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <svg | ||||||
|  | 	xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 	fill="none" | ||||||
|  | 	viewBox="0 0 24 24" | ||||||
|  | 	stroke-width={strokeWidth} | ||||||
|  | 	stroke="currentColor" | ||||||
|  | 	class={className} | ||||||
|  | > | ||||||
|  | 	<path | ||||||
|  | 		stroke-linecap="round" | ||||||
|  | 		stroke-linejoin="round" | ||||||
|  | 		d="M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" | ||||||
|  | 	/> | ||||||
|  | </svg> | ||||||
							
								
								
									
										19
									
								
								src/lib/components/icons/EllipsisVertical.svelte
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/lib/components/icons/EllipsisVertical.svelte
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | <script lang="ts"> | ||||||
|  | 	export let className = 'w-4 h-4'; | ||||||
|  | 	export let strokeWidth = '1.5'; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <svg | ||||||
|  | 	xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 	fill="none" | ||||||
|  | 	viewBox="0 0 24 24" | ||||||
|  | 	stroke-width={strokeWidth} | ||||||
|  | 	stroke="currentColor" | ||||||
|  | 	class={className} | ||||||
|  | > | ||||||
|  | 	<path | ||||||
|  | 		stroke-linecap="round" | ||||||
|  | 		stroke-linejoin="round" | ||||||
|  | 		d="M12 6.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 12.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 18.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Z" | ||||||
|  | 	/> | ||||||
|  | </svg> | ||||||
|  | @ -4,11 +4,21 @@ | ||||||
| 	import fileSaver from 'file-saver'; | 	import fileSaver from 'file-saver'; | ||||||
| 	const { saveAs } = fileSaver; | 	const { saveAs } = fileSaver; | ||||||
| 
 | 
 | ||||||
|  | 	import { Separator } from 'bits-ui'; | ||||||
| 	import { getChatById } from '$lib/apis/chats'; | 	import { getChatById } from '$lib/apis/chats'; | ||||||
| 	import { WEBUI_NAME, chatId, modelfiles, settings } from '$lib/stores'; | 	import { WEBUI_NAME, chatId, modelfiles, settings, showSettings } from '$lib/stores'; | ||||||
|  | 
 | ||||||
|  | 	import { slide } from 'svelte/transition'; | ||||||
| 	import ShareChatModal from '../chat/ShareChatModal.svelte'; | 	import ShareChatModal from '../chat/ShareChatModal.svelte'; | ||||||
| 	import TagInput from '../common/Tags/TagInput.svelte'; | 	import TagInput from '../common/Tags/TagInput.svelte'; | ||||||
| 	import Tags from '../common/Tags.svelte'; | 	import ModelSelector from '../chat/ModelSelector.svelte'; | ||||||
|  | 	import Tooltip from '../common/Tooltip.svelte'; | ||||||
|  | 
 | ||||||
|  | 	import EllipsisVertical from '../icons/EllipsisVertical.svelte'; | ||||||
|  | 	import ChevronDown from '../icons/ChevronDown.svelte'; | ||||||
|  | 	import ChevronUpDown from '../icons/ChevronUpDown.svelte'; | ||||||
|  | 	import Menu from './Navbar/Menu.svelte'; | ||||||
|  | 	import TagChatModal from '../chat/TagChatModal.svelte'; | ||||||
| 
 | 
 | ||||||
| 	const i18n = getContext('i18n'); | 	const i18n = getContext('i18n'); | ||||||
| 
 | 
 | ||||||
|  | @ -16,14 +26,16 @@ | ||||||
| 	export let title: string = $WEBUI_NAME; | 	export let title: string = $WEBUI_NAME; | ||||||
| 	export let shareEnabled: boolean = false; | 	export let shareEnabled: boolean = false; | ||||||
| 
 | 
 | ||||||
|  | 	export let selectedModels; | ||||||
|  | 
 | ||||||
| 	export let tags = []; | 	export let tags = []; | ||||||
| 	export let addTag: Function; | 	export let addTag: Function; | ||||||
| 	export let deleteTag: Function; | 	export let deleteTag: Function; | ||||||
| 
 | 
 | ||||||
| 	let showShareChatModal = false; | 	export let showModelSelector = false; | ||||||
| 
 | 
 | ||||||
| 	let tagName = ''; | 	let showShareChatModal = false; | ||||||
| 	let showTagInput = false; | 	let showTagChatModal = false; | ||||||
| 
 | 
 | ||||||
| 	const shareChat = async () => { | 	const shareChat = async () => { | ||||||
| 		const chat = (await getChatById(localStorage.token, $chatId)).chat; | 		const chat = (await getChatById(localStorage.token, $chatId)).chat; | ||||||
|  | @ -69,70 +81,154 @@ | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <ShareChatModal bind:show={showShareChatModal} {downloadChat} {shareChat} /> | <ShareChatModal bind:show={showShareChatModal} {downloadChat} {shareChat} /> | ||||||
|  | <!-- <TagChatModal bind:show={showTagChatModal} {tags} {deleteTag} {addTag} /> --> | ||||||
| <nav id="nav" class=" sticky py-2.5 top-0 flex flex-row justify-center z-30"> | <nav id="nav" class=" sticky py-2.5 top-0 flex flex-row justify-center z-30"> | ||||||
| 	<div | 	<div | ||||||
| 		class=" flex {$settings?.fullScreenMode ?? null | 		class=" flex {$settings?.fullScreenMode ?? null ? 'max-w-full' : 'max-w-3xl'}  | ||||||
| 			? 'max-w-full' | 		 w-full mx-auto px-3" | ||||||
| 			: 'max-w-3xl'}  w-full mx-auto px-3" |  | ||||||
| 	> | 	> | ||||||
| 		<div class="flex items-center w-full max-w-full"> | 		<!-- {#if shareEnabled} | ||||||
| 			<div class="pr-2 self-start"> | 			<div class="flex items-center w-full max-w-full"> | ||||||
| 				<button | 				<div class=" flex-1 self-center font-medium line-clamp-1"> | ||||||
| 					id="new-chat-button" | 					<div> | ||||||
| 					class=" cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-lg transition" | 						{title != '' ? title : $WEBUI_NAME} | ||||||
| 					on:click={initNewChat} |  | ||||||
| 				> |  | ||||||
| 					<div class=" m-auto self-center"> |  | ||||||
| 						<svg |  | ||||||
| 							xmlns="http://www.w3.org/2000/svg" |  | ||||||
| 							viewBox="0 0 20 20" |  | ||||||
| 							fill="currentColor" |  | ||||||
| 							class="w-5 h-5" |  | ||||||
| 						> |  | ||||||
| 							<path |  | ||||||
| 								d="M5.433 13.917l1.262-3.155A4 4 0 017.58 9.42l6.92-6.918a2.121 2.121 0 013 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 01-.65-.65z" |  | ||||||
| 							/> |  | ||||||
| 							<path |  | ||||||
| 								d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0010 3H4.75A2.75 2.75 0 002 5.75v9.5A2.75 2.75 0 004.75 18h9.5A2.75 2.75 0 0017 15.25V10a.75.75 0 00-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5z" |  | ||||||
| 							/> |  | ||||||
| 						</svg> |  | ||||||
| 					</div> | 					</div> | ||||||
| 				</button> | 				</div> | ||||||
| 			</div> | 				<div class="pl-2 self-center flex items-center"> | ||||||
| 			<div class=" flex-1 self-center font-medium line-clamp-1"> | 					<div class=" mr-1"> | ||||||
| 				<div> | 						<Tags {tags} {deleteTag} {addTag} /> | ||||||
| 					{title != '' ? title : $WEBUI_NAME} | 					</div> | ||||||
|  | 
 | ||||||
|  | 					<Tooltip content="Share"> | ||||||
|  | 						<button | ||||||
|  | 							class="cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-full transition" | ||||||
|  | 							on:click={async () => { | ||||||
|  | 								showShareChatModal = !showShareChatModal; | ||||||
|  | 
 | ||||||
|  | 								// console.log(showShareChatModal); | ||||||
|  | 							}} | ||||||
|  | 						> | ||||||
|  | 							<div class=" m-auto self-center"> | ||||||
|  | 								<svg | ||||||
|  | 									xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 									viewBox="0 0 24 24" | ||||||
|  | 									fill="currentColor" | ||||||
|  | 									class="w-4 h-4" | ||||||
|  | 								> | ||||||
|  | 									<path | ||||||
|  | 										fill-rule="evenodd" | ||||||
|  | 										d="M15.75 4.5a3 3 0 1 1 .825 2.066l-8.421 4.679a3.002 3.002 0 0 1 0 1.51l8.421 4.679a3 3 0 1 1-.729 1.31l-8.421-4.678a3 3 0 1 1 0-4.132l8.421-4.679a3 3 0 0 1-.096-.755Z" | ||||||
|  | 										clip-rule="evenodd" | ||||||
|  | 									/> | ||||||
|  | 								</svg> | ||||||
|  | 							</div> | ||||||
|  | 						</button> | ||||||
|  | 					</Tooltip> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
|  | 		{/if} --> | ||||||
| 
 | 
 | ||||||
| 			<div class="pl-2 self-center flex items-center space-x-2"> | 		<!-- <div class=" flex-1 self-center font-medium line-clamp-1"> | ||||||
| 				{#if shareEnabled} | 			<div> | ||||||
| 					<Tags {tags} {deleteTag} {addTag} /> | 				{title != '' ? title : $WEBUI_NAME} | ||||||
|  | 			</div> | ||||||
|  | 		</div> --> | ||||||
| 
 | 
 | ||||||
| 					<button | 		<div class="flex items-center w-full max-w-full"> | ||||||
| 						class=" cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-lg transition" | 			<div class="w-full flex-1 overflow-hidden max-w-full"> | ||||||
| 						on:click={async () => { | 				<ModelSelector bind:selectedModels /> | ||||||
|  | 			</div> | ||||||
|  | 
 | ||||||
|  | 			<div class="self-start flex flex-none items-center"> | ||||||
|  | 				<div class="flex self-center w-[1px] h-5 mx-2 bg-stone-700" /> | ||||||
|  | 
 | ||||||
|  | 				{#if !shareEnabled} | ||||||
|  | 					<Tooltip content="Settings"> | ||||||
|  | 						<button | ||||||
|  | 							class="cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-full transition" | ||||||
|  | 							id="open-settings-button" | ||||||
|  | 							on:click={async () => { | ||||||
|  | 								await showSettings.set(!$showSettings); | ||||||
|  | 							}} | ||||||
|  | 						> | ||||||
|  | 							<svg | ||||||
|  | 								xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 								fill="none" | ||||||
|  | 								viewBox="0 0 24 24" | ||||||
|  | 								stroke-width="1.5" | ||||||
|  | 								stroke="currentColor" | ||||||
|  | 								class="w-5 h-5" | ||||||
|  | 							> | ||||||
|  | 								<path | ||||||
|  | 									stroke-linecap="round" | ||||||
|  | 									stroke-linejoin="round" | ||||||
|  | 									d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" | ||||||
|  | 								/> | ||||||
|  | 								<path | ||||||
|  | 									stroke-linecap="round" | ||||||
|  | 									stroke-linejoin="round" | ||||||
|  | 									d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" | ||||||
|  | 								/> | ||||||
|  | 							</svg> | ||||||
|  | 						</button> | ||||||
|  | 					</Tooltip> | ||||||
|  | 				{:else} | ||||||
|  | 					<Menu | ||||||
|  | 						{shareEnabled} | ||||||
|  | 						shareHandler={() => { | ||||||
| 							showShareChatModal = !showShareChatModal; | 							showShareChatModal = !showShareChatModal; | ||||||
| 
 | 						}} | ||||||
| 							// console.log(showShareChatModal); | 						{tags} | ||||||
|  | 						{deleteTag} | ||||||
|  | 						{addTag} | ||||||
|  | 					> | ||||||
|  | 						<button | ||||||
|  | 							class="cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-full transition" | ||||||
|  | 						> | ||||||
|  | 							<div class=" m-auto self-center"> | ||||||
|  | 								<svg | ||||||
|  | 									xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 									fill="none" | ||||||
|  | 									viewBox="0 0 24 24" | ||||||
|  | 									stroke-width="1.5" | ||||||
|  | 									stroke="currentColor" | ||||||
|  | 									class="size-5" | ||||||
|  | 								> | ||||||
|  | 									<path | ||||||
|  | 										stroke-linecap="round" | ||||||
|  | 										stroke-linejoin="round" | ||||||
|  | 										d="M6.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM12.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0ZM18.75 12a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z" | ||||||
|  | 									/> | ||||||
|  | 								</svg> | ||||||
|  | 							</div> | ||||||
|  | 						</button> | ||||||
|  | 					</Menu> | ||||||
|  | 				{/if} | ||||||
|  | 				<Tooltip content="New Chat"> | ||||||
|  | 					<button | ||||||
|  | 						id="new-chat-button" | ||||||
|  | 						class=" cursor-pointer p-1.5 flex dark:hover:bg-gray-700 rounded-full transition" | ||||||
|  | 						on:click={() => { | ||||||
|  | 							initNewChat(); | ||||||
| 						}} | 						}} | ||||||
| 					> | 					> | ||||||
| 						<div class=" m-auto self-center"> | 						<div class=" m-auto self-center"> | ||||||
| 							<svg | 							<svg | ||||||
| 								xmlns="http://www.w3.org/2000/svg" | 								xmlns="http://www.w3.org/2000/svg" | ||||||
| 								viewBox="0 0 24 24" | 								viewBox="0 0 20 20" | ||||||
| 								fill="currentColor" | 								fill="currentColor" | ||||||
| 								class="w-4 h-4" | 								class="w-5 h-5" | ||||||
| 							> | 							> | ||||||
| 								<path | 								<path | ||||||
| 									fill-rule="evenodd" | 									d="M5.433 13.917l1.262-3.155A4 4 0 017.58 9.42l6.92-6.918a2.121 2.121 0 013 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 01-.65-.65z" | ||||||
| 									d="M15.75 4.5a3 3 0 1 1 .825 2.066l-8.421 4.679a3.002 3.002 0 0 1 0 1.51l8.421 4.679a3 3 0 1 1-.729 1.31l-8.421-4.678a3 3 0 1 1 0-4.132l8.421-4.679a3 3 0 0 1-.096-.755Z" | 								/> | ||||||
| 									clip-rule="evenodd" | 								<path | ||||||
|  | 									d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0010 3H4.75A2.75 2.75 0 002 5.75v9.5A2.75 2.75 0 004.75 18h9.5A2.75 2.75 0 0017 15.25V10a.75.75 0 00-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5z" | ||||||
| 								/> | 								/> | ||||||
| 							</svg> | 							</svg> | ||||||
| 						</div> | 						</div> | ||||||
| 					</button> | 					</button> | ||||||
| 				{/if} | 				</Tooltip> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
							
								
								
									
										123
									
								
								src/lib/components/layout/Navbar/Menu.svelte
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								src/lib/components/layout/Navbar/Menu.svelte
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,123 @@ | ||||||
|  | <script lang="ts"> | ||||||
|  | 	import { DropdownMenu } from 'bits-ui'; | ||||||
|  | 	import { flyAndScale } from '$lib/utils/transitions'; | ||||||
|  | 
 | ||||||
|  | 	import Dropdown from '$lib/components/common/Dropdown.svelte'; | ||||||
|  | 	import GarbageBin from '$lib/components/icons/GarbageBin.svelte'; | ||||||
|  | 	import Pencil from '$lib/components/icons/Pencil.svelte'; | ||||||
|  | 	import Tooltip from '$lib/components/common/Tooltip.svelte'; | ||||||
|  | 	import { showSettings } from '$lib/stores'; | ||||||
|  | 	import Tags from '$lib/components/common/Tags.svelte'; | ||||||
|  | 
 | ||||||
|  | 	export let shareEnabled: boolean = false; | ||||||
|  | 	export let shareHandler: Function; | ||||||
|  | 	// export let tagHandler: Function; | ||||||
|  | 
 | ||||||
|  | 	export let tags; | ||||||
|  | 	export let deleteTag: Function; | ||||||
|  | 	export let addTag: Function; | ||||||
|  | 
 | ||||||
|  | 	export let onClose: Function = () => {}; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <Dropdown | ||||||
|  | 	on:change={(e) => { | ||||||
|  | 		if (e.detail === false) { | ||||||
|  | 			onClose(); | ||||||
|  | 		} | ||||||
|  | 	}} | ||||||
|  | > | ||||||
|  | 	<slot /> | ||||||
|  | 
 | ||||||
|  | 	<div slot="content"> | ||||||
|  | 		<DropdownMenu.Content | ||||||
|  | 			class="w-full max-w-[150px] rounded-lg px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow" | ||||||
|  | 			sideOffset={8} | ||||||
|  | 			side="bottom" | ||||||
|  | 			align="end" | ||||||
|  | 			transition={flyAndScale} | ||||||
|  | 		> | ||||||
|  | 			<DropdownMenu.Item | ||||||
|  | 				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer" | ||||||
|  | 				on:click={async () => { | ||||||
|  | 					await showSettings.set(!$showSettings); | ||||||
|  | 				}} | ||||||
|  | 			> | ||||||
|  | 				<svg | ||||||
|  | 					xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 					fill="none" | ||||||
|  | 					viewBox="0 0 24 24" | ||||||
|  | 					stroke-width="1.5" | ||||||
|  | 					stroke="currentColor" | ||||||
|  | 					class="w-5 h-5" | ||||||
|  | 				> | ||||||
|  | 					<path | ||||||
|  | 						stroke-linecap="round" | ||||||
|  | 						stroke-linejoin="round" | ||||||
|  | 						d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" | ||||||
|  | 					/> | ||||||
|  | 					<path | ||||||
|  | 						stroke-linecap="round" | ||||||
|  | 						stroke-linejoin="round" | ||||||
|  | 						d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" | ||||||
|  | 					/> | ||||||
|  | 				</svg> | ||||||
|  | 				<div class="flex items-center">Settings</div> | ||||||
|  | 			</DropdownMenu.Item> | ||||||
|  | 
 | ||||||
|  | 			{#if shareEnabled} | ||||||
|  | 				<DropdownMenu.Item | ||||||
|  | 					class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer" | ||||||
|  | 					on:click={() => { | ||||||
|  | 						shareHandler(); | ||||||
|  | 					}} | ||||||
|  | 				> | ||||||
|  | 					<svg | ||||||
|  | 						xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 						viewBox="0 0 24 24" | ||||||
|  | 						fill="currentColor" | ||||||
|  | 						class="size-4" | ||||||
|  | 					> | ||||||
|  | 						<path | ||||||
|  | 							fill-rule="evenodd" | ||||||
|  | 							d="M15.75 4.5a3 3 0 1 1 .825 2.066l-8.421 4.679a3.002 3.002 0 0 1 0 1.51l8.421 4.679a3 3 0 1 1-.729 1.31l-8.421-4.678a3 3 0 1 1 0-4.132l8.421-4.679a3 3 0 0 1-.096-.755Z" | ||||||
|  | 							clip-rule="evenodd" | ||||||
|  | 						/> | ||||||
|  | 					</svg> | ||||||
|  | 					<div class="flex items-center">Share</div> | ||||||
|  | 				</DropdownMenu.Item> | ||||||
|  | 
 | ||||||
|  | 				<hr class="border-gray-100 dark:border-gray-800 my-1" /> | ||||||
|  | 
 | ||||||
|  | 				<div class="flex p-1"> | ||||||
|  | 					<Tags {tags} {deleteTag} {addTag} /> | ||||||
|  | 				</div> | ||||||
|  | 
 | ||||||
|  | 				<!-- <DropdownMenu.Item | ||||||
|  | 					class="flex  gap-2  items-center px-3 py-2 text-sm  font-medium cursor-pointer" | ||||||
|  | 					on:click={() => { | ||||||
|  | 						tagHandler(); | ||||||
|  | 					}} | ||||||
|  | 				> | ||||||
|  | 					<svg | ||||||
|  | 						xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 						fill="none" | ||||||
|  | 						viewBox="0 0 24 24" | ||||||
|  | 						stroke-width="2" | ||||||
|  | 						stroke="currentColor" | ||||||
|  | 						class="size-4" | ||||||
|  | 					> | ||||||
|  | 						<path | ||||||
|  | 							stroke-linecap="round" | ||||||
|  | 							stroke-linejoin="round" | ||||||
|  | 							d="M9.568 3H5.25A2.25 2.25 0 0 0 3 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 0 0 5.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 0 0 9.568 3Z" | ||||||
|  | 						/> | ||||||
|  | 						<path stroke-linecap="round" stroke-linejoin="round" d="M6 6h.008v.008H6V6Z" /> | ||||||
|  | 					</svg> | ||||||
|  | 
 | ||||||
|  | 					<div class="flex items-center">Tag</div> | ||||||
|  | 				</DropdownMenu.Item> --> | ||||||
|  | 			{/if} | ||||||
|  | 		</DropdownMenu.Content> | ||||||
|  | 	</div> | ||||||
|  | </Dropdown> | ||||||
|  | @ -107,7 +107,7 @@ | ||||||
| 	bind:this={navElement} | 	bind:this={navElement} | ||||||
| 	class="h-screen max-h-[100dvh] min-h-screen {show | 	class="h-screen max-h-[100dvh] min-h-screen {show | ||||||
| 		? 'lg:relative w-[260px]' | 		? 'lg:relative w-[260px]' | ||||||
| 		: '-translate-x-[260px] w-[0px]'} bg-gray-50 text-gray-900 dark:bg-gray-950 dark:text-gray-200 text-sm transition z-40 fixed top-0 left-0 | 		: '-translate-x-[260px] w-[0px]'} bg-gray-50 text-gray-900 dark:bg-gray-950 dark:text-gray-200 text-sm transition fixed z-50 top-0 left-0 | ||||||
|         " |         " | ||||||
| > | > | ||||||
| 	<div | 	<div | ||||||
|  | @ -706,7 +706,7 @@ | ||||||
| 	</div> | 	</div> | ||||||
| 
 | 
 | ||||||
| 	<div | 	<div | ||||||
| 		class="fixed left-0 top-[50dvh] z-40 -translate-y-1/2 transition-transform translate-x-[255px] md:translate-x-[260px] rotate-0" | 		class="fixed left-0 top-[50dvh] -translate-y-1/2 transition-transform translate-x-[255px] md:translate-x-[260px] rotate-0" | ||||||
| 	> | 	> | ||||||
| 		<Tooltip | 		<Tooltip | ||||||
| 			placement="right" | 			placement="right" | ||||||
|  |  | ||||||
|  | @ -48,6 +48,7 @@ | ||||||
| 	let messagesContainerElement: HTMLDivElement; | 	let messagesContainerElement: HTMLDivElement; | ||||||
| 	let currentRequestId = null; | 	let currentRequestId = null; | ||||||
| 
 | 
 | ||||||
|  | 	let showModelSelector = false; | ||||||
| 	let selectedModels = ['']; | 	let selectedModels = ['']; | ||||||
| 
 | 
 | ||||||
| 	let selectedModelfile = null; | 	let selectedModelfile = null; | ||||||
|  | @ -837,7 +838,16 @@ | ||||||
| </svelte:head> | </svelte:head> | ||||||
| 
 | 
 | ||||||
| <div class="h-screen max-h-[100dvh] w-full flex flex-col"> | <div class="h-screen max-h-[100dvh] w-full flex flex-col"> | ||||||
| 	<Navbar {title} shareEnabled={messages.length > 0} {initNewChat} {tags} {addTag} {deleteTag} /> | 	<Navbar | ||||||
|  | 		{title} | ||||||
|  | 		bind:selectedModels | ||||||
|  | 		bind:showModelSelector | ||||||
|  | 		shareEnabled={messages.length > 0} | ||||||
|  | 		{initNewChat} | ||||||
|  | 		{tags} | ||||||
|  | 		{addTag} | ||||||
|  | 		{deleteTag} | ||||||
|  | 	/> | ||||||
| 	<div class="flex flex-col flex-auto"> | 	<div class="flex flex-col flex-auto"> | ||||||
| 		<div | 		<div | ||||||
| 			class=" pb-2.5 flex flex-col justify-between w-full flex-auto overflow-auto h-0" | 			class=" pb-2.5 flex flex-col justify-between w-full flex-auto overflow-auto h-0" | ||||||
|  | @ -849,15 +859,7 @@ | ||||||
| 					messagesContainerElement.clientHeight + 5; | 					messagesContainerElement.clientHeight + 5; | ||||||
| 			}} | 			}} | ||||||
| 		> | 		> | ||||||
| 			<div | 			<div class=" h-full w-full flex flex-col pt-2 pb-4"> | ||||||
| 				class="{$settings?.fullScreenMode ?? null |  | ||||||
| 					? 'max-w-full' |  | ||||||
| 					: 'max-w-2xl md:px-0'} mx-auto w-full px-4" |  | ||||||
| 			> |  | ||||||
| 				<ModelSelector bind:selectedModels /> |  | ||||||
| 			</div> |  | ||||||
| 
 |  | ||||||
| 			<div class=" h-full w-full flex flex-col py-8"> |  | ||||||
| 				<Messages | 				<Messages | ||||||
| 					chatId={$chatId} | 					chatId={$chatId} | ||||||
| 					{selectedModels} | 					{selectedModels} | ||||||
|  |  | ||||||
|  | @ -56,8 +56,10 @@ | ||||||
| 	let currentRequestId = null; | 	let currentRequestId = null; | ||||||
| 
 | 
 | ||||||
| 	// let chatId = $page.params.id; | 	// let chatId = $page.params.id; | ||||||
|  | 	let showModelSelector = false; | ||||||
| 	let selectedModels = ['']; | 	let selectedModels = ['']; | ||||||
| 	let selectedModelfile = null; | 	let selectedModelfile = null; | ||||||
|  | 
 | ||||||
| 	$: selectedModelfile = | 	$: selectedModelfile = | ||||||
| 		selectedModels.length === 1 && | 		selectedModels.length === 1 && | ||||||
| 		$modelfiles.filter((modelfile) => modelfile.tagName === selectedModels[0]).length > 0 | 		$modelfiles.filter((modelfile) => modelfile.tagName === selectedModels[0]).length > 0 | ||||||
|  | @ -861,6 +863,8 @@ | ||||||
| 	<div class="min-h-screen max-h-screen w-full flex flex-col"> | 	<div class="min-h-screen max-h-screen w-full flex flex-col"> | ||||||
| 		<Navbar | 		<Navbar | ||||||
| 			{title} | 			{title} | ||||||
|  | 			bind:selectedModels | ||||||
|  | 			bind:showModelSelector | ||||||
| 			shareEnabled={messages.length > 0} | 			shareEnabled={messages.length > 0} | ||||||
| 			initNewChat={async () => { | 			initNewChat={async () => { | ||||||
| 				if (currentRequestId !== null) { | 				if (currentRequestId !== null) { | ||||||
|  | @ -885,15 +889,7 @@ | ||||||
| 						messagesContainerElement.clientHeight + 5; | 						messagesContainerElement.clientHeight + 5; | ||||||
| 				}} | 				}} | ||||||
| 			> | 			> | ||||||
| 				<div | 				<div class=" h-full w-full flex flex-col py-4"> | ||||||
| 					class="{$settings?.fullScreenMode ?? null |  | ||||||
| 						? 'max-w-full' |  | ||||||
| 						: 'max-w-2xl md:px-0'} mx-auto w-full px-4" |  | ||||||
| 				> |  | ||||||
| 					<ModelSelector bind:selectedModels /> |  | ||||||
| 				</div> |  | ||||||
| 
 |  | ||||||
| 				<div class=" h-full w-full flex flex-col py-8"> |  | ||||||
| 					<Messages | 					<Messages | ||||||
| 						chatId={$chatId} | 						chatId={$chatId} | ||||||
| 						{selectedModels} | 						{selectedModels} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek