Browse Source

去掉深色模式样式,显示出来侧边对话记录

master
mk 1 year ago
parent
commit
c78fac09f5
  1. 22
      src/lib/components/AddConnectionModal.svelte
  2. 4
      src/lib/components/AddFilesPlaceholder.svelte
  3. 14
      src/lib/components/ChangelogModal.svelte
  4. 4
      src/lib/components/NotificationToast.svelte
  5. 2
      src/lib/components/admin/Evaluations.svelte
  6. 4
      src/lib/components/admin/Evaluations/FeedbackMenu.svelte
  7. 26
      src/lib/components/admin/Evaluations/Feedbacks.svelte
  8. 18
      src/lib/components/admin/Evaluations/Leaderboard.svelte
  9. 24
      src/lib/components/admin/Functions.svelte
  10. 8
      src/lib/components/admin/Functions/FunctionEditor.svelte
  11. 16
      src/lib/components/admin/Functions/FunctionMenu.svelte
  12. 2
      src/lib/components/admin/Settings.svelte
  13. 50
      src/lib/components/admin/Settings/Audio.svelte
  14. 12
      src/lib/components/admin/Settings/CodeExecution.svelte
  15. 10
      src/lib/components/admin/Settings/Connections.svelte
  16. 4
      src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte
  17. 4
      src/lib/components/admin/Settings/Connections/OllamaConnection.svelte
  18. 2
      src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte
  19. 10
      src/lib/components/admin/Settings/Database.svelte
  20. 44
      src/lib/components/admin/Settings/Documents.svelte
  21. 4
      src/lib/components/admin/Settings/Evaluations.svelte
  22. 24
      src/lib/components/admin/Settings/Evaluations/ArenaModelModal.svelte
  23. 2
      src/lib/components/admin/Settings/Evaluations/Model.svelte
  24. 22
      src/lib/components/admin/Settings/General.svelte
  25. 34
      src/lib/components/admin/Settings/Images.svelte
  26. 22
      src/lib/components/admin/Settings/Interface.svelte
  27. 12
      src/lib/components/admin/Settings/Models.svelte
  28. 14
      src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte
  29. 2
      src/lib/components/admin/Settings/Models/Manage/ManageMultipleOllama.svelte
  30. 30
      src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte
  31. 6
      src/lib/components/admin/Settings/Models/ManageModelsModal.svelte
  32. 26
      src/lib/components/admin/Settings/Pipelines.svelte
  33. 24
      src/lib/components/admin/Settings/WebSearch.svelte
  34. 2
      src/lib/components/admin/Users.svelte
  35. 14
      src/lib/components/admin/Users/Groups.svelte
  36. 10
      src/lib/components/admin/Users/Groups/AddGroupModal.svelte
  37. 6
      src/lib/components/admin/Users/Groups/Display.svelte
  38. 10
      src/lib/components/admin/Users/Groups/EditGroupModal.svelte
  39. 2
      src/lib/components/admin/Users/Groups/GroupItem.svelte
  40. 10
      src/lib/components/admin/Users/Groups/Permissions.svelte
  41. 14
      src/lib/components/admin/Users/UserList.svelte
  42. 14
      src/lib/components/admin/Users/UserList/AddUserModal.svelte
  43. 14
      src/lib/components/admin/Users/UserList/EditUserModal.svelte
  44. 10
      src/lib/components/admin/Users/UserList/UserChatsModal.svelte
  45. 2
      src/lib/components/app/AppSidebar.svelte
  46. 2
      src/lib/components/channel/Channel.svelte
  47. 12
      src/lib/components/channel/MessageInput.svelte
  48. 6
      src/lib/components/channel/MessageInput/InputMenu.svelte
  49. 22
      src/lib/components/channel/Messages/Message.svelte
  50. 2
      src/lib/components/channel/Messages/Message/ProfilePreview.svelte
  51. 8
      src/lib/components/channel/Messages/Message/ReactionPicker.svelte
  52. 17
      src/lib/components/channel/Navbar.svelte
  53. 4
      src/lib/components/channel/Thread.svelte
  54. 20
      src/lib/components/chat/Artifacts.svelte
  55. 4
      src/lib/components/chat/ChatControls.svelte
  56. 4
      src/lib/components/chat/ChatPlaceholder.svelte
  57. 18
      src/lib/components/chat/ContentRenderer/FloatingButtons.svelte
  58. 14
      src/lib/components/chat/Controls/Controls.svelte
  59. 24
      src/lib/components/chat/MessageInput.svelte
  60. 4
      src/lib/components/chat/MessageInput/CallOverlay.svelte
  61. 4
      src/lib/components/chat/MessageInput/CallOverlay/VideoInputMenu.svelte
  62. 4
      src/lib/components/chat/MessageInput/Commands.svelte
  63. 32
      src/lib/components/chat/MessageInput/Commands/Knowledge.svelte
  64. 8
      src/lib/components/chat/MessageInput/Commands/Models.svelte
  65. 12
      src/lib/components/chat/MessageInput/Commands/Prompts.svelte
  66. 8
      src/lib/components/chat/MessageInput/InputMenu.svelte
  67. 4
      src/lib/components/chat/MessageInput/VoiceRecording.svelte
  68. 8
      src/lib/components/chat/Messages/Citations.svelte
  69. 24
      src/lib/components/chat/Messages/CitationsModal.svelte
  70. 18
      src/lib/components/chat/Messages/CodeBlock.svelte
  71. 10
      src/lib/components/chat/Messages/CodeExecutionModal.svelte
  72. 2
      src/lib/components/chat/Messages/CodeExecutions.svelte
  73. 12
      src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte
  74. 2
      src/lib/components/chat/Messages/Markdown/Source.svelte
  75. 6
      src/lib/components/chat/Messages/MultiResponseMessages.svelte
  76. 8
      src/lib/components/chat/Messages/RateComment.svelte
  77. 26
      src/lib/components/chat/Messages/ResponseMessage.svelte
  78. 6
      src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte
  79. 18
      src/lib/components/chat/Messages/UserMessage.svelte
  80. 26
      src/lib/components/chat/ModelSelector/Selector.svelte
  81. 28
      src/lib/components/chat/Navbar.svelte
  82. 2
      src/lib/components/chat/Overview.svelte
  83. 6
      src/lib/components/chat/Overview/Node.svelte
  84. 4
      src/lib/components/chat/Placeholder.svelte
  85. 14
      src/lib/components/chat/Settings/About.svelte
  86. 22
      src/lib/components/chat/Settings/Account.svelte
  87. 8
      src/lib/components/chat/Settings/Account/UpdatePassword.svelte
  88. 6
      src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte
  89. 10
      src/lib/components/chat/Settings/Audio.svelte
  90. 10
      src/lib/components/chat/Settings/Chats.svelte
  91. 2
      src/lib/components/chat/Settings/Connections.svelte
  92. 2
      src/lib/components/chat/Settings/Connections/Connection.svelte
  93. 10
      src/lib/components/chat/Settings/General.svelte
  94. 2
      src/lib/components/chat/Settings/Interface.svelte
  95. 4
      src/lib/components/chat/Settings/Personalization.svelte
  96. 4
      src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte
  97. 4
      src/lib/components/chat/Settings/Personalization/EditMemoryModal.svelte
  98. 10
      src/lib/components/chat/Settings/Personalization/ManageModal.svelte
  99. 8
      src/lib/components/chat/SettingsModal.svelte
  100. 8
      src/lib/components/chat/ShareChatModal.svelte

22
src/lib/components/AddConnectionModal.svelte

@ -126,7 +126,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center font-primary"> <div class=" text-lg font-medium self-center font-primary">
{#if edit} {#if edit}
{$i18n.t('Edit Connection')} {$i18n.t('Edit Connection')}
@ -153,7 +153,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"
@ -169,7 +169,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={url} bind:value={url}
placeholder={$i18n.t('API Base URL')} placeholder={$i18n.t('API Base URL')}
@ -181,7 +181,7 @@
<Tooltip content="Verify Connection" className="self-end -mb-1"> <Tooltip content="Verify Connection" className="self-end -mb-1">
<button <button
class="self-center p-1 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg transition" class="self-center p-1 bg-transparent hover:bg-gray-100 rounded-lg transition"
on:click={() => { on:click={() => {
verifyHandler(); verifyHandler();
}} }}
@ -215,7 +215,7 @@
<div class="flex-1"> <div class="flex-1">
<SensitiveInput <SensitiveInput
className="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" className="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
bind:value={key} bind:value={key}
placeholder={$i18n.t('API Key')} placeholder={$i18n.t('API Key')}
required={!ollama} required={!ollama}
@ -233,7 +233,7 @@
)} )}
> >
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={prefixId} bind:value={prefixId}
placeholder={$i18n.t('Prefix ID')} placeholder={$i18n.t('Prefix ID')}
@ -244,7 +244,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class="mb-1 flex justify-between"> <div class="mb-1 flex justify-between">
@ -286,13 +286,13 @@
{/if} {/if}
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div class="flex items-center"> <div class="flex items-center">
<input <input
class="w-full py-1 text-sm rounded-lg bg-transparent {modelId class="w-full py-1 text-sm rounded-lg bg-transparent {modelId
? '' ? ''
: 'text-gray-500'} placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" : 'text-gray-500'} placeholder:text-gray-300 outline-hidden"
bind:value={modelId} bind:value={modelId}
placeholder={$i18n.t('Add a model ID')} placeholder={$i18n.t('Add a model ID')}
/> />
@ -313,7 +313,7 @@
<div class="flex justify-end pt-3 text-sm font-medium gap-1.5"> <div class="flex justify-end pt-3 text-sm font-medium gap-1.5">
{#if edit} {#if edit}
<button <button
class="px-3.5 py-1.5 text-sm font-medium dark:bg-black dark:hover:bg-gray-900 dark:text-white bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center" class="px-3.5 py-1.5 text-sm font-medium bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center"
type="button" type="button"
on:click={() => { on:click={() => {
onDelete(); onDelete();
@ -325,7 +325,7 @@
{/if} {/if}
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

4
src/lib/components/AddFilesPlaceholder.svelte

@ -8,7 +8,7 @@
<div class="px-3"> <div class="px-3">
<div class="text-center text-6xl mb-3">📄</div> <div class="text-center text-6xl mb-3">📄</div>
<div class="text-center dark:text-white text-xl font-semibold z-50"> <div class="text-center text-xl font-semibold z-50">
{#if title} {#if title}
{title} {title}
{:else} {:else}
@ -17,7 +17,7 @@
</div> </div>
<slot <slot
><div class="px-2 mt-2 text-center text-sm dark:text-gray-200 w-full"> ><div class="px-2 mt-2 text-center text-sm w-full">
{#if content} {#if content}
{content} {content}
{:else} {:else}

14
src/lib/components/ChangelogModal.svelte

@ -23,7 +23,7 @@
</script> </script>
<Modal bind:show size="lg"> <Modal bind:show size="lg">
<div class="px-5 pt-4 dark:text-gray-300 text-gray-700"> <div class="px-5 pt-4 text-gray-700">
<div class="flex justify-between items-start"> <div class="flex justify-between items-start">
<div class="text-xl font-semibold"> <div class="text-xl font-semibold">
{$i18n.t('What’s New in')} {$i18n.t('What’s New in')}
@ -50,25 +50,25 @@
</button> </button>
</div> </div>
<div class="flex items-center mt-1"> <div class="flex items-center mt-1">
<div class="text-sm dark:text-gray-200">{$i18n.t('Release Notes')}</div> <div class="text-sm ">{$i18n.t('Release Notes')}</div>
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
<div class="text-sm dark:text-gray-200"> <div class="text-sm ">
v{WEBUI_VERSION} v{WEBUI_VERSION}
</div> </div>
</div> </div>
</div> </div>
<div class=" w-full p-4 px-5 text-gray-700 dark:text-gray-100"> <div class=" w-full p-4 px-5 text-gray-700 ">
<div class=" overflow-y-scroll max-h-96 scrollbar-hidden"> <div class=" overflow-y-scroll max-h-96 scrollbar-hidden">
<div class="mb-3"> <div class="mb-3">
{#if changelog} {#if changelog}
{#each Object.keys(changelog) as version} {#each Object.keys(changelog) as version}
<div class=" mb-3 pr-2"> <div class=" mb-3 pr-2">
<div class="font-semibold text-xl mb-1 dark:text-white"> <div class="font-semibold text-xl mb-1 ">
v{version} - {changelog[version].date} v{version} - {changelog[version].date}
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
{#each Object.keys(changelog[version]).filter((section) => section !== 'date') as section} {#each Object.keys(changelog[version]).filter((section) => section !== 'date') as section}
<div class=""> <div class="">
@ -111,7 +111,7 @@
await updateUserSettings(localStorage.token, { ui: $settings }); await updateUserSettings(localStorage.token, { ui: $settings });
show = false; show = false;
}} }}
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
> >
<span class="relative">{$i18n.t("Okay, Let's Go!")}</span> <span class="relative">{$i18n.t("Okay, Let's Go!")}</span>
</button> </button>

4
src/lib/components/NotificationToast.svelte

@ -31,7 +31,7 @@
</script> </script>
<button <button
class="flex gap-2.5 text-left min-w-[var(--width)] w-full dark:bg-gray-850 dark:text-white bg-white text-black border border-gray-100 dark:border-gray-850 rounded-xl px-3.5 py-3.5" class="flex gap-2.5 text-left min-w-[var(--width)] w-full bg-white text-black border border-gray-100 rounded-xl px-3.5 py-3.5"
on:click={() => { on:click={() => {
onClick(); onClick();
dispatch('closeToast'); dispatch('closeToast');
@ -46,7 +46,7 @@
<div class=" text-[13px] font-medium mb-0.5 line-clamp-1 capitalize">{title}</div> <div class=" text-[13px] font-medium mb-0.5 line-clamp-1 capitalize">{title}</div>
{/if} {/if}
<div class=" line-clamp-2 text-xs self-center dark:text-gray-300 font-normal"> <div class=" line-clamp-2 text-xs self-center font-normal">
{@html DOMPurify.sanitize(marked(content))} {@html DOMPurify.sanitize(marked(content))}
</div> </div>
</div> </div>

2
src/lib/components/admin/Evaluations.svelte

@ -34,7 +34,7 @@
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4"> <div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
<div <div
id="users-tabs-container" id="users-tabs-container"
class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none" class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 text-sm font-medium text-left scrollbar-none"
> >
<button <button
class="px-0.5 py-1 min-w-fit rounded-lg lg:flex-none flex text-right transition {selectedTab === class="px-0.5 py-1 min-w-fit rounded-lg lg:flex-none flex text-right transition {selectedTab ===

4
src/lib/components/admin/Evaluations/FeedbackMenu.svelte

@ -25,14 +25,14 @@
<div slot="content"> <div slot="content">
<DropdownMenu.Content <DropdownMenu.Content
class="w-full max-w-[150px] rounded-xl px-1 py-1.5 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg" class="w-full max-w-[150px] rounded-xl px-1 py-1.5 z-50 bg-white shadow-lg"
sideOffset={-2} sideOffset={-2}
side="bottom" side="bottom"
align="start" align="start"
transition={flyAndScale} transition={flyAndScale}
> >
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-1.5 text-sm cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-1.5 text-sm cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
dispatch('delete'); dispatch('delete');
show = false; show = false;

26
src/lib/components/admin/Evaluations/Feedbacks.svelte

@ -110,16 +110,16 @@
<div class="flex md:self-center text-lg font-medium px-0.5"> <div class="flex md:self-center text-lg font-medium px-0.5">
{$i18n.t('Feedback History')} {$i18n.t('Feedback History')}
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 " />
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{feedbacks.length}</span> <span class="text-lg font-medium text-gray-500 ">{feedbacks.length}</span>
</div> </div>
<div> <div>
<div> <div>
<Tooltip content={$i18n.t('Export')}> <Tooltip content={$i18n.t('Export')}>
<button <button
class=" p-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition font-medium text-sm flex items-center space-x-1" class=" p-2 rounded-xl hover:bg-gray-100 transition font-medium text-sm flex items-center space-x-1"
on:click={() => { on:click={() => {
exportHandler(); exportHandler();
}} }}
@ -135,15 +135,15 @@
class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full rounded-sm pt-0.5" class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full rounded-sm pt-0.5"
> >
{#if (feedbacks ?? []).length === 0} {#if (feedbacks ?? []).length === 0}
<div class="text-center text-xs text-gray-500 dark:text-gray-400 py-1"> <div class="text-center text-xs text-gray-500 py-1">
{$i18n.t('No feedbacks found')} {$i18n.t('No feedbacks found')}
</div> </div>
{:else} {:else}
<table <table
class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full rounded-sm" class="w-full text-sm text-left text-gray-500 table-auto max-w-full rounded-sm"
> >
<thead <thead
class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400 -translate-y-0.5" class="text-xs text-gray-700 uppercase bg-gray-50 -translate-y-0.5"
> >
<tr class=""> <tr class="">
<th scope="col" class="px-3 text-right cursor-pointer select-none w-0"> <th scope="col" class="px-3 text-right cursor-pointer select-none w-0">
@ -167,7 +167,7 @@
</thead> </thead>
<tbody class=""> <tbody class="">
{#each paginatedFeedbacks as feedback (feedback.id)} {#each paginatedFeedbacks as feedback (feedback.id)}
<tr class="bg-white dark:border-gray-850 text-xs"> <tr class="bg-white text-xs">
<td class=" py-0.5 text-right font-semibold"> <td class=" py-0.5 text-right font-semibold">
<div class="flex justify-center"> <div class="flex justify-center">
<Tooltip content={feedback?.user?.name}> <Tooltip content={feedback?.user?.name}>
@ -186,12 +186,12 @@
<div class="flex flex-col items-start gap-0.5 h-full"> <div class="flex flex-col items-start gap-0.5 h-full">
<div class="flex flex-col h-full"> <div class="flex flex-col h-full">
{#if feedback.data?.sibling_model_ids} {#if feedback.data?.sibling_model_ids}
<div class="font-semibold text-gray-600 dark:text-gray-400 flex-1"> <div class="font-semibold text-gray-600 flex-1">
{feedback.data?.model_id} {feedback.data?.model_id}
</div> </div>
<Tooltip content={feedback.data.sibling_model_ids.join(', ')}> <Tooltip content={feedback.data.sibling_model_ids.join(', ')}>
<div class=" text-[0.65rem] text-gray-600 dark:text-gray-400 line-clamp-1"> <div class=" text-[0.65rem] text-gray-600 line-clamp-1">
{#if feedback.data.sibling_model_ids.length > 2} {#if feedback.data.sibling_model_ids.length > 2}
<!-- {$i18n.t('and {{COUNT}} more')} --> <!-- {$i18n.t('and {{COUNT}} more')} -->
{feedback.data.sibling_model_ids.slice(0, 2).join(', ')}, {$i18n.t( {feedback.data.sibling_model_ids.slice(0, 2).join(', ')}, {$i18n.t(
@ -205,7 +205,7 @@
</Tooltip> </Tooltip>
{:else} {:else}
<div <div
class=" text-sm font-medium text-gray-600 dark:text-gray-400 flex-1 py-1.5" class=" text-sm font-medium text-gray-600 flex-1 py-1.5"
> >
{feedback.data?.model_id} {feedback.data?.model_id}
</div> </div>
@ -213,7 +213,7 @@
</div> </div>
</div> </div>
</td> </td>
<td class="px-3 py-1 text-right font-medium text-gray-900 dark:text-white w-max"> <td class="px-3 py-1 text-right font-medium text-gray-900 w-max">
<div class=" flex justify-end"> <div class=" flex justify-end">
{#if feedback.data.rating.toString() === '1'} {#if feedback.data.rating.toString() === '1'}
<Badge type="info" content={$i18n.t('Won')} /> <Badge type="info" content={$i18n.t('Won')} />
@ -236,7 +236,7 @@
}} }}
> >
<button <button
class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm p-1.5 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
> >
<EllipsisHorizontal /> <EllipsisHorizontal />
</button> </button>
@ -262,7 +262,7 @@
)} )}
> >
<button <button
class="flex text-xs items-center px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-200 transition" class="flex text-xs items-center px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 transition"
on:click={async () => { on:click={async () => {
shareHandler(); shareHandler();
}} }}

18
src/lib/components/admin/Evaluations/Leaderboard.svelte

@ -274,9 +274,9 @@
{$i18n.t('Leaderboard')} {$i18n.t('Leaderboard')}
</div> </div>
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 " />
<span class="text-lg font-medium text-gray-500 dark:text-gray-300 mr-1.5" <span class="text-lg font-medium text-gray-500 mr-1.5"
>{rankedModels.length}</span >{rankedModels.length}</span
> >
</div> </div>
@ -311,17 +311,17 @@
</div> </div>
{/if} {/if}
{#if (rankedModels ?? []).length === 0} {#if (rankedModels ?? []).length === 0}
<div class="text-center text-xs text-gray-500 dark:text-gray-400 py-1"> <div class="text-center text-xs text-gray-500 py-1">
{$i18n.t('No models found')} {$i18n.t('No models found')}
</div> </div>
{:else} {:else}
<table <table
class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full rounded {loadingLeaderboard class="w-full text-sm text-left text-gray-500 table-auto max-w-full rounded {loadingLeaderboard
? 'opacity-20' ? 'opacity-20'
: ''}" : ''}"
> >
<thead <thead
class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400 -translate-y-0.5" class="text-xs text-gray-700 uppercase bg-gray-50 -translate-y-0.5"
> >
<tr class=""> <tr class="">
<th scope="col" class="px-3 py-1.5 cursor-pointer select-none w-3"> <th scope="col" class="px-3 py-1.5 cursor-pointer select-none w-3">
@ -343,8 +343,8 @@
</thead> </thead>
<tbody class=""> <tbody class="">
{#each rankedModels as model, modelIdx (model.id)} {#each rankedModels as model, modelIdx (model.id)}
<tr class="bg-white dark:border-gray-850 text-xs group"> <tr class="bg-white text-xs group">
<td class="px-3 py-1.5 text-left font-medium text-gray-900 dark:text-white w-fit"> <td class="px-3 py-1.5 text-left font-medium text-gray-900 w-fit">
<div class=" line-clamp-1"> <div class=" line-clamp-1">
{model?.rating !== '-' ? modelIdx + 1 : '-'} {model?.rating !== '-' ? modelIdx + 1 : '-'}
</div> </div>
@ -359,12 +359,12 @@
/> />
</div> </div>
<div class="font-medium text-gray-800 dark:text-gray-200 pr-4"> <div class="font-medium text-gray-800 pr-4">
{model.name} {model.name}
</div> </div>
</div> </div>
</td> </td>
<td class="px-3 py-1.5 text-right font-medium text-gray-900 dark:text-white w-max"> <td class="px-3 py-1.5 text-right font-medium text-gray-900 w-max">
{model.rating} {model.rating}
</td> </td>

24
src/lib/components/admin/Functions.svelte

@ -200,8 +200,8 @@
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<div class="flex md:self-center text-xl items-center font-medium px-0.5"> <div class="flex md:self-center text-xl items-center font-medium px-0.5">
{$i18n.t('Functions')} {$i18n.t('Functions')}
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 " />
<span class="text-base font-lg text-gray-500 dark:text-gray-300">{filteredItems.length}</span> <span class="text-base font-lg text-gray-500 ">{filteredItems.length}</span>
</div> </div>
</div> </div>
@ -219,7 +219,7 @@
<div> <div>
<a <a
class=" px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1" class=" px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
href="/admin/functions/create" href="/admin/functions/create"
> >
<Plus className="size-3.5" /> <Plus className="size-3.5" />
@ -241,14 +241,14 @@
<div class=" flex-1 self-center pl-1"> <div class=" flex-1 self-center pl-1">
<div class=" font-semibold flex items-center gap-1.5"> <div class=" font-semibold flex items-center gap-1.5">
<div <div
class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200" class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 "
> >
{func.type} {func.type}
</div> </div>
{#if func?.meta?.manifest?.version} {#if func?.meta?.manifest?.version}
<div <div
class="text-xs font-bold px-1 rounded-sm line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200" class="text-xs font-bold px-1 rounded-sm line-clamp-1 bg-gray-500/20 text-gray-700 "
> >
v{func?.meta?.manifest?.version ?? ''} v{func?.meta?.manifest?.version ?? ''}
</div> </div>
@ -273,7 +273,7 @@
{#if shiftKey} {#if shiftKey}
<Tooltip content={$i18n.t('Delete')}> <Tooltip content={$i18n.t('Delete')}>
<button <button
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm px-2 py-2 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
deleteHandler(func); deleteHandler(func);
@ -286,7 +286,7 @@
{#if func?.meta?.manifest?.funding_url ?? false} {#if func?.meta?.manifest?.funding_url ?? false}
<Tooltip content={$i18n.t('Support')}> <Tooltip content={$i18n.t('Support')}>
<button <button
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm px-2 py-2 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
selectedFunction = func; selectedFunction = func;
@ -300,7 +300,7 @@
<Tooltip content={$i18n.t('Valves')}> <Tooltip content={$i18n.t('Valves')}>
<button <button
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm px-2 py-2 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
selectedFunction = func; selectedFunction = func;
@ -355,7 +355,7 @@
onClose={() => {}} onClose={() => {}}
> >
<button <button
class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm p-1.5 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
type="button" type="button"
> >
<EllipsisHorizontal className="size-5" /> <EllipsisHorizontal className="size-5" />
@ -407,7 +407,7 @@
/> />
<button <button
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition" class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 transition"
on:click={() => { on:click={() => {
functionsImportInputElement.click(); functionsImportInputElement.click();
}} }}
@ -431,7 +431,7 @@
</button> </button>
<button <button
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition" class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 transition"
on:click={async () => { on:click={async () => {
const _functions = await exportFunctions(localStorage.token).catch((error) => { const _functions = await exportFunctions(localStorage.token).catch((error) => {
toast.error(`${error}`); toast.error(`${error}`);
@ -473,7 +473,7 @@
</div> </div>
<a <a
class=" flex cursor-pointer items-center justify-between hover:bg-gray-50 dark:hover:bg-gray-850 w-full mb-2 px-3.5 py-1.5 rounded-xl transition" class=" flex cursor-pointer items-center justify-between hover:bg-gray-50 w-full mb-2 px-3.5 py-1.5 rounded-xl transition"
href="https://openwebui.com/#open-webui-community" href="https://openwebui.com/#open-webui-community"
target="_blank" target="_blank"
> >

8
src/lib/components/admin/Functions/FunctionEditor.svelte

@ -303,7 +303,7 @@ class Pipe:
<div class=" shrink-0 mr-2"> <div class=" shrink-0 mr-2">
<Tooltip content={$i18n.t('Back')}> <Tooltip content={$i18n.t('Back')}>
<button <button
class="w-full text-left text-sm py-1.5 px-1 rounded-lg dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-gray-850" class="w-full text-left text-sm py-1.5 px-1 rounded-lg dark:hover:text-white hover:bg-black/5 "
on:click={() => { on:click={() => {
goto('/admin/functions'); goto('/admin/functions');
}} }}
@ -385,16 +385,16 @@ class Pipe:
<div class="pb-3 flex justify-between"> <div class="pb-3 flex justify-between">
<div class="flex-1 pr-3"> <div class="flex-1 pr-3">
<div class="text-xs text-gray-500 line-clamp-2"> <div class="text-xs text-gray-500 line-clamp-2">
<span class=" font-semibold dark:text-gray-200">{$i18n.t('Warning:')}</span> <span class=" font-semibold ">{$i18n.t('Warning:')}</span>
{$i18n.t('Functions allow arbitrary code execution')} <br /> {$i18n.t('Functions allow arbitrary code execution')} <br />
<span class=" font-medium dark:text-gray-400" <span class=" font-medium "
>{$i18n.t(`don't install random functions from sources you don't trust.`)}</span >{$i18n.t(`don't install random functions from sources you don't trust.`)}</span
> >
</div> </div>
</div> </div>
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

16
src/lib/components/admin/Functions/FunctionMenu.svelte

@ -42,7 +42,7 @@
<div slot="content"> <div slot="content">
<DropdownMenu.Content <DropdownMenu.Content
class="w-full max-w-[180px] rounded-xl 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-sm" class="w-full max-w-[180px] rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white shadow-sm"
sideOffset={-2} sideOffset={-2}
side="bottom" side="bottom"
align="start" align="start"
@ -63,11 +63,11 @@
</div> </div>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-1" /> <hr class="border-gray-100 my-1" />
{/if} {/if}
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
editHandler(); editHandler();
}} }}
@ -91,7 +91,7 @@
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
shareHandler(); shareHandler();
}} }}
@ -101,7 +101,7 @@
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
cloneHandler(); cloneHandler();
}} }}
@ -112,7 +112,7 @@
</DropdownMenu.Item> </DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
exportHandler(); exportHandler();
}} }}
@ -122,10 +122,10 @@
<div class="flex items-center">{$i18n.t('Export')}</div> <div class="flex items-center">{$i18n.t('Export')}</div>
</DropdownMenu.Item> </DropdownMenu.Item>
<hr class="border-gray-100 dark:border-gray-850 my-1" /> <hr class="border-gray-100 my-1" />
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
deleteHandler(); deleteHandler();
}} }}

2
src/lib/components/admin/Settings.svelte

@ -42,7 +42,7 @@
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4"> <div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
<div <div
id="admin-settings-tabs-container" id="admin-settings-tabs-container"
class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none" class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 text-sm font-medium text-left scrollbar-none"
> >
<button <button
class="px-0.5 py-1 min-w-fit rounded-lg flex-1 lg:flex-none flex text-right transition {selectedTab === class="px-0.5 py-1 min-w-fit rounded-lg flex-1 lg:flex-none flex text-right transition {selectedTab ===

50
src/lib/components/admin/Settings/Audio.svelte

@ -198,7 +198,7 @@
</div> </div>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
<div> <div>
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('STT Model')}</div> <div class=" mb-1.5 text-sm font-medium">{$i18n.t('STT Model')}</div>
@ -206,7 +206,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="model-list" list="model-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={STT_MODEL} bind:value={STT_MODEL}
placeholder="Select a model" placeholder="Select a model"
/> />
@ -224,14 +224,14 @@
</div> </div>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
<div> <div>
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('STT Model')}</div> <div class=" mb-1.5 text-sm font-medium">{$i18n.t('STT Model')}</div>
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={STT_MODEL} bind:value={STT_MODEL}
placeholder="Select a model (optional)" placeholder="Select a model (optional)"
/> />
@ -240,7 +240,7 @@
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500"> <div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
{$i18n.t('Leave model field empty to use the default model.')} {$i18n.t('Leave model field empty to use the default model.')}
<a <a
class=" hover:underline dark:text-gray-200 text-gray-800" class=" hover:underline text-gray-800"
href="https://developers.deepgram.com/docs/models" href="https://developers.deepgram.com/docs/models"
target="_blank" target="_blank"
> >
@ -255,14 +255,14 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Set whisper model')} placeholder={$i18n.t('Set whisper model')}
bind:value={STT_WHISPER_MODEL} bind:value={STT_WHISPER_MODEL}
/> />
</div> </div>
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
sttModelUpdateHandler(); sttModelUpdateHandler();
}} }}
@ -320,7 +320,7 @@
{$i18n.t(`Open WebUI uses faster-whisper internally.`)} {$i18n.t(`Open WebUI uses faster-whisper internally.`)}
<a <a
class=" hover:underline dark:text-gray-200 text-gray-800" class=" hover:underline text-gray-800"
href="https://github.com/SYSTRAN/faster-whisper" href="https://github.com/SYSTRAN/faster-whisper"
target="_blank" target="_blank"
> >
@ -333,7 +333,7 @@
{/if} {/if}
</div> </div>
<hr class="border-gray-100 dark:border-gray-850" /> <hr class="border-gray-100 " />
<div> <div>
<div class=" mb-1 text-sm font-medium">{$i18n.t('TTS Settings')}</div> <div class=" mb-1 text-sm font-medium">{$i18n.t('TTS Settings')}</div>
@ -385,7 +385,7 @@
<div> <div>
<div class="mt-1 flex gap-2 mb-1"> <div class="mt-1 flex gap-2 mb-1">
<input <input
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('API Key')} placeholder={$i18n.t('API Key')}
bind:value={TTS_API_KEY} bind:value={TTS_API_KEY}
required required
@ -396,13 +396,13 @@
<div> <div>
<div class="mt-1 flex gap-2 mb-1"> <div class="mt-1 flex gap-2 mb-1">
<input <input
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('API Key')} placeholder={$i18n.t('API Key')}
bind:value={TTS_API_KEY} bind:value={TTS_API_KEY}
required required
/> />
<input <input
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Azure Region')} placeholder={$i18n.t('Azure Region')}
bind:value={TTS_AZURE_SPEECH_REGION} bind:value={TTS_AZURE_SPEECH_REGION}
required required
@ -411,7 +411,7 @@
</div> </div>
{/if} {/if}
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
{#if TTS_ENGINE === ''} {#if TTS_ENGINE === ''}
<div> <div>
@ -419,7 +419,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_VOICE} bind:value={TTS_VOICE}
> >
<option value="" selected={TTS_VOICE !== ''}>{$i18n.t('Default')}</option> <option value="" selected={TTS_VOICE !== ''}>{$i18n.t('Default')}</option>
@ -442,7 +442,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="model-list" list="model-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_MODEL} bind:value={TTS_MODEL}
placeholder="CMU ARCTIC speaker embedding name" placeholder="CMU ARCTIC speaker embedding name"
/> />
@ -458,7 +458,7 @@
To learn more about SpeechT5, To learn more about SpeechT5,
<a <a
class=" hover:underline dark:text-gray-200 text-gray-800" class=" hover:underline text-gray-800"
href="https://github.com/microsoft/SpeechT5" href="https://github.com/microsoft/SpeechT5"
target="_blank" target="_blank"
> >
@ -468,7 +468,7 @@
</a> </a>
To see the available CMU Arctic speaker embeddings, To see the available CMU Arctic speaker embeddings,
<a <a
class=" hover:underline dark:text-gray-200 text-gray-800" class=" hover:underline text-gray-800"
href="https://huggingface.co/datasets/Matthijs/cmu-arctic-xvectors" href="https://huggingface.co/datasets/Matthijs/cmu-arctic-xvectors"
target="_blank" target="_blank"
> >
@ -484,7 +484,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="voice-list" list="voice-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_VOICE} bind:value={TTS_VOICE}
placeholder="Select a voice" placeholder="Select a voice"
/> />
@ -503,7 +503,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="tts-model-list" list="tts-model-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_MODEL} bind:value={TTS_MODEL}
placeholder="Select a model" placeholder="Select a model"
/> />
@ -525,7 +525,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="voice-list" list="voice-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_VOICE} bind:value={TTS_VOICE}
placeholder="Select a voice" placeholder="Select a voice"
/> />
@ -544,7 +544,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="tts-model-list" list="tts-model-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_MODEL} bind:value={TTS_MODEL}
placeholder="Select a model" placeholder="Select a model"
/> />
@ -566,7 +566,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="voice-list" list="voice-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_VOICE} bind:value={TTS_VOICE}
placeholder="Select a voice" placeholder="Select a voice"
/> />
@ -593,7 +593,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="tts-model-list" list="tts-model-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={TTS_AZURE_SPEECH_OUTPUT_FORMAT} bind:value={TTS_AZURE_SPEECH_OUTPUT_FORMAT}
placeholder="Select a output format" placeholder="Select a output format"
/> />
@ -603,7 +603,7 @@
</div> </div>
{/if} {/if}
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
<div class="pt-0.5 flex w-full justify-between"> <div class="pt-0.5 flex w-full justify-between">
<div class="self-center text-xs font-medium">{$i18n.t('Response splitting')}</div> <div class="self-center text-xs font-medium">{$i18n.t('Response splitting')}</div>
@ -631,7 +631,7 @@
</div> </div>
<div class="flex justify-end text-sm font-medium"> <div class="flex justify-end text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

12
src/lib/components/admin/Settings/CodeExecution.svelte

@ -43,7 +43,7 @@
<div class="mb-3.5"> <div class="mb-3.5">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('General')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('General')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class="mb-2.5"> <div class="mb-2.5">
<div class="flex w-full justify-between"> <div class="flex w-full justify-between">
@ -81,7 +81,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm py-0.5 placeholder:text-gray-300 dark:placeholder:text-gray-700 bg-transparent outline-hidden" class="w-full text-sm py-0.5 placeholder:text-gray-300 bg-transparent outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter Jupyter URL')} placeholder={$i18n.t('Enter Jupyter URL')}
bind:value={config.CODE_EXECUTION_JUPYTER_URL} bind:value={config.CODE_EXECUTION_JUPYTER_URL}
@ -156,7 +156,7 @@
<div class="mb-3.5"> <div class="mb-3.5">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('Code Interpreter')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('Code Interpreter')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class="mb-2.5"> <div class="mb-2.5">
<div class=" flex w-full justify-between"> <div class=" flex w-full justify-between">
@ -207,7 +207,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm py-0.5 placeholder:text-gray-300 dark:placeholder:text-gray-700 bg-transparent outline-hidden" class="w-full text-sm py-0.5 placeholder:text-gray-300 bg-transparent outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter Jupyter URL')} placeholder={$i18n.t('Enter Jupyter URL')}
bind:value={config.CODE_INTERPRETER_JUPYTER_URL} bind:value={config.CODE_INTERPRETER_JUPYTER_URL}
@ -278,7 +278,7 @@
</div> </div>
{/if} {/if}
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
<div> <div>
<div class="py-0.5 w-full"> <div class="py-0.5 w-full">
@ -308,7 +308,7 @@
</div> </div>
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

10
src/lib/components/admin/Settings/Connections.svelte

@ -234,7 +234,7 @@
</div> </div>
{#if ENABLE_OPENAI_API} {#if ENABLE_OPENAI_API}
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class=""> <div class="">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
@ -283,7 +283,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class="pr-1.5 my-2"> <div class="pr-1.5 my-2">
<div class="flex justify-between items-center text-sm mb-2"> <div class="flex justify-between items-center text-sm mb-2">
@ -300,7 +300,7 @@
</div> </div>
{#if ENABLE_OLLAMA_API} {#if ENABLE_OLLAMA_API}
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class=""> <div class="">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
@ -357,7 +357,7 @@
{/if} {/if}
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class="pr-1.5 my-2"> <div class="pr-1.5 my-2">
<div class="flex justify-between items-center text-sm"> <div class="flex justify-between items-center text-sm">
@ -394,7 +394,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

4
src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte

@ -12,7 +12,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div <div
class="flex w-full justify-between items-center text-lg font-medium self-center font-primary" class="flex w-full justify-between items-center text-lg font-medium self-center font-primary"
> >
@ -39,7 +39,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 ">
<ManageOllama {urlIdx} /> <ManageOllama {urlIdx} />
</div> </div>
</div> </div>

4
src/lib/components/admin/Settings/Connections/OllamaConnection.svelte

@ -65,7 +65,7 @@
<div class="flex gap-1"> <div class="flex gap-1">
<Tooltip content={$i18n.t('Manage')} className="self-start"> <Tooltip content={$i18n.t('Manage')} className="self-start">
<button <button
class="self-center p-1 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg transition" class="self-center p-1 bg-transparent hover:bg-gray-100 rounded-lg transition"
on:click={() => { on:click={() => {
showManageModal = true; showManageModal = true;
}} }}
@ -77,7 +77,7 @@
<Tooltip content={$i18n.t('Configure')} className="self-start"> <Tooltip content={$i18n.t('Configure')} className="self-start">
<button <button
class="self-center p-1 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg transition" class="self-center p-1 bg-transparent hover:bg-gray-100 rounded-lg transition"
on:click={() => { on:click={() => {
showConfigModal = true; showConfigModal = true;
}} }}

2
src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte

@ -95,7 +95,7 @@
<div class="flex gap-1"> <div class="flex gap-1">
<Tooltip content={$i18n.t('Configure')} className="self-start"> <Tooltip content={$i18n.t('Configure')} className="self-start">
<button <button
class="self-center p-1 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg transition" class="self-center p-1 bg-transparent hover:bg-gray-100 rounded-lg transition"
on:click={() => { on:click={() => {
showConfigModal = true; showConfigModal = true;
}} }}

10
src/lib/components/admin/Settings/Database.svelte

@ -63,7 +63,7 @@
<button <button
type="button" type="button"
class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 transition"
on:click={async () => { on:click={async () => {
document.getElementById('config-json-input').click(); document.getElementById('config-json-input').click();
}} }}
@ -90,7 +90,7 @@
<button <button
type="button" type="button"
class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 transition"
on:click={async () => { on:click={async () => {
const config = await exportConfig(localStorage.token); const config = await exportConfig(localStorage.token);
const blob = new Blob([JSON.stringify(config)], { const blob = new Blob([JSON.stringify(config)], {
@ -119,14 +119,14 @@
</div> </div>
</button> </button>
<hr class="border-gray-100 dark:border-gray-850 my-1" /> <hr class="border-gray-100 my-1" />
{#if $config?.features.enable_admin_export ?? true} {#if $config?.features.enable_admin_export ?? true}
<div class=" flex w-full justify-between"> <div class=" flex w-full justify-between">
<!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> --> <!-- <div class=" self-center text-xs font-medium">{$i18n.t('Allow Chat Deletion')}</div> -->
<button <button
class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-1.5 px-3 w-full hover:bg-gray-200 transition"
type="button" type="button"
on:click={() => { on:click={() => {
// exportAllUserChats(); // exportAllUserChats();
@ -156,7 +156,7 @@
</div> </div>
<button <button
class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
exportAllUserChats(); exportAllUserChats();
}} }}

44
src/lib/components/admin/Settings/Documents.svelte

@ -407,7 +407,7 @@
</div> </div>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850" /> <hr class="border-gray-100 " />
<div class="space-y-2" /> <div class="space-y-2" />
<div> <div>
@ -417,7 +417,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={embeddingModel} bind:value={embeddingModel}
placeholder={$i18n.t('Set embedding model')} placeholder={$i18n.t('Set embedding model')}
required required
@ -428,7 +428,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Set embedding model (e.g. {{model}})', { placeholder={$i18n.t('Set embedding model (e.g. {{model}})', {
model: embeddingModel.slice(-40) model: embeddingModel.slice(-40)
})} })}
@ -438,7 +438,7 @@
{#if embeddingEngine === ''} {#if embeddingEngine === ''}
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
embeddingModelUpdateHandler(); embeddingModelUpdateHandler();
}} }}
@ -507,7 +507,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Set reranking model (e.g. {{model}})', { placeholder={$i18n.t('Set reranking model (e.g. {{model}})', {
model: 'BAAI/bge-reranker-v2-m3' model: 'BAAI/bge-reranker-v2-m3'
})} })}
@ -515,7 +515,7 @@
/> />
</div> </div>
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
rerankingModelUpdateHandler(); rerankingModelUpdateHandler();
}} }}
@ -572,7 +572,7 @@
{/if} {/if}
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class=""> <div class="">
<div class="text-sm font-medium mb-1">{$i18n.t('Content Extraction')}</div> <div class="text-sm font-medium mb-1">{$i18n.t('Content Extraction')}</div>
@ -597,7 +597,7 @@
<div class="flex w-full mt-1"> <div class="flex w-full mt-1">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter Tika Server URL')} placeholder={$i18n.t('Enter Tika Server URL')}
bind:value={tikaServerUrl} bind:value={tikaServerUrl}
/> />
@ -606,7 +606,7 @@
{/if} {/if}
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class="text-sm font-medium mb-1">{$i18n.t('Google Drive')}</div> <div class="text-sm font-medium mb-1">{$i18n.t('Google Drive')}</div>
@ -619,7 +619,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class=" "> <div class=" ">
<div class=" text-sm font-medium mb-1">{$i18n.t('Query Params')}</div> <div class=" text-sm font-medium mb-1">{$i18n.t('Query Params')}</div>
@ -630,7 +630,7 @@
<div class="w-full"> <div class="w-full">
<input <input
class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 outline-hidden"
type="number" type="number"
placeholder={$i18n.t('Enter Top K')} placeholder={$i18n.t('Enter Top K')}
bind:value={querySettings.k} bind:value={querySettings.k}
@ -648,7 +648,7 @@
<div class="w-full"> <div class="w-full">
<input <input
class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 outline-hidden"
type="number" type="number"
step="0.01" step="0.01"
placeholder={$i18n.t('Enter Score')} placeholder={$i18n.t('Enter Score')}
@ -684,7 +684,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class=" "> <div class=" ">
<div class="mb-1 text-sm font-medium">{$i18n.t('Chunk Params')}</div> <div class="mb-1 text-sm font-medium">{$i18n.t('Chunk Params')}</div>
@ -709,7 +709,7 @@
</div> </div>
<div class="self-center"> <div class="self-center">
<input <input
class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 outline-hidden"
type="number" type="number"
placeholder={$i18n.t('Enter Chunk Size')} placeholder={$i18n.t('Enter Chunk Size')}
bind:value={chunkSize} bind:value={chunkSize}
@ -726,7 +726,7 @@
<div class="self-center"> <div class="self-center">
<input <input
class="w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 outline-hidden"
type="number" type="number"
placeholder={$i18n.t('Enter Chunk Overlap')} placeholder={$i18n.t('Enter Chunk Overlap')}
bind:value={chunkOverlap} bind:value={chunkOverlap}
@ -748,7 +748,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class=""> <div class="">
<div class="text-sm font-medium mb-1">{$i18n.t('Files')}</div> <div class="text-sm font-medium mb-1">{$i18n.t('Files')}</div>
@ -767,7 +767,7 @@
placement="top-start" placement="top-start"
> >
<input <input
class="w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 outline-hidden"
type="number" type="number"
placeholder={$i18n.t('Leave empty for unlimited')} placeholder={$i18n.t('Leave empty for unlimited')}
bind:value={fileMaxSize} bind:value={fileMaxSize}
@ -790,7 +790,7 @@
placement="top-start" placement="top-start"
> >
<input <input
class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class=" w-full rounded-lg py-1.5 px-4 text-sm bg-gray-50 outline-hidden"
type="number" type="number"
placeholder={$i18n.t('Leave empty for unlimited')} placeholder={$i18n.t('Leave empty for unlimited')}
bind:value={fileMaxCount} bind:value={fileMaxCount}
@ -803,11 +803,11 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div> <div>
<button <button
class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
showResetUploadDirConfirm = true; showResetUploadDirConfirm = true;
}} }}
@ -834,7 +834,7 @@
</button> </button>
<button <button
class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-xl py-2 px-3.5 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
showResetConfirm = true; showResetConfirm = true;
}} }}
@ -862,7 +862,7 @@
</div> </div>
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

4
src/lib/components/admin/Settings/Evaluations.svelte

@ -116,7 +116,7 @@
</div> </div>
{#if evaluationConfig.ENABLE_EVALUATION_ARENA_MODELS} {#if evaluationConfig.ENABLE_EVALUATION_ARENA_MODELS}
<hr class=" border-gray-50 dark:border-gray-700/10 my-2" /> <hr class=" border-gray-50 my-2" />
<div class="flex justify-between items-center mb-2"> <div class="flex justify-between items-center mb-2">
<div class="text-sm font-medium">{$i18n.t('Manage Arena Models')}</div> <div class="text-sm font-medium">{$i18n.t('Manage Arena Models')}</div>
@ -170,7 +170,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

24
src/lib/components/admin/Settings/Evaluations/ArenaModelModal.svelte

@ -117,7 +117,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center font-primary"> <div class=" text-lg font-medium self-center font-primary">
{#if edit} {#if edit}
{$i18n.t('Edit Arena Model')} {$i18n.t('Edit Arena Model')}
@ -144,7 +144,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"
@ -245,7 +245,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={name} bind:value={name}
placeholder={$i18n.t('Model Name')} placeholder={$i18n.t('Model Name')}
@ -260,7 +260,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={id} bind:value={id}
placeholder={$i18n.t('Model ID')} placeholder={$i18n.t('Model ID')}
@ -277,7 +277,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={description} bind:value={description}
placeholder={$i18n.t('Enter description')} placeholder={$i18n.t('Enter description')}
@ -286,15 +286,15 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div class="my-2 -mx-2"> <div class="my-2 -mx-2">
<div class="px-3 py-2 bg-gray-50 dark:bg-gray-950 rounded-lg"> <div class="px-3 py-2 bg-gray-50 rounded-lg">
<AccessControl bind:accessControl /> <AccessControl bind:accessControl />
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class="mb-1 flex justify-between"> <div class="mb-1 flex justify-between">
@ -344,13 +344,13 @@
{/if} {/if}
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div class="flex items-center"> <div class="flex items-center">
<select <select
class="w-full py-1 text-sm rounded-lg bg-transparent {selectedModelId class="w-full py-1 text-sm rounded-lg bg-transparent {selectedModelId
? '' ? ''
: 'text-gray-500'} placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" : 'text-gray-500'} placeholder:text-gray-300 outline-hidden"
bind:value={selectedModelId} bind:value={selectedModelId}
> >
<option value="">{$i18n.t('Select a model')}</option> <option value="">{$i18n.t('Select a model')}</option>
@ -375,7 +375,7 @@
<div class="flex justify-end pt-3 text-sm font-medium gap-1.5"> <div class="flex justify-end pt-3 text-sm font-medium gap-1.5">
{#if edit} {#if edit}
<button <button
class="px-3.5 py-1.5 text-sm font-medium dark:bg-black dark:hover:bg-gray-950 dark:text-white bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center" class="px-3.5 py-1.5 text-sm font-medium bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center"
type="button" type="button"
on:click={() => { on:click={() => {
dispatch('delete', model); dispatch('delete', model);
@ -387,7 +387,7 @@
{/if} {/if}
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-950 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-950 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

2
src/lib/components/admin/Settings/Evaluations/Model.svelte

@ -50,7 +50,7 @@
<div class="flex items-center"> <div class="flex items-center">
<button <button
class="self-center w-fit text-sm p-1.5 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm p-1.5 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
showModel = true; showModel = true;

22
src/lib/components/admin/Settings/General.svelte

@ -118,7 +118,7 @@
<div class="mb-3.5"> <div class="mb-3.5">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('General')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('General')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class="mb-2.5"> <div class="mb-2.5">
<div class=" mb-1 text-xs font-medium flex space-x-2 items-center"> <div class=" mb-1 text-xs font-medium flex space-x-2 items-center">
@ -127,7 +127,7 @@
</div> </div>
</div> </div>
<div class="flex w-full justify-between items-center"> <div class="flex w-full justify-between items-center">
<div class="flex flex-col text-xs text-gray-700 dark:text-gray-200"> <div class="flex flex-col text-xs text-gray-700 ">
<div class="flex gap-1"> <div class="flex gap-1">
<Tooltip content={WEBUI_BUILD_HASH}> <Tooltip content={WEBUI_BUILD_HASH}>
v{WEBUI_VERSION} v{WEBUI_VERSION}
@ -157,7 +157,7 @@
</div> </div>
<button <button
class=" text-xs px-3 py-1.5 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-lg font-medium" class=" text-xs px-3 py-1.5 bg-gray-50 hover:bg-gray-100 transition rounded-lg font-medium"
type="button" type="button"
on:click={() => { on:click={() => {
checkForVersionUpdates(); checkForVersionUpdates();
@ -232,7 +232,7 @@
</div> </div>
<!-- <button <!-- <button
class="flex-shrink-0 text-xs px-3 py-1.5 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-lg font-medium" class="flex-shrink-0 text-xs px-3 py-1.5 bg-gray-50 hover:bg-gray-100 transition rounded-lg font-medium"
> >
{$i18n.t('Activate')} {$i18n.t('Activate')}
</button> --> </button> -->
@ -243,7 +243,7 @@
<div class="mb-3"> <div class="mb-3">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('Authentication')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('Authentication')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class=" mb-2.5 flex w-full justify-between"> <div class=" mb-2.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Default User Role')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Default User Role')}</div>
@ -296,7 +296,7 @@
</div> </div>
<input <input
class="w-full mt-1 rounded-lg text-sm dark:text-gray-300 bg-transparent outline-hidden" class="w-full mt-1 rounded-lg text-sm bg-transparent outline-hidden"
type="text" type="text"
placeholder={`e.g.) /api/v1/messages, /api/v1/channels`} placeholder={`e.g.) /api/v1/messages, /api/v1/channels`}
bind:value={adminConfig.API_KEY_ALLOWED_ENDPOINTS} bind:value={adminConfig.API_KEY_ALLOWED_ENDPOINTS}
@ -323,7 +323,7 @@
<div class="flex mt-2 space-x-2"> <div class="flex mt-2 space-x-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={`e.g.) "30m","1h", "10d". `} placeholder={`e.g.) "30m","1h", "10d". `}
bind:value={adminConfig.JWT_EXPIRES_IN} bind:value={adminConfig.JWT_EXPIRES_IN}
@ -555,7 +555,7 @@
<div class="mb-3"> <div class="mb-3">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('Features')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('Features')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class="mb-2.5 flex w-full items-center justify-between pr-2"> <div class="mb-2.5 flex w-full items-center justify-between pr-2">
<div class=" self-center text-xs font-medium"> <div class=" self-center text-xs font-medium">
@ -586,7 +586,7 @@
<div class="flex mt-2 space-x-2"> <div class="flex mt-2 space-x-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={`e.g.) "http://localhost:3000"`} placeholder={`e.g.) "http://localhost:3000"`}
bind:value={adminConfig.WEBUI_URL} bind:value={adminConfig.WEBUI_URL}
@ -607,7 +607,7 @@
<div class="flex mt-2 space-x-2"> <div class="flex mt-2 space-x-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={`https://example.com/webhook`} placeholder={`https://example.com/webhook`}
bind:value={webhookUrl} bind:value={webhookUrl}
@ -621,7 +621,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

34
src/lib/components/admin/Settings/Images.svelte

@ -302,7 +302,7 @@
</div> </div>
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
{#if (config?.engine ?? 'automatic1111') === 'automatic1111'} {#if (config?.engine ?? 'automatic1111') === 'automatic1111'}
@ -311,13 +311,13 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')} placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')}
bind:value={config.automatic1111.AUTOMATIC1111_BASE_URL} bind:value={config.automatic1111.AUTOMATIC1111_BASE_URL}
/> />
</div> </div>
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-100 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-100 text-gray-800 rounded-lg transition"
type="button" type="button"
on:click={async () => { on:click={async () => {
await updateConfigHandler(); await updateConfigHandler();
@ -390,7 +390,7 @@
<Tooltip content={$i18n.t('Enter Sampler (e.g. Euler a)')} placement="top-start"> <Tooltip content={$i18n.t('Enter Sampler (e.g. Euler a)')} placement="top-start">
<input <input
list="sampler-list" list="sampler-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter Sampler (e.g. Euler a)')} placeholder={$i18n.t('Enter Sampler (e.g. Euler a)')}
bind:value={config.automatic1111.AUTOMATIC1111_SAMPLER} bind:value={config.automatic1111.AUTOMATIC1111_SAMPLER}
/> />
@ -412,7 +412,7 @@
<Tooltip content={$i18n.t('Enter Scheduler (e.g. Karras)')} placement="top-start"> <Tooltip content={$i18n.t('Enter Scheduler (e.g. Karras)')} placement="top-start">
<input <input
list="scheduler-list" list="scheduler-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter Scheduler (e.g. Karras)')} placeholder={$i18n.t('Enter Scheduler (e.g. Karras)')}
bind:value={config.automatic1111.AUTOMATIC1111_SCHEDULER} bind:value={config.automatic1111.AUTOMATIC1111_SCHEDULER}
/> />
@ -433,7 +433,7 @@
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<Tooltip content={$i18n.t('Enter CFG Scale (e.g. 7.0)')} placement="top-start"> <Tooltip content={$i18n.t('Enter CFG Scale (e.g. 7.0)')} placement="top-start">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter CFG Scale (e.g. 7.0)')} placeholder={$i18n.t('Enter CFG Scale (e.g. 7.0)')}
bind:value={config.automatic1111.AUTOMATIC1111_CFG_SCALE} bind:value={config.automatic1111.AUTOMATIC1111_CFG_SCALE}
/> />
@ -447,13 +447,13 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')} placeholder={$i18n.t('Enter URL (e.g. http://127.0.0.1:7860/)')}
bind:value={config.comfyui.COMFYUI_BASE_URL} bind:value={config.comfyui.COMFYUI_BASE_URL}
/> />
</div> </div>
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-100 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-100 text-gray-800 rounded-lg transition"
type="button" type="button"
on:click={async () => { on:click={async () => {
await updateConfigHandler(); await updateConfigHandler();
@ -501,7 +501,7 @@
{#if config.comfyui.COMFYUI_WORKFLOW} {#if config.comfyui.COMFYUI_WORKFLOW}
<textarea <textarea
class="w-full rounded-lg mb-1 py-2 px-4 text-xs bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden disabled:text-gray-600 resize-none" class="w-full rounded-lg mb-1 py-2 px-4 text-xs bg-gray-50 outline-hidden disabled:text-gray-600 resize-none"
rows="10" rows="10"
bind:value={config.comfyui.COMFYUI_WORKFLOW} bind:value={config.comfyui.COMFYUI_WORKFLOW}
required required
@ -529,7 +529,7 @@
/> />
<button <button
class="w-full text-sm font-medium py-2 bg-transparent hover:bg-gray-100 border border-dashed dark:border-gray-850 dark:hover:bg-gray-850 text-center rounded-xl" class="w-full text-sm font-medium py-2 bg-transparent hover:bg-gray-100 border border-dashed text-center rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
document.getElementById('upload-comfyui-workflow-input')?.click(); document.getElementById('upload-comfyui-workflow-input')?.click();
@ -551,7 +551,7 @@
<div class="text-xs flex flex-col gap-1.5"> <div class="text-xs flex flex-col gap-1.5">
{#each requiredWorkflowNodes as node} {#each requiredWorkflowNodes as node}
<div class="flex w-full items-center border dark:border-gray-850 rounded-lg"> <div class="flex w-full items-center border rounded-lg">
<div class="shrink-0"> <div class="shrink-0">
<div <div
class=" capitalize line-clamp-1 font-medium px-3 py-1 w-20 text-center rounded-l-lg bg-green-500/10 text-green-700 dark:text-green-200" class=" capitalize line-clamp-1 font-medium px-3 py-1 w-20 text-center rounded-l-lg bg-green-500/10 text-green-700 dark:text-green-200"
@ -562,7 +562,7 @@
<div class=""> <div class="">
<Tooltip content="Input Key (e.g. text, unet_name, steps)"> <Tooltip content="Input Key (e.g. text, unet_name, steps)">
<input <input
class="py-1 px-3 w-24 text-xs text-center bg-transparent outline-hidden border-r dark:border-gray-850" class="py-1 px-3 w-24 text-xs text-center bg-transparent outline-hidden border-r "
placeholder="Key" placeholder="Key"
bind:value={node.key} bind:value={node.key}
required required
@ -631,7 +631,7 @@
</div> </div>
{#if config?.enabled} {#if config?.enabled}
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div> <div>
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Default Model')}</div> <div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Default Model')}</div>
@ -642,7 +642,7 @@
<Tooltip content={$i18n.t('Enter Model ID')} placement="top-start"> <Tooltip content={$i18n.t('Enter Model ID')} placement="top-start">
<input <input
list="model-list" list="model-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={imageGenerationConfig.MODEL} bind:value={imageGenerationConfig.MODEL}
placeholder="Select a model" placeholder="Select a model"
required required
@ -666,7 +666,7 @@
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<Tooltip content={$i18n.t('Enter Image Size (e.g. 512x512)')} placement="top-start"> <Tooltip content={$i18n.t('Enter Image Size (e.g. 512x512)')} placement="top-start">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter Image Size (e.g. 512x512)')} placeholder={$i18n.t('Enter Image Size (e.g. 512x512)')}
bind:value={imageGenerationConfig.IMAGE_SIZE} bind:value={imageGenerationConfig.IMAGE_SIZE}
required required
@ -682,7 +682,7 @@
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<Tooltip content={$i18n.t('Enter Number of Steps (e.g. 50)')} placement="top-start"> <Tooltip content={$i18n.t('Enter Number of Steps (e.g. 50)')} placement="top-start">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter Number of Steps (e.g. 50)')} placeholder={$i18n.t('Enter Number of Steps (e.g. 50)')}
bind:value={imageGenerationConfig.IMAGE_STEPS} bind:value={imageGenerationConfig.IMAGE_STEPS}
required required
@ -697,7 +697,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

22
src/lib/components/admin/Settings/Interface.svelte

@ -72,7 +72,7 @@
<div class="mb-3.5"> <div class="mb-3.5">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('Tasks')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('Tasks')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class=" mb-1 font-medium flex items-center"> <div class=" mb-1 font-medium flex items-center">
<div class=" text-xs mr-1">{$i18n.t('Set Task Model')}</div> <div class=" text-xs mr-1">{$i18n.t('Set Task Model')}</div>
@ -102,7 +102,7 @@
<div class="flex-1"> <div class="flex-1">
<div class=" text-xs mb-1">{$i18n.t('Local Models')}</div> <div class=" text-xs mb-1">{$i18n.t('Local Models')}</div>
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={taskConfig.TASK_MODEL} bind:value={taskConfig.TASK_MODEL}
placeholder={$i18n.t('Select a model')} placeholder={$i18n.t('Select a model')}
> >
@ -118,7 +118,7 @@
<div class="flex-1"> <div class="flex-1">
<div class=" text-xs mb-1">{$i18n.t('External Models')}</div> <div class=" text-xs mb-1">{$i18n.t('External Models')}</div>
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={taskConfig.TASK_MODEL_EXTERNAL} bind:value={taskConfig.TASK_MODEL_EXTERNAL}
placeholder={$i18n.t('Select a model')} placeholder={$i18n.t('Select a model')}
> >
@ -281,7 +281,7 @@
<div class="mb-3.5"> <div class="mb-3.5">
<div class=" mb-2.5 text-base font-medium">{$i18n.t('UI')}</div> <div class=" mb-2.5 text-base font-medium">{$i18n.t('UI')}</div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div class=" {banners.length > 0 ? ' mb-3' : ''}"> <div class=" {banners.length > 0 ? ' mb-3' : ''}">
<div class="mb-2.5 flex w-full justify-between"> <div class="mb-2.5 flex w-full justify-between">
@ -325,7 +325,7 @@
{#each banners as banner, bannerIdx} {#each banners as banner, bannerIdx}
<div class=" flex justify-between"> <div class=" flex justify-between">
<div <div
class="flex flex-row flex-1 border rounded-xl border-gray-100 dark:border-gray-850" class="flex flex-row flex-1 border rounded-xl border-gray-100 "
> >
<select <select
class="w-fit capitalize rounded-xl py-2 px-4 text-xs bg-transparent outline-hidden" class="w-fit capitalize rounded-xl py-2 px-4 text-xs bg-transparent outline-hidden"
@ -411,25 +411,25 @@
<div class="grid lg:grid-cols-2 flex-col gap-1.5"> <div class="grid lg:grid-cols-2 flex-col gap-1.5">
{#each promptSuggestions as prompt, promptIdx} {#each promptSuggestions as prompt, promptIdx}
<div <div
class=" flex border border-gray-100 dark:border-none dark:bg-gray-850 rounded-xl py-1.5" class=" flex border border-gray-100 dark:border-none rounded-xl py-1.5"
> >
<div class="flex flex-col flex-1 pl-1"> <div class="flex flex-col flex-1 pl-1">
<div class="flex border-b border-gray-100 dark:border-gray-850 w-full"> <div class="flex border-b border-gray-100 w-full">
<input <input
class="px-3 py-1.5 text-xs w-full bg-transparent outline-hidden border-r border-gray-100 dark:border-gray-850" class="px-3 py-1.5 text-xs w-full bg-transparent outline-hidden border-r border-gray-100 "
placeholder={$i18n.t('Title (e.g. Tell me a fun fact)')} placeholder={$i18n.t('Title (e.g. Tell me a fun fact)')}
bind:value={prompt.title[0]} bind:value={prompt.title[0]}
/> />
<input <input
class="px-3 py-1.5 text-xs w-full bg-transparent outline-hidden border-r border-gray-100 dark:border-gray-850" class="px-3 py-1.5 text-xs w-full bg-transparent outline-hidden border-r border-gray-100 "
placeholder={$i18n.t('Subtitle (e.g. about the Roman Empire)')} placeholder={$i18n.t('Subtitle (e.g. about the Roman Empire)')}
bind:value={prompt.title[1]} bind:value={prompt.title[1]}
/> />
</div> </div>
<textarea <textarea
class="px-3 py-1.5 text-xs w-full bg-transparent outline-hidden border-r border-gray-100 dark:border-gray-850 resize-none" class="px-3 py-1.5 text-xs w-full bg-transparent outline-hidden border-r border-gray-100 resize-none"
placeholder={$i18n.t( placeholder={$i18n.t(
'Prompt (e.g. Tell me a fun fact about the Roman Empire)' 'Prompt (e.g. Tell me a fun fact about the Roman Empire)'
)} )}
@ -473,7 +473,7 @@
<div class="flex justify-end text-sm font-medium"> <div class="flex justify-end text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

12
src/lib/components/admin/Settings/Models.svelte

@ -160,8 +160,8 @@
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<div class="flex items-center md:self-center text-xl font-medium px-0.5"> <div class="flex items-center md:self-center text-xl font-medium px-0.5">
{$i18n.t('Models')} {$i18n.t('Models')}
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 " />
<span class="text-lg font-medium text-gray-500 dark:text-gray-300" <span class="text-lg font-medium text-gray-500 "
>{filteredModels.length}</span >{filteredModels.length}</span
> >
</div> </div>
@ -262,7 +262,7 @@
</button> </button>
<div class="flex flex-row gap-0.5 items-center self-center"> <div class="flex flex-row gap-0.5 items-center self-center">
<button <button
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm px-2 py-2 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
selectedModelId = model.id; selectedModelId = model.id;
@ -301,7 +301,7 @@
{/each} {/each}
{:else} {:else}
<div class="flex flex-col items-center justify-center w-full h-20"> <div class="flex flex-col items-center justify-center w-full h-20">
<div class="text-gray-500 dark:text-gray-400 text-xs"> <div class="text-gray-500 text-xs">
{$i18n.t('No models found')} {$i18n.t('No models found')}
</div> </div>
</div> </div>
@ -355,7 +355,7 @@
/> />
<button <button
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition" class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 transition"
on:click={() => { on:click={() => {
modelsImportInputElement.click(); modelsImportInputElement.click();
}} }}
@ -381,7 +381,7 @@
</button> </button>
<button <button
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition" class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 transition"
on:click={async () => { on:click={async () => {
downloadModels(models); downloadModels(models);
}} }}

14
src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte

@ -111,7 +111,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center font-primary"> <div class=" text-lg font-medium self-center font-primary">
{$i18n.t('Settings')} {$i18n.t('Settings')}
</div> </div>
@ -134,7 +134,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
{#if config} {#if config}
<form <form
@ -153,7 +153,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div> <div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
@ -165,7 +165,7 @@
<select <select
class="w-full py-1 text-sm rounded-lg bg-transparent {selectedModelId class="w-full py-1 text-sm rounded-lg bg-transparent {selectedModelId
? '' ? ''
: 'text-gray-500'} placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" : 'text-gray-500'} placeholder:text-gray-300 outline-hidden"
bind:value={selectedModelId} bind:value={selectedModelId}
> >
<option value="">{$i18n.t('Select a model')}</option> <option value="">{$i18n.t('Select a model')}</option>
@ -177,7 +177,7 @@
</select> </select>
</div> </div>
<!-- <hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" /> --> <!-- <hr class=" border-gray-100 my-2.5 w-full" /> -->
{#if defaultModelIds.length > 0} {#if defaultModelIds.length > 0}
<div class="flex flex-col"> <div class="flex flex-col">
@ -212,7 +212,7 @@
<div class="flex justify-between pt-3 text-sm font-medium gap-1.5"> <div class="flex justify-between pt-3 text-sm font-medium gap-1.5">
<Tooltip content={$i18n.t('This will delete all models including custom models')}> <Tooltip content={$i18n.t('This will delete all models including custom models')}>
<button <button
class="px-3.5 py-1.5 text-sm font-medium dark:bg-black dark:hover:bg-gray-950 dark:text-white bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center" class="px-3.5 py-1.5 text-sm font-medium bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center"
type="button" type="button"
on:click={() => { on:click={() => {
showResetModal = true; showResetModal = true;
@ -224,7 +224,7 @@
</Tooltip> </Tooltip>
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

2
src/lib/components/admin/Settings/Models/Manage/ManageMultipleOllama.svelte

@ -10,7 +10,7 @@
</script> </script>
{#if ollamaConfig} {#if ollamaConfig}
<div class="flex-1 mb-2.5 pr-1.5 rounded-lg bg-gray-50 dark:text-gray-300 dark:bg-gray-850"> <div class="flex-1 mb-2.5 pr-1.5 rounded-lg bg-gray-50 ">
<select <select
class="w-full py-2 px-4 text-sm outline-hidden bg-transparent" class="w-full py-2 px-4 text-sm outline-hidden bg-transparent"
bind:value={selectedUrlIdx} bind:value={selectedUrlIdx}

30
src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte

@ -598,7 +598,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', { placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', {
modelTag: 'mistral:7b' modelTag: 'mistral:7b'
})} })}
@ -606,7 +606,7 @@
/> />
</div> </div>
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
pullModelHandler(); pullModelHandler();
}} }}
@ -663,7 +663,7 @@
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500"> <div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
{$i18n.t('To access the available model names for downloading,')} {$i18n.t('To access the available model names for downloading,')}
<a <a
class=" text-gray-500 dark:text-gray-300 font-medium underline" class=" text-gray-500 font-medium underline"
href="https://ollama.com/library" href="https://ollama.com/library"
target="_blank">{$i18n.t('click here.')}</a target="_blank">{$i18n.t('click here.')}</a
> >
@ -696,13 +696,13 @@
<Tooltip content={$i18n.t('Cancel')}> <Tooltip content={$i18n.t('Cancel')}>
<button <button
class="text-gray-800 dark:text-gray-100" class="text-gray-800 "
on:click={() => { on:click={() => {
cancelModelPullHandler(model); cancelModelPullHandler(model);
}} }}
> >
<svg <svg
class="w-4 h-4 text-gray-800 dark:text-white" class="w-4 h-4 text-gray-800 "
aria-hidden="true" aria-hidden="true"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="24" width="24"
@ -737,7 +737,7 @@
<div class=" mb-2 text-sm font-medium">{$i18n.t('Delete a model')}</div> <div class=" mb-2 text-sm font-medium">{$i18n.t('Delete a model')}</div>
<div class="flex w-full"> <div class="flex w-full">
<div <div
class="flex-1 mr-2 pr-1.5 rounded-lg bg-gray-50 dark:text-gray-300 dark:bg-gray-850" class="flex-1 mr-2 pr-1.5 rounded-lg bg-gray-50 "
> >
<select <select
class="w-full py-2 px-4 text-sm outline-hidden bg-transparent" class="w-full py-2 px-4 text-sm outline-hidden bg-transparent"
@ -755,7 +755,7 @@
</select> </select>
</div> </div>
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
showModelDeleteConfirm = true; showModelDeleteConfirm = true;
}} }}
@ -781,7 +781,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2 flex flex-col gap-2"> <div class="flex-1 mr-2 flex flex-col gap-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', { placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', {
modelTag: 'my-modelfile' modelTag: 'my-modelfile'
})} })}
@ -791,7 +791,7 @@
<textarea <textarea
bind:value={createModelObject} bind:value={createModelObject}
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-100 dark:bg-gray-850 outline-hidden resize-none scrollbar-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden resize-none scrollbar-hidden"
rows="6" rows="6"
placeholder={`e.g. {"model": "my-modelfile", "from": "ollama:7b"})`} placeholder={`e.g. {"model": "my-modelfile", "from": "ollama:7b"})`}
disabled={createModelLoading} disabled={createModelLoading}
@ -800,7 +800,7 @@
<div class="flex self-start"> <div class="flex self-start">
<button <button
class="px-2.5 py-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition disabled:cursor-not-allowed" class="px-2.5 py-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg transition disabled:cursor-not-allowed"
on:click={() => { on:click={() => {
createModelHandler(); createModelHandler();
}} }}
@ -907,7 +907,7 @@
<button <button
type="button" type="button"
class="w-full rounded-lg text-left py-2 px-4 bg-gray-50 dark:text-gray-300 dark:bg-gray-850" class="w-full rounded-lg text-left py-2 px-4 bg-gray-50 "
on:click={() => { on:click={() => {
modelUploadInputElement.click(); modelUploadInputElement.click();
}} }}
@ -922,7 +922,7 @@
{:else} {:else}
<div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}"> <div class="flex-1 {modelFileUrl !== '' ? 'mr-2' : ''}">
<input <input
class="w-full rounded-lg text-left py-2 px-4 bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden {modelFileUrl !== class="w-full rounded-lg text-left py-2 px-4 bg-gray-50 outline-hidden {modelFileUrl !==
'' ''
? 'mr-2' ? 'mr-2'
: ''}" : ''}"
@ -937,7 +937,7 @@
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')} {#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
<button <button
class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg disabled:cursor-not-allowed transition" class="px-2.5 bg-gray-50 hover:bg-gray-200 text-gray-800 rounded-lg disabled:cursor-not-allowed transition"
type="submit" type="submit"
disabled={modelTransferring} disabled={modelTransferring}
> >
@ -998,7 +998,7 @@
</div> </div>
<textarea <textarea
bind:value={modelFileContent} bind:value={modelFileContent}
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-100 dark:bg-gray-850 outline-hidden resize-none" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden resize-none"
rows="6" rows="6"
/> />
</div> </div>
@ -1007,7 +1007,7 @@
<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500"> <div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
{$i18n.t('To access the GGUF models available for downloading,')} {$i18n.t('To access the GGUF models available for downloading,')}
<a <a
class=" text-gray-500 dark:text-gray-300 font-medium underline" class=" text-gray-500 font-medium underline"
href="https://huggingface.co/models?search=gguf" href="https://huggingface.co/models?search=gguf"
target="_blank">{$i18n.t('click here.')}</a target="_blank">{$i18n.t('click here.')}</a
> >

6
src/lib/components/admin/Settings/Models/ManageModelsModal.svelte

@ -38,7 +38,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4"> <div class=" flex justify-between px-5 pt-4">
<div class=" text-lg font-medium self-center font-primary"> <div class=" text-lg font-medium self-center font-primary">
{$i18n.t('Manage Models')} {$i18n.t('Manage Models')}
</div> </div>
@ -61,7 +61,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-3 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-3 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
{#if selected === ''} {#if selected === ''}
<div class=" py-5 text-gray-400 text-xs"> <div class=" py-5 text-gray-400 text-xs">
@ -72,7 +72,7 @@
{:else if selected !== null} {:else if selected !== null}
<div class=" flex w-full flex-col"> <div class=" flex w-full flex-col">
<div <div
class="flex gap-1 scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-full bg-transparent dark:text-gray-200" class="flex gap-1 scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-full bg-transparent "
> >
<button <button
class="min-w-fit rounded-full p-1.5 {selected === 'ollama' class="min-w-fit rounded-full p-1.5 {selected === 'ollama'

26
src/lib/components/admin/Settings/Pipelines.svelte

@ -234,7 +234,7 @@
<div class="flex gap-2"> <div class="flex gap-2">
<div class="flex-1"> <div class="flex-1">
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={selectedPipelinesUrlIdx} bind:value={selectedPipelinesUrlIdx}
placeholder={$i18n.t('Select a pipeline url')} placeholder={$i18n.t('Select a pipeline url')}
on:change={async () => { on:change={async () => {
@ -271,7 +271,7 @@
/> />
<button <button
class="w-full text-sm font-medium py-2 bg-transparent hover:bg-gray-100 border border-dashed dark:border-gray-850 dark:hover:bg-gray-850 text-center rounded-xl" class="w-full text-sm font-medium py-2 bg-transparent hover:bg-gray-100 border border-dashed text-center rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
document.getElementById('pipelines-upload-input')?.click(); document.getElementById('pipelines-upload-input')?.click();
@ -285,7 +285,7 @@
</button> </button>
</div> </div>
<button <button
class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
uploadPipelineHandler(); uploadPipelineHandler();
}} }}
@ -348,13 +348,13 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 mr-2"> <div class="flex-1 mr-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Enter Github Raw URL')} placeholder={$i18n.t('Enter Github Raw URL')}
bind:value={pipelineDownloadUrl} bind:value={pipelineDownloadUrl}
/> />
</div> </div>
<button <button
class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
addPipelineHandler(); addPipelineHandler();
}} }}
@ -410,15 +410,15 @@
</div> </div>
<div class="mt-2 text-xs text-gray-500"> <div class="mt-2 text-xs text-gray-500">
<span class=" font-semibold dark:text-gray-200">Warning:</span> Pipelines are a plugin <span class=" font-semibold ">Warning:</span> Pipelines are a plugin
system with arbitrary code execution — system with arbitrary code execution —
<span class=" font-medium dark:text-gray-400" <span class=" font-medium "
>don't fetch random pipelines from sources you don't trust.</span >don't fetch random pipelines from sources you don't trust.</span
> >
</div> </div>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-3 w-full" /> <hr class="border-gray-100 my-3 w-full" />
{#if pipelines !== null} {#if pipelines !== null}
{#if pipelines.length > 0} {#if pipelines.length > 0}
@ -432,7 +432,7 @@
<div class="flex gap-2"> <div class="flex gap-2">
<div class="flex-1"> <div class="flex-1">
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={selectedPipelineIdx} bind:value={selectedPipelineIdx}
placeholder={$i18n.t('Select a pipeline')} placeholder={$i18n.t('Select a pipeline')}
on:change={async () => { on:change={async () => {
@ -449,7 +449,7 @@
</div> </div>
<button <button
class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition" class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 rounded-lg transition"
on:click={() => { on:click={() => {
deletePipelineHandler(); deletePipelineHandler();
}} }}
@ -502,7 +502,7 @@
<div class=" flex-1"> <div class=" flex-1">
{#if valves_spec.properties[property]?.enum ?? null} {#if valves_spec.properties[property]?.enum ?? null}
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
bind:value={valves[property]} bind:value={valves[property]}
> >
{#each valves_spec.properties[property].enum as option} {#each valves_spec.properties[property].enum as option}
@ -523,7 +523,7 @@
</div> </div>
{:else} {:else}
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={valves_spec.properties[property].title} placeholder={valves_spec.properties[property].title}
bind:value={valves[property]} bind:value={valves[property]}
@ -569,7 +569,7 @@
{#if PIPELINES_LIST !== null && PIPELINES_LIST.length > 0} {#if PIPELINES_LIST !== null && PIPELINES_LIST.length > 0}
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

24
src/lib/components/admin/Settings/WebSearch.svelte

@ -141,7 +141,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter Searxng Query URL')} placeholder={$i18n.t('Enter Searxng Query URL')}
bind:value={webConfig.search.searxng_query_url} bind:value={webConfig.search.searxng_query_url}
@ -169,7 +169,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter Google PSE Engine Id')} placeholder={$i18n.t('Enter Google PSE Engine Id')}
bind:value={webConfig.search.google_pse_engine_id} bind:value={webConfig.search.google_pse_engine_id}
@ -274,7 +274,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter SearchApi Engine')} placeholder={$i18n.t('Enter SearchApi Engine')}
bind:value={webConfig.search.searchapi_engine} bind:value={webConfig.search.searchapi_engine}
@ -302,7 +302,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter SerpApi Engine')} placeholder={$i18n.t('Enter SerpApi Engine')}
bind:value={webConfig.search.serpapi_engine} bind:value={webConfig.search.serpapi_engine}
@ -353,7 +353,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter Bing Search V7 Endpoint')} placeholder={$i18n.t('Enter Bing Search V7 Endpoint')}
bind:value={webConfig.search.bing_search_v7_endpoint} bind:value={webConfig.search.bing_search_v7_endpoint}
@ -385,7 +385,7 @@
</div> </div>
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Search Result Count')} placeholder={$i18n.t('Search Result Count')}
bind:value={webConfig.search.result_count} bind:value={webConfig.search.result_count}
required required
@ -398,7 +398,7 @@
</div> </div>
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t('Concurrent Requests')} placeholder={$i18n.t('Concurrent Requests')}
bind:value={webConfig.search.concurrent_requests} bind:value={webConfig.search.concurrent_requests}
required required
@ -412,7 +412,7 @@
</div> </div>
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
placeholder={$i18n.t( placeholder={$i18n.t(
'Enter domains separated by commas (e.g., example.com,site.org)' 'Enter domains separated by commas (e.g., example.com,site.org)'
)} )}
@ -422,7 +422,7 @@
{/if} {/if}
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
<div> <div>
<div class=" mb-1 text-sm font-medium"> <div class=" mb-1 text-sm font-medium">
@ -462,7 +462,7 @@
<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Language')}</div> <div class=" w-20 text-xs font-medium self-center">{$i18n.t('Language')}</div>
<div class=" flex-1 self-center"> <div class=" flex-1 self-center">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter language codes')} placeholder={$i18n.t('Enter language codes')}
bind:value={youtubeLanguage} bind:value={youtubeLanguage}
@ -477,7 +477,7 @@
<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Proxy URL')}</div> <div class=" w-20 text-xs font-medium self-center">{$i18n.t('Proxy URL')}</div>
<div class=" flex-1 self-center"> <div class=" flex-1 self-center">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter proxy URL (e.g. https://user:password@host:port)')} placeholder={$i18n.t('Enter proxy URL (e.g. https://user:password@host:port)')}
bind:value={youtubeProxyUrl} bind:value={youtubeProxyUrl}
@ -491,7 +491,7 @@
</div> </div>
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

2
src/lib/components/admin/Users.svelte

@ -49,7 +49,7 @@
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4"> <div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
<div <div
id="users-tabs-container" id="users-tabs-container"
class=" flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none" class=" flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 text-sm font-medium text-left scrollbar-none"
> >
<button <button
class="px-0.5 py-1 min-w-fit rounded-lg lg:flex-none flex text-right transition {selectedTab === class="px-0.5 py-1 min-w-fit rounded-lg lg:flex-none flex text-right transition {selectedTab ===

14
src/lib/components/admin/Users/Groups.svelte

@ -117,9 +117,9 @@
<div class="mt-0.5 mb-2 gap-1 flex flex-col md:flex-row justify-between"> <div class="mt-0.5 mb-2 gap-1 flex flex-col md:flex-row justify-between">
<div class="flex md:self-center text-lg font-medium px-0.5"> <div class="flex md:self-center text-lg font-medium px-0.5">
{$i18n.t('Groups')} {$i18n.t('Groups')}
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 " />
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{groups.length}</span> <span class="text-lg font-medium text-gray-500 ">{groups.length}</span>
</div> </div>
<div class="flex gap-1"> <div class="flex gap-1">
@ -149,7 +149,7 @@
<div> <div>
<Tooltip content={$i18n.t('Create Group')}> <Tooltip content={$i18n.t('Create Group')}>
<button <button
class=" p-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition font-medium text-sm flex items-center space-x-1" class=" p-2 rounded-xl hover:bg-gray-100 transition font-medium text-sm flex items-center space-x-1"
on:click={() => { on:click={() => {
showCreateGroupModal = !showCreateGroupModal; showCreateGroupModal = !showCreateGroupModal;
}} }}
@ -169,13 +169,13 @@
{$i18n.t('Organize your users')} {$i18n.t('Organize your users')}
</div> </div>
<div class="mt-1 text-sm dark:text-gray-300"> <div class="mt-1 text-sm ">
{$i18n.t('Use groups to group your users and assign permissions.')} {$i18n.t('Use groups to group your users and assign permissions.')}
</div> </div>
<div class="mt-3"> <div class="mt-3">
<button <button
class=" px-4 py-1.5 text-sm rounded-full bg-black hover:bg-gray-800 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition font-medium flex items-center space-x-1" class=" px-4 py-1.5 text-sm rounded-full bg-black hover:bg-gray-800 text-white dark:bg-white dark:text-black transition font-medium flex items-center space-x-1"
aria-label={$i18n.t('Create Group')} aria-label={$i18n.t('Create Group')}
on:click={() => { on:click={() => {
showCreateGroupModal = true; showCreateGroupModal = true;
@ -195,7 +195,7 @@
<div class="w-full"></div> <div class="w-full"></div>
</div> </div>
<hr class="mt-1.5 border-gray-100 dark:border-gray-850" /> <hr class="mt-1.5 border-gray-100 " />
{#each filteredGroups as group} {#each filteredGroups as group}
<div class="my-2"> <div class="my-2">
@ -205,7 +205,7 @@
</div> </div>
{/if} {/if}
<hr class="mb-2 border-gray-100 dark:border-gray-850" /> <hr class="mb-2 border-gray-100 " />
<GroupModal <GroupModal
bind:show={showDefaultPermissionsModal} bind:show={showDefaultPermissionsModal}

10
src/lib/components/admin/Users/Groups/AddGroupModal.svelte

@ -39,7 +39,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 mb-1.5"> <div class=" flex justify-between px-5 pt-4 mb-1.5">
<div class=" text-lg font-medium self-center font-primary"> <div class=" text-lg font-medium self-center font-primary">
{$i18n.t('Add User Group')} {$i18n.t('Add User Group')}
</div> </div>
@ -62,7 +62,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"
@ -78,7 +78,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={name} bind:value={name}
placeholder={$i18n.t('Group Name')} placeholder={$i18n.t('Group Name')}
@ -94,7 +94,7 @@
<div class="flex-1"> <div class="flex-1">
<Textarea <Textarea
className="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden resize-none" className="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden resize-none"
rows={2} rows={2}
bind:value={description} bind:value={description}
placeholder={$i18n.t('Group Description')} placeholder={$i18n.t('Group Description')}
@ -105,7 +105,7 @@
<div class="flex justify-end pt-3 text-sm font-medium gap-1.5"> <div class="flex justify-end pt-3 text-sm font-medium gap-1.5">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

6
src/lib/components/admin/Users/Groups/Display.svelte

@ -16,7 +16,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={name} bind:value={name}
placeholder={$i18n.t('Group Name')} placeholder={$i18n.t('Group Name')}
@ -36,7 +36,7 @@
<div class="text-gray-500">#</div> <div class="text-gray-500">#</div>
<input <input
class="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" class="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden"
type="text" type="text"
bind:value={color} bind:value={color}
placeholder={$i18n.t('Hex Color')} placeholder={$i18n.t('Hex Color')}
@ -52,7 +52,7 @@
<div class="flex-1"> <div class="flex-1">
<Textarea <Textarea
className="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden resize-none" className="w-full text-sm bg-transparent placeholder:text-gray-300 outline-hidden resize-none"
rows={4} rows={4}
bind:value={description} bind:value={description}
placeholder={$i18n.t('Group Description')} placeholder={$i18n.t('Group Description')}

10
src/lib/components/admin/Users/Groups/EditGroupModal.svelte

@ -90,7 +90,7 @@
<Modal size="md" bind:show> <Modal size="md" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-100 px-5 pt-4 mb-1.5"> <div class=" flex justify-between px-5 pt-4 mb-1.5">
<div class=" text-lg font-medium self-center font-primary"> <div class=" text-lg font-medium self-center font-primary">
{#if custom} {#if custom}
{#if edit} {#if edit}
@ -121,7 +121,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-4 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"
@ -133,7 +133,7 @@
<div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4"> <div class="flex flex-col lg:flex-row w-full h-full pb-2 lg:space-x-4">
<div <div
id="admin-settings-tabs-container" id="admin-settings-tabs-container"
class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 dark:text-gray-200 text-sm font-medium text-left scrollbar-none" class="tabs flex flex-row overflow-x-auto gap-2.5 max-w-full lg:gap-1 lg:flex-col lg:flex-none lg:w-40 text-sm font-medium text-left scrollbar-none"
> >
{#if tabs.includes('general')} {#if tabs.includes('general')}
<button <button
@ -266,7 +266,7 @@
<div class="flex justify-end pt-3 text-sm font-medium gap-1.5"> <div class="flex justify-end pt-3 text-sm font-medium gap-1.5">
{#if edit} {#if edit}
<button <button
class="px-3.5 py-1.5 text-sm font-medium dark:bg-black dark:hover:bg-gray-900 dark:text-white bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center" class="px-3.5 py-1.5 text-sm font-medium bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center"
type="button" type="button"
on:click={() => { on:click={() => {
onDelete(); onDelete();
@ -278,7 +278,7 @@
{/if} {/if}
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

2
src/lib/components/admin/Users/Groups/GroupItem.svelte

@ -77,7 +77,7 @@
</div> </div>
<div class="w-full flex justify-end"> <div class="w-full flex justify-end">
<div class=" rounded-lg p-1 hover:bg-gray-100 dark:hover:bg-gray-850 transition"> <div class=" rounded-lg p-1 hover:bg-gray-100 transition">
<Pencil className="size-3.5" /> <Pencil className="size-3.5" />
</div> </div>
</div> </div>

10
src/lib/components/admin/Users/Groups/Permissions.svelte

@ -96,13 +96,13 @@
{/if} {/if}
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-700/10 mt-2.5 mb-1 w-full" /> <hr class=" border-gray-100 mt-2.5 mb-1 w-full" />
<div class="flex items-center"> <div class="flex items-center">
<select <select
class="w-full py-1 text-sm rounded-lg bg-transparent {selectedModelId class="w-full py-1 text-sm rounded-lg bg-transparent {selectedModelId
? '' ? ''
: 'text-gray-500'} placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden" : 'text-gray-500'} placeholder:text-gray-300 outline-hidden"
bind:value={selectedModelId} bind:value={selectedModelId}
> >
<option value="">{$i18n.t('Select a model')}</option> <option value="">{$i18n.t('Select a model')}</option>
@ -150,7 +150,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> --> <hr class=" border-gray-100 my-2" /> -->
<div> <div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Workspace Permissions')}</div> <div class=" mb-2 text-sm font-medium">{$i18n.t('Workspace Permissions')}</div>
@ -192,7 +192,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div> <div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Chat Permissions')}</div> <div class=" mb-2 text-sm font-medium">{$i18n.t('Chat Permissions')}</div>
@ -238,7 +238,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850 my-2" /> <hr class=" border-gray-100 my-2" />
<div> <div>
<div class=" mb-2 text-sm font-medium">{$i18n.t('Features Permissions')}</div> <div class=" mb-2 text-sm font-medium">{$i18n.t('Features Permissions')}</div>

14
src/lib/components/admin/Users/UserList.svelte

@ -127,9 +127,9 @@
<div class="mt-0.5 mb-2 gap-1 flex flex-col md:flex-row justify-between"> <div class="mt-0.5 mb-2 gap-1 flex flex-col md:flex-row justify-between">
<div class="flex md:self-center text-lg font-medium px-0.5"> <div class="flex md:self-center text-lg font-medium px-0.5">
{$i18n.t('Users')} {$i18n.t('Users')}
<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 dark:bg-gray-850" /> <div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-50 " />
<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span> <span class="text-lg font-medium text-gray-500 ">{users.length}</span>
</div> </div>
<div class="flex gap-1"> <div class="flex gap-1">
@ -159,7 +159,7 @@
<div> <div>
<Tooltip content={$i18n.t('Add User')}> <Tooltip content={$i18n.t('Add User')}>
<button <button
class=" p-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition font-medium text-sm flex items-center space-x-1" class=" p-2 rounded-xl hover:bg-gray-100 transition font-medium text-sm flex items-center space-x-1"
on:click={() => { on:click={() => {
showAddUserModal = !showAddUserModal; showAddUserModal = !showAddUserModal;
}} }}
@ -176,10 +176,10 @@
class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full rounded-sm pt-0.5" class="scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full rounded-sm pt-0.5"
> >
<table <table
class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto max-w-full rounded-sm" class="w-full text-sm text-left text-gray-500 table-auto max-w-full rounded-sm"
> >
<thead <thead
class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400 -translate-y-0.5" class="text-xs text-gray-700 uppercase bg-gray-50 -translate-y-0.5"
> >
<tr class=""> <tr class="">
<th <th
@ -327,7 +327,7 @@
</thead> </thead>
<tbody class=""> <tbody class="">
{#each filteredUsers as user, userIdx} {#each filteredUsers as user, userIdx}
<tr class="bg-white dark:border-gray-850 text-xs"> <tr class="bg-white text-xs">
<td class="px-3 py-1 min-w-[7rem] w-28"> <td class="px-3 py-1 min-w-[7rem] w-28">
<button <button
class=" translate-y-0.5" class=" translate-y-0.5"
@ -347,7 +347,7 @@
/> />
</button> </button>
</td> </td>
<td class="px-3 py-1 font-medium text-gray-900 dark:text-white w-max"> <td class="px-3 py-1 font-medium text-gray-900 w-max">
<div class="flex flex-row w-max"> <div class="flex flex-row w-max">
<img <img
class=" rounded-full w-6 h-6 object-cover mr-2.5" class=" rounded-full w-6 h-6 object-cover mr-2.5"

14
src/lib/components/admin/Users/UserList/AddUserModal.svelte

@ -121,7 +121,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center">{$i18n.t('Add User')}</div> <div class=" text-lg font-medium self-center">{$i18n.t('Add User')}</div>
<button <button
class="self-center" class="self-center"
@ -142,7 +142,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-4 pb-3 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-4 pb-3 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"
@ -151,7 +151,7 @@
}} }}
> >
<div <div
class="flex -mt-2 mb-1.5 gap-1 scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-full bg-transparent dark:text-gray-200" class="flex -mt-2 mb-1.5 gap-1 scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-full bg-transparent "
> >
<button <button
class="min-w-fit rounded-full p-1.5 {tab === '' class="min-w-fit rounded-full p-1.5 {tab === ''
@ -208,7 +208,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850 my-2.5 w-full" /> <hr class=" border-gray-100 my-2.5 w-full" />
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class=" mb-1 text-xs text-gray-500">{$i18n.t('Email')}</div> <div class=" mb-1 text-xs text-gray-500">{$i18n.t('Email')}</div>
@ -249,7 +249,7 @@
/> />
<button <button
class="w-full text-sm font-medium py-3 bg-transparent hover:bg-gray-100 border border-dashed dark:border-gray-850 dark:hover:bg-gray-850 text-center rounded-xl" class="w-full text-sm font-medium py-3 bg-transparent hover:bg-gray-100 border border-dashed text-center rounded-xl"
type="button" type="button"
on:click={() => { on:click={() => {
document.getElementById('upload-user-csv-input')?.click(); document.getElementById('upload-user-csv-input')?.click();
@ -268,7 +268,7 @@
'Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.' 'Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.'
)} )}
<a <a
class="underline dark:text-gray-200" class="underline "
href="{WEBUI_BASE_URL}/static/user-import.csv" href="{WEBUI_BASE_URL}/static/user-import.csv"
> >
{$i18n.t('Click here to download user import template file.')} {$i18n.t('Click here to download user import template file.')}
@ -280,7 +280,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center {loading class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed' ? ' cursor-not-allowed'
: ''}" : ''}"
type="submit" type="submit"

14
src/lib/components/admin/Users/UserList/EditUserModal.svelte

@ -45,7 +45,7 @@
<Modal size="sm" bind:show> <Modal size="sm" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 py-4"> <div class=" flex justify-between px-5 py-4">
<div class=" text-lg font-medium self-center">{$i18n.t('Edit User')}</div> <div class=" text-lg font-medium self-center">{$i18n.t('Edit User')}</div>
<button <button
class="self-center" class="self-center"
@ -65,9 +65,9 @@
</svg> </svg>
</button> </button>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850" /> <hr class="border-gray-100 " />
<div class="flex flex-col md:flex-row w-full p-5 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full p-5 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"
@ -94,7 +94,7 @@
</div> </div>
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-3 w-full" /> <hr class="border-gray-100 my-3 w-full" />
<div class=" flex flex-col space-y-1.5"> <div class=" flex flex-col space-y-1.5">
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
@ -102,7 +102,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-sm py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 disabled:text-gray-500 dark:disabled:text-gray-500 outline-hidden" class="w-full rounded-sm py-2 px-4 text-sm dark:bg-gray-800 disabled:text-gray-500 dark:disabled:text-gray-500 outline-hidden"
type="email" type="email"
bind:value={_user.email} bind:value={_user.email}
autocomplete="off" autocomplete="off"
@ -117,7 +117,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-sm py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-hidden" class="w-full rounded-sm py-2 px-4 text-sm dark:bg-gray-800 outline-hidden"
type="text" type="text"
bind:value={_user.name} bind:value={_user.name}
autocomplete="off" autocomplete="off"
@ -131,7 +131,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-sm py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-hidden" class="w-full rounded-sm py-2 px-4 text-sm dark:bg-gray-800 outline-hidden"
type="password" type="password"
bind:value={_user.password} bind:value={_user.password}
autocomplete="new-password" autocomplete="new-password"

10
src/lib/components/admin/Users/UserList/UserChatsModal.svelte

@ -51,7 +51,7 @@
</script> </script>
<Modal size="lg" bind:show> <Modal size="lg" bind:show>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4"> <div class=" flex justify-between px-5 pt-4">
<div class=" text-lg font-medium self-center capitalize"> <div class=" text-lg font-medium self-center capitalize">
{$i18n.t("{{user}}'s Chats", { user: user.name })} {$i18n.t("{{user}}'s Chats", { user: user.name })}
</div> </div>
@ -74,15 +74,15 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-5 pt-2 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-5 pt-2 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
{#if chats} {#if chats}
{#if chats.length > 0} {#if chats.length > 0}
<div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll"> <div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll">
<div class="relative overflow-x-auto"> <div class="relative overflow-x-auto">
<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto"> <table class="w-full text-sm text-left text-gray-600 table-auto">
<thead <thead
class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-850" class="text-xs text-gray-700 uppercase bg-transparent border-b-2 "
> >
<tr> <tr>
<th <th
@ -120,7 +120,7 @@
}) as chat, idx} }) as chat, idx}
<tr <tr
class="bg-transparent {idx !== chats.length - 1 && class="bg-transparent {idx !== chats.length - 1 &&
'border-b'} dark:border-gray-850 text-xs" 'border-b'} text-xs"
> >
<td class="px-3 py-1"> <td class="px-3 py-1">
<a href="/s/{chat.id}" target="_blank"> <a href="/s/{chat.id}" target="_blank">

2
src/lib/components/app/AppSidebar.svelte

@ -5,7 +5,7 @@
let selected = ''; let selected = '';
</script> </script>
<div class="min-w-[4.5rem] bg-gray-50 dark:bg-gray-950 flex gap-2.5 flex-col pt-8"> <div class="min-w-[4.5rem] bg-gray-50 flex gap-2.5 flex-col pt-8">
<div class="flex justify-center relative"> <div class="flex justify-center relative">
{#if selected === 'home'} {#if selected === 'home'}
<div class="absolute top-0 left-0 flex h-full"> <div class="absolute top-0 left-0 flex h-full">

2
src/lib/components/channel/Channel.svelte

@ -277,7 +277,7 @@
{/if} {/if}
{:else if threadId !== null} {:else if threadId !== null}
<PaneResizer <PaneResizer
class="relative flex w-[3px] items-center justify-center bg-background group bg-gray-50 dark:bg-gray-850" class="relative flex w-[3px] items-center justify-center bg-background group bg-gray-50 "
> >
<div class="z-10 flex h-7 w-5 items-center justify-center rounded-xs"> <div class="z-10 flex h-7 w-5 items-center justify-center rounded-xs">
<EllipsisVertical className="size-4 invisible group-hover:visible" /> <EllipsisVertical className="size-4 invisible group-hover:visible" />

12
src/lib/components/channel/MessageInput.svelte

@ -358,7 +358,7 @@
<div class=" -mt-5"> <div class=" -mt-5">
{#if typingUsers.length > 0} {#if typingUsers.length > 0}
<div class=" text-xs px-4 mb-1"> <div class=" text-xs px-4 mb-1">
<span class=" font-normal text-black dark:text-white"> <span class=" font-normal text-black ">
{typingUsers.map((user) => user.name).join(', ')} {typingUsers.map((user) => user.name).join(', ')}
</span> </span>
{$i18n.t('is typing...')} {$i18n.t('is typing...')}
@ -396,7 +396,7 @@
}} }}
> >
<div <div
class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-600/5 dark:bg-gray-400/5 dark:text-gray-100" class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-600/5 dark:bg-gray-400/5 "
dir={$settings?.chatDirection ?? 'LTR'} dir={$settings?.chatDirection ?? 'LTR'}
> >
{#if files.length > 0} {#if files.length > 0}
@ -457,7 +457,7 @@
<div class="px-2.5"> <div class="px-2.5">
<div <div
class="scrollbar-hidden font-primary text-left bg-transparent dark:text-gray-100 outline-hidden w-full pt-3 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto" class="scrollbar-hidden font-primary text-left bg-transparent outline-hidden w-full pt-3 px-1 rounded-xl resize-none h-fit max-h-80 overflow-auto"
> >
<RichTextInput <RichTextInput
bind:value={content} bind:value={content}
@ -515,7 +515,7 @@
}} }}
> >
<button <button
class="bg-transparent hover:bg-white/80 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5 outline-hidden focus:outline-hidden" class="bg-transparent hover:bg-white/80 text-gray-800 transition rounded-full p-1.5 outline-hidden focus:outline-hidden"
type="button" type="button"
aria-label="More" aria-label="More"
> >
@ -538,7 +538,7 @@
<Tooltip content={$i18n.t('Record voice')}> <Tooltip content={$i18n.t('Record voice')}>
<button <button
id="voice-input-button" id="voice-input-button"
class=" text-gray-600 dark:text-gray-300 hover:text-gray-700 dark:hover:text-gray-200 transition rounded-full p-1.5 mr-0.5 self-center" class=" text-gray-600 hover:text-gray-700 dark:hover:text-gray-200 transition rounded-full p-1.5 mr-0.5 self-center"
type="button" type="button"
on:click={async () => { on:click={async () => {
try { try {
@ -586,7 +586,7 @@
<button <button
id="send-message-button" id="send-message-button"
class="{content !== '' || files.length !== 0 class="{content !== '' || files.length !== 0
? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 ' ? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black '
: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center" : 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
type="submit" type="submit"
disabled={content === '' && files.length === 0} disabled={content === '' && files.length === 0}

6
src/lib/components/channel/MessageInput/InputMenu.svelte

@ -44,7 +44,7 @@
<div slot="content"> <div slot="content">
<DropdownMenu.Content <DropdownMenu.Content
class="w-full max-w-[200px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-sm" class="w-full max-w-[200px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white shadow-sm"
sideOffset={15} sideOffset={15}
alignOffset={-8} alignOffset={-8}
side="top" side="top"
@ -53,7 +53,7 @@
> >
{#if !$mobile} {#if !$mobile}
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-xl"
on:click={() => { on:click={() => {
screenCaptureHandler(); screenCaptureHandler();
}} }}
@ -64,7 +64,7 @@
{/if} {/if}
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-xl"
on:click={() => { on:click={() => {
uploadFilesHandler(); uploadFilesHandler();
}} }}

22
src/lib/components/channel/Messages/Message.svelte

@ -65,14 +65,14 @@
? 'pt-1.5 pb-0.5' ? 'pt-1.5 pb-0.5'
: ''} w-full {($settings?.widescreenMode ?? null) : ''} w-full {($settings?.widescreenMode ?? null)
? 'max-w-full' ? 'max-w-full'
: 'max-w-5xl'} mx-auto group hover:bg-gray-300/5 dark:hover:bg-gray-700/5 transition relative" : 'max-w-5xl'} mx-auto group hover:bg-gray-300/5 transition relative"
> >
{#if !edit} {#if !edit}
<div <div
class=" absolute {showButtons ? '' : 'invisible group-hover:visible'} right-1 -top-2 z-10" class=" absolute {showButtons ? '' : 'invisible group-hover:visible'} right-1 -top-2 z-10"
> >
<div <div
class="flex gap-1 rounded-lg bg-white dark:bg-gray-850 shadow-md p-0.5 border border-gray-100 dark:border-gray-850" class="flex gap-1 rounded-lg bg-white shadow-md p-0.5 border border-gray-100 "
> >
<ReactionPicker <ReactionPicker
onClose={() => (showButtons = false)} onClose={() => (showButtons = false)}
@ -83,7 +83,7 @@
> >
<Tooltip content={$i18n.t('Add Reaction')}> <Tooltip content={$i18n.t('Add Reaction')}>
<button <button
class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1" class="hover:bg-gray-100 transition rounded-lg p-1"
on:click={() => { on:click={() => {
showButtons = true; showButtons = true;
}} }}
@ -96,7 +96,7 @@
{#if !thread} {#if !thread}
<Tooltip content={$i18n.t('Reply in Thread')}> <Tooltip content={$i18n.t('Reply in Thread')}>
<button <button
class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1" class="hover:bg-gray-100 transition rounded-lg p-1"
on:click={() => { on:click={() => {
onThread(message.id); onThread(message.id);
}} }}
@ -109,7 +109,7 @@
{#if message.user_id === $user.id || $user.role === 'admin'} {#if message.user_id === $user.id || $user.role === 'admin'}
<Tooltip content={$i18n.t('Edit')}> <Tooltip content={$i18n.t('Edit')}>
<button <button
class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1" class="hover:bg-gray-100 transition rounded-lg p-1"
on:click={() => { on:click={() => {
edit = true; edit = true;
editedContent = message.content; editedContent = message.content;
@ -121,7 +121,7 @@
<Tooltip content={$i18n.t('Delete')}> <Tooltip content={$i18n.t('Delete')}>
<button <button
class="hover:bg-gray-100 dark:hover:bg-gray-800 transition rounded-lg p-1" class="hover:bg-gray-100 transition rounded-lg p-1"
on:click={() => (showDeleteConfirmDialog = true)} on:click={() => (showDeleteConfirmDialog = true)}
> >
<GarbageBin /> <GarbageBin />
@ -195,7 +195,7 @@
name={file.name} name={file.name}
type={file.type} type={file.type}
size={file?.size} size={file?.size}
colorClassName="bg-white dark:bg-gray-850 " colorClassName="bg-white "
/> />
{/if} {/if}
</div> </div>
@ -225,7 +225,7 @@
<div class="flex space-x-1.5"> <div class="flex space-x-1.5">
<button <button
id="close-edit-message-button" id="close-edit-message-button"
class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl" class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 transition rounded-3xl"
on:click={() => { on:click={() => {
edit = false; edit = false;
editedContent = null; editedContent = null;
@ -289,7 +289,7 @@
{/if} {/if}
{#if reaction.user_ids.length > 0} {#if reaction.user_ids.length > 0}
<div class="text-xs font-medium text-gray-500 dark:text-gray-400"> <div class="text-xs font-medium text-gray-500 ">
{reaction.user_ids?.length} {reaction.user_ids?.length}
</div> </div>
{/if} {/if}
@ -304,7 +304,7 @@
> >
<Tooltip content={$i18n.t('Add Reaction')}> <Tooltip content={$i18n.t('Add Reaction')}>
<div <div
class="flex items-center gap-1.5 bg-gray-500/10 hover:outline hover:outline-gray-700/30 dark:hover:outline-gray-300/30 hover:outline-1 transition rounded-xl px-1 py-1 cursor-pointer text-gray-500 dark:text-gray-400" class="flex items-center gap-1.5 bg-gray-500/10 hover:outline hover:outline-gray-700/30 dark:hover:outline-gray-300/30 hover:outline-1 transition rounded-xl px-1 py-1 cursor-pointer text-gray-500 "
> >
<FaceSmile /> <FaceSmile />
</div> </div>
@ -317,7 +317,7 @@
{#if !thread && message.reply_count > 0} {#if !thread && message.reply_count > 0}
<div class="flex items-center gap-1.5 -mt-0.5 mb-1.5"> <div class="flex items-center gap-1.5 -mt-0.5 mb-1.5">
<button <button
class="flex items-center text-xs py-1 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition" class="flex items-center text-xs py-1 text-gray-500 hover:text-gray-700 transition"
on:click={() => { on:click={() => {
onThread(message.id); onThread(message.id);
}} }}

2
src/lib/components/channel/Messages/Message/ProfilePreview.svelte

@ -29,7 +29,7 @@
<slot name="content"> <slot name="content">
<DropdownMenu.Content <DropdownMenu.Content
class="max-w-full w-[240px] rounded-lg z-9999 bg-white dark:bg-black dark:text-white shadow-lg" class="max-w-full w-[240px] rounded-lg z-9999 bg-white shadow-lg"
sideOffset={8} sideOffset={8}
{side} {side}
{align} {align}

8
src/lib/components/channel/Messages/Message/ReactionPicker.svelte

@ -107,7 +107,7 @@
<slot /> <slot />
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content <DropdownMenu.Content
class="max-w-full w-80 bg-gray-50 dark:bg-gray-850 rounded-lg z-9999 shadow-lg dark:text-white" class="max-w-full w-80 bg-gray-50 rounded-lg z-9999 shadow-lg "
sideOffset={8} sideOffset={8}
{side} {side}
{align} {align}
@ -124,14 +124,14 @@
<!-- Virtualized Emoji List --> <!-- Virtualized Emoji List -->
<div class="w-full flex justify-start h-96 overflow-y-auto px-3 pb-3 text-sm"> <div class="w-full flex justify-start h-96 overflow-y-auto px-3 pb-3 text-sm">
{#if emojiRows.length === 0} {#if emojiRows.length === 0}
<div class="text-center text-xs text-gray-500 dark:text-gray-400">No results</div> <div class="text-center text-xs text-gray-500 ">No results</div>
{:else} {:else}
<div class="w-full flex ml-0.5"> <div class="w-full flex ml-0.5">
<VirtualList rowHeight={ROW_HEIGHT} items={emojiRows} height={384} let:item> <VirtualList rowHeight={ROW_HEIGHT} items={emojiRows} height={384} let:item>
<div class="w-full"> <div class="w-full">
{#if item.length === 1 && item[0].type === 'group'} {#if item.length === 1 && item[0].type === 'group'}
<!-- Render group header --> <!-- Render group header -->
<div class="text-xs font-medium mb-2 text-gray-500 dark:text-gray-400"> <div class="text-xs font-medium mb-2 text-gray-500 ">
{item[0].label} {item[0].label}
</div> </div>
{:else} {:else}
@ -143,7 +143,7 @@
placement="top" placement="top"
> >
<button <button
class="p-1.5 rounded-lg cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-700 transition" class="p-1.5 rounded-lg cursor-pointer hover:bg-gray-200 transition"
on:click={() => selectEmoji(emojiItem)} on:click={() => selectEmoji(emojiItem)}
> >
<img <img

17
src/lib/components/channel/Navbar.svelte

@ -15,10 +15,9 @@
export let channel; export let channel;
</script> </script>
<!--
<nav class="sticky top-0 z-30 w-full px-1.5 py-1.5 -mb-8 flex items-center drag-region"> <nav class="sticky top-0 z-30 w-full px-1.5 py-1.5 -mb-8 flex items-center drag-region">
<div <div
class=" bg-linear-to-b via-50% from-white via-white to-transparent dark:from-gray-900 dark:via-gray-900 dark:to-transparent pointer-events-none absolute inset-0 -bottom-7 z-[-1]" class=" bg-linear-to-b via-50% from-white via-white to-transparent dark:to-transparent pointer-events-none absolute inset-0 -bottom-7 z-[-1]"
></div> ></div>
<div class=" flex max-w-full w-full mx-auto px-1 pt-0.5 bg-transparent"> <div class=" flex max-w-full w-full mx-auto px-1 pt-0.5 bg-transparent">
@ -26,11 +25,11 @@
<div <div
class="{$showSidebar class="{$showSidebar
? 'md:hidden' ? 'md:hidden'
: ''} mr-1 self-start flex flex-none items-center text-gray-600 dark:text-gray-400" : ''} mr-1 self-start flex flex-none items-center text-gray-600 "
> >
<button <button
id="sidebar-toggle-button" id="sidebar-toggle-button"
class="cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition" class="cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-50 transition"
on:click={() => { on:click={() => {
showSidebar.set(!$showSidebar); showSidebar.set(!$showSidebar);
}} }}
@ -42,7 +41,7 @@
</button> </button>
</div> </div>
<div <!-- <div
class="flex-1 overflow-hidden max-w-full py-0.5 class="flex-1 overflow-hidden max-w-full py-0.5
{$showSidebar ? 'ml-1' : ''} {$showSidebar ? 'ml-1' : ''}
" "
@ -54,7 +53,7 @@
{/if} {/if}
</div> </div>
<div class="self-start flex flex-none items-center text-gray-600 dark:text-gray-400"> <div class="self-start flex flex-none items-center text-gray-600 ">
{#if $user !== undefined} {#if $user !== undefined}
<UserMenu <UserMenu
className="max-w-[200px]" className="max-w-[200px]"
@ -66,7 +65,7 @@
}} }}
> >
<button <button
class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-50 dark:hover:bg-gray-850 transition" class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-50 transition"
aria-label="User Menu" aria-label="User Menu"
> >
<div class=" self-center"> <div class=" self-center">
@ -80,7 +79,7 @@
</button> </button>
</UserMenu> </UserMenu>
{/if} {/if}
</div> </div> -->
</div> </div>
</div> </div>
</nav> --> </nav>

4
src/lib/components/channel/Thread.svelte

@ -156,13 +156,13 @@
</script> </script>
{#if channel} {#if channel}
<div class="flex flex-col w-full h-full bg-gray-50 dark:bg-gray-850"> <div class="flex flex-col w-full h-full bg-gray-50 ">
<div class="flex items-center justify-between px-3.5 pt-3"> <div class="flex items-center justify-between px-3.5 pt-3">
<div class=" font-medium text-lg">Thread</div> <div class=" font-medium text-lg">Thread</div>
<div> <div>
<button <button
class="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300 p-2" class="text-gray-500 hover:text-gray-700 p-2"
on:click={() => { on:click={() => {
onClose(); onClose();
}} }}

20
src/lib/components/chat/Artifacts.svelte

@ -183,7 +183,7 @@
onMount(() => {}); onMount(() => {});
</script> </script>
<div class=" w-full h-full relative flex flex-col bg-gray-50 dark:bg-gray-850"> <div class=" w-full h-full relative flex flex-col bg-gray-50 ">
<div class="w-full h-full flex-1 relative"> <div class="w-full h-full flex-1 relative">
{#if overlay} {#if overlay}
<div class=" absolute top-0 left-0 right-0 bottom-0 z-10"></div> <div class=" absolute top-0 left-0 right-0 bottom-0 z-10"></div>
@ -191,25 +191,25 @@
<div class="absolute pointer-events-none z-50 w-full flex items-center justify-start p-4"> <div class="absolute pointer-events-none z-50 w-full flex items-center justify-start p-4">
<button <button
class="self-center pointer-events-auto p-1 rounded-full bg-white dark:bg-gray-850" class="self-center pointer-events-auto p-1 rounded-full bg-white "
on:click={() => { on:click={() => {
showArtifacts.set(false); showArtifacts.set(false);
}} }}
> >
<ArrowLeft className="size-3.5 text-gray-900 dark:text-white" /> <ArrowLeft className="size-3.5 text-gray-900 " />
</button> </button>
</div> </div>
<div class=" absolute pointer-events-none z-50 w-full flex items-center justify-end p-4"> <div class=" absolute pointer-events-none z-50 w-full flex items-center justify-end p-4">
<button <button
class="self-center pointer-events-auto p-1 rounded-full bg-white dark:bg-gray-850" class="self-center pointer-events-auto p-1 rounded-full bg-white "
on:click={() => { on:click={() => {
dispatch('close'); dispatch('close');
showControls.set(false); showControls.set(false);
showArtifacts.set(false); showArtifacts.set(false);
}} }}
> >
<XMark className="size-3.5 text-gray-900 dark:text-white" /> <XMark className="size-3.5 text-gray-900 " />
</button> </button>
</div> </div>
@ -234,7 +234,7 @@
{/if} {/if}
</div> </div>
{:else} {:else}
<div class="m-auto font-medium text-xs text-gray-900 dark:text-white"> <div class="m-auto font-medium text-xs text-gray-900 ">
{$i18n.t('No HTML, CSS, or JavaScript content found.')} {$i18n.t('No HTML, CSS, or JavaScript content found.')}
</div> </div>
{/if} {/if}
@ -243,7 +243,7 @@
</div> </div>
{#if contents.length > 0} {#if contents.length > 0}
<div class="flex justify-between items-center p-2.5 font-primar text-gray-900 dark:text-white"> <div class="flex justify-between items-center p-2.5 font-primar text-gray-900 ">
<div class="flex items-center space-x-2"> <div class="flex items-center space-x-2">
<div class="flex items-center gap-0.5 self-center min-w-fit" dir="ltr"> <div class="flex items-center gap-0.5 self-center min-w-fit" dir="ltr">
<button <button
@ -267,7 +267,7 @@
</svg> </svg>
</button> </button>
<div class="text-xs self-center dark:text-gray-100 min-w-fit"> <div class="text-xs self-center min-w-fit">
{$i18n.t('Version {{selectedVersion}} of {{totalVersions}}', { {$i18n.t('Version {{selectedVersion}} of {{totalVersions}}', {
selectedVersion: selectedContentIdx + 1, selectedVersion: selectedContentIdx + 1,
totalVersions: contents.length totalVersions: contents.length
@ -295,7 +295,7 @@
<div class="flex items-center gap-1"> <div class="flex items-center gap-1">
<button <button
class="copy-code-button bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5" class="copy-code-button bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 transition rounded-md px-1.5 py-0.5"
on:click={() => { on:click={() => {
copyToClipboard(contents[selectedContentIdx].content); copyToClipboard(contents[selectedContentIdx].content);
copied = true; copied = true;
@ -309,7 +309,7 @@
{#if contents[selectedContentIdx].type === 'iframe'} {#if contents[selectedContentIdx].type === 'iframe'}
<Tooltip content={$i18n.t('Open in full screen')}> <Tooltip content={$i18n.t('Open in full screen')}>
<button <button
class=" bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md p-0.5" class=" bg-none border-none text-xs bg-gray-50 hover:bg-gray-100 transition rounded-md p-0.5"
on:click={showFullScreen} on:click={showFullScreen}
> >
<ArrowsPointingOut className="size-3.5" /> <ArrowsPointingOut className="size-3.5" />

4
src/lib/components/chat/ChatControls.svelte

@ -151,7 +151,7 @@
> >
{#if $showCallOverlay} {#if $showCallOverlay}
<div <div
class=" h-full max-h-[100dvh] bg-white text-gray-700 dark:bg-black dark:text-gray-300 flex justify-center" class=" h-full max-h-[100dvh] bg-white text-gray-700 flex justify-center"
> >
<CallOverlay <CallOverlay
bind:files bind:files
@ -230,7 +230,7 @@
<div <div
class="w-full {($showOverview || $showArtifacts) && !$showCallOverlay class="w-full {($showOverview || $showArtifacts) && !$showCallOverlay
? ' ' ? ' '
: 'px-4 py-4 bg-white dark:shadow-lg dark:bg-gray-850 border border-gray-100 dark:border-gray-850'} rounded-xl z-40 pointer-events-auto overflow-y-auto scrollbar-hidden" : 'px-4 py-4 bg-white dark:shadow-lg border border-gray-100 '} rounded-xl z-40 pointer-events-auto overflow-y-auto scrollbar-hidden"
> >
{#if $showCallOverlay} {#if $showCallOverlay}
<div class="w-full h-full flex justify-center"> <div class="w-full h-full flex justify-center">

4
src/lib/components/chat/ChatPlaceholder.svelte

@ -78,7 +78,7 @@
{/if} {/if}
<div <div
class=" mt-2 mb-4 text-3xl text-gray-800 dark:text-gray-100 font-medium text-left flex items-center gap-4 font-primary" class=" mt-2 mb-4 text-3xl text-gray-800 font-medium text-left flex items-center gap-4 font-primary"
> >
<div> <div>
<div class=" capitalize line-clamp-1" in:fade={{ duration: 200 }}> <div class=" capitalize line-clamp-1" in:fade={{ duration: 200 }}>
@ -92,7 +92,7 @@
<div in:fade={{ duration: 200, delay: 200 }}> <div in:fade={{ duration: 200, delay: 200 }}>
{#if models[selectedModelIdx]?.info?.meta?.description ?? null} {#if models[selectedModelIdx]?.info?.meta?.description ?? null}
<div <div
class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3 markdown" class="mt-0.5 text-base font-normal text-gray-500 line-clamp-3 markdown"
> >
{@html marked.parse( {@html marked.parse(
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description) sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)

18
src/lib/components/chat/ContentRenderer/FloatingButtons.svelte

@ -227,10 +227,10 @@
{#if responseContent === null} {#if responseContent === null}
{#if !floatingInput} {#if !floatingInput}
<div <div
class="flex flex-row gap-0.5 shrink-0 p-1 bg-white dark:bg-gray-850 dark:text-gray-100 text-medium rounded-lg shadow-xl" class="flex flex-row gap-0.5 shrink-0 p-1 bg-white text-medium rounded-lg shadow-xl"
> >
<button <button
class="px-1 hover:bg-gray-50 dark:hover:bg-gray-800 rounded-sm flex items-center gap-1 min-w-fit" class="px-1 hover:bg-gray-50 rounded-sm flex items-center gap-1 min-w-fit"
on:click={async () => { on:click={async () => {
selectedText = window.getSelection().toString(); selectedText = window.getSelection().toString();
floatingInput = true; floatingInput = true;
@ -249,7 +249,7 @@
<div class="shrink-0">Ask</div> <div class="shrink-0">Ask</div>
</button> </button>
<button <button
class="px-1 hover:bg-gray-50 dark:hover:bg-gray-800 rounded-sm flex items-center gap-1 min-w-fit" class="px-1 hover:bg-gray-50 rounded-sm flex items-center gap-1 min-w-fit"
on:click={() => { on:click={() => {
selectedText = window.getSelection().toString(); selectedText = window.getSelection().toString();
explainHandler(); explainHandler();
@ -262,7 +262,7 @@
</div> </div>
{:else} {:else}
<div <div
class="py-1 flex dark:text-gray-100 bg-gray-50 dark:bg-gray-800 border dark:border-gray-850 w-72 rounded-full shadow-xl" class="py-1 flex bg-gray-50 dark:bg-gray-800 border w-72 rounded-full shadow-xl"
> >
<input <input
type="text" type="text"
@ -280,7 +280,7 @@
<div class="ml-1 mr-2"> <div class="ml-1 mr-2">
<button <button
class="{floatingInputValue !== '' class="{floatingInputValue !== ''
? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 ' ? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black '
: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 m-0.5 self-center" : 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 m-0.5 self-center"
on:click={() => { on:click={() => {
askHandler(); askHandler();
@ -303,9 +303,9 @@
</div> </div>
{/if} {/if}
{:else} {:else}
<div class="bg-white dark:bg-gray-850 dark:text-gray-100 rounded-xl shadow-xl w-80 max-w-full"> <div class="bg-white rounded-xl shadow-xl w-80 max-w-full">
<div <div
class="bg-gray-50/50 dark:bg-gray-800 dark:text-gray-100 text-medium rounded-xl px-3.5 py-3 w-full" class="bg-gray-50/50 dark:bg-gray-800 text-medium rounded-xl px-3.5 py-3 w-full"
> >
<div class="font-medium"> <div class="font-medium">
<Markdown id={`${id}-float-prompt`} content={prompt} /> <Markdown id={`${id}-float-prompt`} content={prompt} />
@ -313,7 +313,7 @@
</div> </div>
<div <div
class="bg-white dark:bg-gray-850 dark:text-gray-100 text-medium rounded-xl px-3.5 py-3 w-full" class="bg-white text-medium rounded-xl px-3.5 py-3 w-full"
> >
<div class=" max-h-80 overflow-y-auto w-full markdown-prose-xs" id="response-container"> <div class=" max-h-80 overflow-y-auto w-full markdown-prose-xs" id="response-container">
{#if responseContent.trim() === ''} {#if responseContent.trim() === ''}
@ -325,7 +325,7 @@
{#if responseDone} {#if responseDone}
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
on:click={addHandler} on:click={addHandler}
> >
{$i18n.t('Add')} {$i18n.t('Add')}

14
src/lib/components/chat/Controls/Controls.svelte

@ -17,8 +17,8 @@
let showValves = false; let showValves = false;
</script> </script>
<div class=" dark:text-white"> <div class=" ">
<div class=" flex items-center justify-between dark:text-gray-100 mb-2"> <div class=" flex items-center justify-between mb-2">
<div class=" text-lg font-medium self-center font-primary">{$i18n.t('Chat Controls')}</div> <div class=" text-lg font-medium self-center font-primary">{$i18n.t('Chat Controls')}</div>
<button <button
class="self-center" class="self-center"
@ -31,7 +31,7 @@
</div> </div>
{#if $user.role === 'admin' || $user?.permissions.chat?.controls} {#if $user.role === 'admin' || $user?.permissions.chat?.controls}
<div class=" dark:text-gray-200 text-sm font-primary py-0.5 px-0.5"> <div class=" text-sm font-primary py-0.5 px-0.5">
{#if chatFiles.length > 0} {#if chatFiles.length > 0}
<Collapsible title={$i18n.t('Files')} open={true} buttonClassName="w-full"> <Collapsible title={$i18n.t('Files')} open={true} buttonClassName="w-full">
<div class="flex flex-col gap-1 mt-1.5" slot="content"> <div class="flex flex-col gap-1 mt-1.5" slot="content">
@ -59,7 +59,7 @@
</div> </div>
</Collapsible> </Collapsible>
<hr class="my-2 border-gray-50 dark:border-gray-700/10" /> <hr class="my-2 border-gray-50 " />
{/if} {/if}
<Collapsible bind:open={showValves} title={$i18n.t('Valves')} buttonClassName="w-full"> <Collapsible bind:open={showValves} title={$i18n.t('Valves')} buttonClassName="w-full">
@ -68,7 +68,7 @@
</div> </div>
</Collapsible> </Collapsible>
<hr class="my-2 border-gray-50 dark:border-gray-700/10" /> <hr class="my-2 border-gray-50 " />
<Collapsible title={$i18n.t('System Prompt')} open={true} buttonClassName="w-full"> <Collapsible title={$i18n.t('System Prompt')} open={true} buttonClassName="w-full">
<div class="" slot="content"> <div class="" slot="content">
@ -81,7 +81,7 @@
</div> </div>
</Collapsible> </Collapsible>
<hr class="my-2 border-gray-50 dark:border-gray-700/10" /> <hr class="my-2 border-gray-50 " />
<Collapsible title={$i18n.t('Advanced Params')} open={true} buttonClassName="w-full"> <Collapsible title={$i18n.t('Advanced Params')} open={true} buttonClassName="w-full">
<div class="text-sm mt-1.5" slot="content"> <div class="text-sm mt-1.5" slot="content">
@ -92,7 +92,7 @@
</Collapsible> </Collapsible>
</div> </div>
{:else} {:else}
<div class="text-sm dark:text-gray-300 text-center py-2 px-10"> <div class="text-sm text-center py-2 px-10">
{$i18n.t('You do not have permission to access this feature.')} {$i18n.t('You do not have permission to access this feature.')}
</div> </div>
{/if} {/if}

24
src/lib/components/chat/MessageInput.svelte

@ -590,7 +590,7 @@
}} }}
> >
<div <div
class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-600/5 dark:bg-gray-400/5 dark:text-gray-100" class="flex-1 flex flex-col relative w-full rounded-3xl px-1 bg-gray-600/5 dark:bg-gray-400/5 "
dir={$settings?.chatDirection ?? 'LTR'} dir={$settings?.chatDirection ?? 'LTR'}
> >
{#if files.length > 0} {#if files.length > 0}
@ -685,7 +685,7 @@
<div class="px-2.5"> <div class="px-2.5">
{#if $settings?.richTextInput ?? true} {#if $settings?.richTextInput ?? true}
<div <div
class="scrollbar-hidden text-left bg-transparent dark:text-gray-100 outline-hidden w-full pt-3 px-1 resize-none h-fit max-h-80 overflow-auto" class="scrollbar-hidden text-left bg-transparent outline-hidden w-full pt-3 px-1 resize-none h-fit max-h-80 overflow-auto"
> >
<RichTextInput <RichTextInput
bind:this={chatInputElement} bind:this={chatInputElement}
@ -890,7 +890,7 @@
<textarea <textarea
id="chat-input" id="chat-input"
bind:this={chatInputElement} bind:this={chatInputElement}
class="scrollbar-hidden bg-transparent dark:text-gray-100 outline-hidden w-full pt-3 px-1 resize-none" class="scrollbar-hidden bg-transparent outline-hidden w-full pt-3 px-1 resize-none"
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')} placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
bind:value={prompt} bind:value={prompt}
on:keypress={(e) => { on:keypress={(e) => {
@ -1118,7 +1118,7 @@
}} }}
> >
<button <button
class="bg-transparent hover:bg-gray-100 text-gray-800 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5 outline-hidden focus:outline-hidden" class="bg-transparent hover:bg-gray-100 text-gray-800 transition rounded-full p-1.5 outline-hidden focus:outline-hidden"
type="button" type="button"
aria-label="More" aria-label="More"
> >
@ -1145,7 +1145,7 @@
class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {webSearchEnabled || class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {webSearchEnabled ||
($settings?.webSearch ?? false) === 'always' ($settings?.webSearch ?? false) === 'always'
? 'bg-blue-100 dark:bg-blue-500/20 text-blue-500 dark:text-blue-400' ? 'bg-blue-100 dark:bg-blue-500/20 text-blue-500 dark:text-blue-400'
: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800'}" : 'bg-transparent text-gray-600 border-gray-200 hover:bg-gray-100 '}"
> >
<GlobeAlt className="size-5" strokeWidth="1.75" /> <GlobeAlt className="size-5" strokeWidth="1.75" />
<span <span
@ -1163,8 +1163,8 @@
(imageGenerationEnabled = !imageGenerationEnabled)} (imageGenerationEnabled = !imageGenerationEnabled)}
type="button" type="button"
class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {imageGenerationEnabled class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {imageGenerationEnabled
? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400' ? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 '
: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}" : 'bg-transparent text-gray-600 border-gray-200 hover:bg-gray-100 '}"
> >
<Photo className="size-5" strokeWidth="1.75" /> <Photo className="size-5" strokeWidth="1.75" />
<span <span
@ -1182,8 +1182,8 @@
(codeInterpreterEnabled = !codeInterpreterEnabled)} (codeInterpreterEnabled = !codeInterpreterEnabled)}
type="button" type="button"
class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {codeInterpreterEnabled class="px-1.5 @sm:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {codeInterpreterEnabled
? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400' ? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 '
: 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}" : 'bg-transparent text-gray-600 border-gray-200 hover:bg-gray-100 '}"
> >
<CommandLine className="size-5" strokeWidth="1.75" /> <CommandLine className="size-5" strokeWidth="1.75" />
<span <span
@ -1202,7 +1202,7 @@
<Tooltip content={$i18n.t('Record voice')}> <Tooltip content={$i18n.t('Record voice')}>
<button <button
id="voice-input-button" id="voice-input-button"
class=" text-gray-600 dark:text-gray-300 hover:text-gray-700 dark:hover:text-gray-200 transition rounded-full p-1.5 mr-0.5 self-center" class=" text-gray-600 hover:text-gray-700 dark:hover:text-gray-200 transition rounded-full p-1.5 mr-0.5 self-center"
type="button" type="button"
on:click={async () => { on:click={async () => {
try { try {
@ -1320,7 +1320,7 @@
class="{!(prompt === '' && files.length === 0) class="{!(prompt === '' && files.length === 0)
? webSearchEnabled || ($settings?.webSearch ?? false) === 'always' ? webSearchEnabled || ($settings?.webSearch ?? false) === 'always'
? 'bg-blue-500 text-white hover:bg-blue-400 ' ? 'bg-blue-500 text-white hover:bg-blue-400 '
: 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 ' : 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black '
: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center" : 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
type="submit" type="submit"
disabled={prompt === '' && files.length === 0} disabled={prompt === '' && files.length === 0}
@ -1345,7 +1345,7 @@
<div class=" flex items-center"> <div class=" flex items-center">
<Tooltip content={$i18n.t('Stop')}> <Tooltip content={$i18n.t('Stop')}>
<button <button
class="bg-white hover:bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-800 transition rounded-full p-1.5" class="bg-white hover:bg-gray-100 text-gray-800 dark:bg-gray-700 transition rounded-full p-1.5"
on:click={() => { on:click={() => {
stopResponse(); stopResponse();
}} }}

4
src/lib/components/chat/MessageInput/CallOverlay.svelte

@ -710,7 +710,7 @@
</div> </div>
{:else if loading || assistantSpeaking} {:else if loading || assistantSpeaking}
<svg <svg
class="size-12 text-gray-900 dark:text-gray-400" class="size-12 text-gray-900 "
viewBox="0 0 24 24" viewBox="0 0 24 24"
fill="currentColor" fill="currentColor"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -792,7 +792,7 @@
</div> </div>
{:else if loading || assistantSpeaking} {:else if loading || assistantSpeaking}
<svg <svg
class="size-44 text-gray-900 dark:text-gray-400" class="size-44 text-gray-900 "
viewBox="0 0 24 24" viewBox="0 0 24 24"
fill="currentColor" fill="currentColor"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

4
src/lib/components/chat/MessageInput/CallOverlay/VideoInputMenu.svelte

@ -26,7 +26,7 @@
<div slot="content"> <div slot="content">
<DropdownMenu.Content <DropdownMenu.Content
class="w-full max-w-[180px] rounded-lg px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-9999 bg-white dark:text-white shadow-xs" class="w-full max-w-[180px] rounded-lg px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-9999 bg-white shadow-xs"
sideOffset={6} sideOffset={6}
side="top" side="top"
align="start" align="start"
@ -34,7 +34,7 @@
> >
{#each devices as device} {#each devices as device}
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm cursor-pointer hover:bg-gray-50 rounded-md"
on:click={() => { on:click={() => {
dispatch('change', device.deviceId); dispatch('change', device.deviceId);
}} }}

4
src/lib/components/chat/MessageInput/Commands.svelte

@ -112,9 +112,9 @@
id="commands-container" id="commands-container"
class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10" class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
> >
<div class="flex w-full rounded-xl border border-gray-100 dark:border-gray-850"> <div class="flex w-full rounded-xl border border-gray-100 ">
<div <div
class="max-h-60 flex flex-col w-full rounded-xl bg-white dark:text-gray-100" class="max-h-60 flex flex-col w-full rounded-xl bg-white "
> >
<Spinner /> <Spinner />
</div> </div>

32
src/lib/components/chat/MessageInput/Commands/Knowledge.svelte

@ -161,16 +161,16 @@
id="commands-container" id="commands-container"
class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10" class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
> >
<div class="flex w-full rounded-xl border border-gray-100 dark:border-gray-850"> <div class="flex w-full rounded-xl border border-gray-100 ">
<div <div
class="max-h-60 flex flex-col w-full rounded-xl bg-white dark:text-gray-100" class="max-h-60 flex flex-col w-full rounded-xl bg-white "
> >
<div class="m-1 overflow-y-auto p-1 rounded-r-xl space-y-0.5 scrollbar-hidden"> <div class="m-1 overflow-y-auto p-1 rounded-r-xl space-y-0.5 scrollbar-hidden">
{#each filteredItems as item, idx} {#each filteredItems as item, idx}
<button <button
class=" px-3 py-1.5 rounded-xl w-full text-left flex justify-between items-center {idx === class=" px-3 py-1.5 rounded-xl w-full text-left flex justify-between items-center {idx ===
selectedIdx selectedIdx
? ' bg-gray-50 dark:bg-gray-850 dark:text-gray-100 selected-command-option-button' ? ' bg-gray-50 selected-command-option-button'
: ''}" : ''}"
type="button" type="button"
on:click={() => { on:click={() => {
@ -182,22 +182,22 @@
}} }}
> >
<div> <div>
<div class=" font-medium text-black dark:text-gray-100 flex items-center gap-1"> <div class=" font-medium text-black flex items-center gap-1">
{#if item.legacy} {#if item.legacy}
<div <div
class="bg-gray-500/20 text-gray-700 dark:text-gray-200 rounded-sm uppercase text-xs font-bold px-1 shrink-0" class="bg-gray-500/20 text-gray-700 rounded-sm uppercase text-xs font-bold px-1 shrink-0"
> >
Legacy Legacy
</div> </div>
{:else if item?.meta?.document} {:else if item?.meta?.document}
<div <div
class="bg-gray-500/20 text-gray-700 dark:text-gray-200 rounded-sm uppercase text-xs font-bold px-1 shrink-0" class="bg-gray-500/20 text-gray-700 rounded-sm uppercase text-xs font-bold px-1 shrink-0"
> >
Document Document
</div> </div>
{:else if item?.type === 'file'} {:else if item?.type === 'file'}
<div <div
class="bg-gray-500/20 text-gray-700 dark:text-gray-200 rounded-sm uppercase text-xs font-bold px-1 shrink-0" class="bg-gray-500/20 text-gray-700 rounded-sm uppercase text-xs font-bold px-1 shrink-0"
> >
File File
</div> </div>
@ -214,7 +214,7 @@
</div> </div>
</div> </div>
<div class=" text-xs text-gray-600 dark:text-gray-100 line-clamp-1"> <div class=" text-xs text-gray-600 line-clamp-1">
{item?.description} {item?.description}
</div> </div>
</div> </div>
@ -224,7 +224,7 @@
{#if !item.legacy && (item?.files ?? []).length > 0} {#if !item.legacy && (item?.files ?? []).length > 0}
{#each item?.files ?? [] as file, fileIdx} {#each item?.files ?? [] as file, fileIdx}
<button <button
class=" px-3 py-1.5 rounded-xl w-full text-left flex justify-between items-center hover:bg-gray-50 dark:hover:bg-gray-850 dark:hover:text-gray-100 selected-command-option-button" class=" px-3 py-1.5 rounded-xl w-full text-left flex justify-between items-center hover:bg-gray-50 dark:hover:text-gray-100 selected-command-option-button"
type="button" type="button"
on:click={() => { on:click={() => {
console.log(file); console.log(file);
@ -235,10 +235,10 @@
> >
<div> <div>
<div <div
class=" font-medium text-black dark:text-gray-100 flex items-center gap-1" class=" font-medium text-black flex items-center gap-1"
> >
<div <div
class="bg-gray-500/20 text-gray-700 dark:text-gray-200 rounded-sm uppercase text-xs font-bold px-1 shrink-0" class="bg-gray-500/20 text-gray-700 rounded-sm uppercase text-xs font-bold px-1 shrink-0"
> >
File File
</div> </div>
@ -248,7 +248,7 @@
</div> </div>
</div> </div>
<div class=" text-xs text-gray-600 dark:text-gray-100 line-clamp-1"> <div class=" text-xs text-gray-600 line-clamp-1">
{$i18n.t('Updated')} {$i18n.t('Updated')}
{dayjs(file.updated_at * 1000).fromNow()} {dayjs(file.updated_at * 1000).fromNow()}
</div> </div>
@ -269,7 +269,7 @@
.substring(1) .substring(1)
.startsWith('https://youtu.be'))} .startsWith('https://youtu.be'))}
<button <button
class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 selected-command-option-button" class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-50 selected-command-option-button"
type="button" type="button"
on:click={() => { on:click={() => {
const url = prompt.split(' ')?.at(0)?.substring(1); const url = prompt.split(' ')?.at(0)?.substring(1);
@ -284,7 +284,7 @@
} }
}} }}
> >
<div class=" font-medium text-black dark:text-gray-100 line-clamp-1"> <div class=" font-medium text-black line-clamp-1">
{prompt.split(' ')?.at(0)?.substring(1)} {prompt.split(' ')?.at(0)?.substring(1)}
</div> </div>
@ -292,7 +292,7 @@
</button> </button>
{:else if prompt.split(' ')?.at(0)?.substring(1).startsWith('http')} {:else if prompt.split(' ')?.at(0)?.substring(1).startsWith('http')}
<button <button
class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 selected-command-option-button" class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-50 selected-command-option-button"
type="button" type="button"
on:click={() => { on:click={() => {
const url = prompt.split(' ')?.at(0)?.substring(1); const url = prompt.split(' ')?.at(0)?.substring(1);
@ -307,7 +307,7 @@
} }
}} }}
> >
<div class=" font-medium text-black dark:text-gray-100 line-clamp-1"> <div class=" font-medium text-black line-clamp-1">
{prompt.split(' ')?.at(0)?.substring(1)} {prompt.split(' ')?.at(0)?.substring(1)}
</div> </div>

8
src/lib/components/chat/MessageInput/Commands/Models.svelte

@ -70,15 +70,15 @@
id="commands-container" id="commands-container"
class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10" class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
> >
<div class="flex w-full rounded-xl border border-gray-100 dark:border-gray-850"> <div class="flex w-full rounded-xl border border-gray-100 ">
<div <div
class="max-h-60 flex flex-col w-full rounded-xl bg-white dark:text-gray-100" class="max-h-60 flex flex-col w-full rounded-xl bg-white "
> >
<div class="m-1 overflow-y-auto p-1 rounded-r-lg space-y-0.5 scrollbar-hidden"> <div class="m-1 overflow-y-auto p-1 rounded-r-lg space-y-0.5 scrollbar-hidden">
{#each filteredItems as model, modelIdx} {#each filteredItems as model, modelIdx}
<button <button
class="px-3 py-1.5 rounded-xl w-full text-left {modelIdx === selectedIdx class="px-3 py-1.5 rounded-xl w-full text-left {modelIdx === selectedIdx
? 'bg-gray-50 dark:bg-gray-850 selected-command-option-button' ? 'bg-gray-50 selected-command-option-button'
: ''}" : ''}"
type="button" type="button"
on:click={() => { on:click={() => {
@ -89,7 +89,7 @@
}} }}
on:focus={() => {}} on:focus={() => {}}
> >
<div class="flex font-medium text-black dark:text-gray-100 line-clamp-1"> <div class="flex font-medium text-black line-clamp-1">
<img <img
src={model?.info?.meta?.profile_image_url ?? '/static/favicon.png'} src={model?.info?.meta?.profile_image_url ?? '/static/favicon.png'}
alt={model?.name ?? model.id} alt={model?.name ?? model.id}

12
src/lib/components/chat/MessageInput/Commands/Prompts.svelte

@ -139,15 +139,15 @@
id="commands-container" id="commands-container"
class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10" class="px-2 mb-2 text-left w-full absolute bottom-0 left-0 right-0 z-10"
> >
<div class="flex w-full rounded-xl border border-gray-100 dark:border-gray-850"> <div class="flex w-full rounded-xl border border-gray-100 ">
<div <div
class="max-h-60 flex flex-col w-full rounded-xl bg-white dark:text-gray-100" class="max-h-60 flex flex-col w-full rounded-xl bg-white "
> >
<div class="m-1 overflow-y-auto p-1 space-y-0.5 scrollbar-hidden"> <div class="m-1 overflow-y-auto p-1 space-y-0.5 scrollbar-hidden">
{#each filteredPrompts as prompt, promptIdx} {#each filteredPrompts as prompt, promptIdx}
<button <button
class=" px-3 py-1.5 rounded-xl w-full text-left {promptIdx === selectedPromptIdx class=" px-3 py-1.5 rounded-xl w-full text-left {promptIdx === selectedPromptIdx
? ' bg-gray-50 dark:bg-gray-850 selected-command-option-button' ? ' bg-gray-50 selected-command-option-button'
: ''}" : ''}"
type="button" type="button"
on:click={() => { on:click={() => {
@ -158,11 +158,11 @@
}} }}
on:focus={() => {}} on:focus={() => {}}
> >
<div class=" font-medium text-black dark:text-gray-100"> <div class=" font-medium text-black ">
{prompt.command} {prompt.command}
</div> </div>
<div class=" text-xs text-gray-600 dark:text-gray-100"> <div class=" text-xs text-gray-600 ">
{prompt.title} {prompt.title}
</div> </div>
</button> </button>
@ -170,7 +170,7 @@
</div> </div>
<div <div
class=" px-2 pt-0.5 pb-1 text-xs text-gray-600 dark:text-gray-100 bg-white rounded-b-xl flex items-center space-x-1" class=" px-2 pt-0.5 pb-1 text-xs text-gray-600 bg-white rounded-b-xl flex items-center space-x-1"
> >
<div> <div>
<svg <svg

8
src/lib/components/chat/MessageInput/InputMenu.svelte

@ -92,7 +92,7 @@
<div slot="content"> <div slot="content">
<DropdownMenu.Content <DropdownMenu.Content
class="w-full max-w-[220px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-sm" class="w-full max-w-[220px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white shadow-sm"
sideOffset={15} sideOffset={15}
alignOffset={-8} alignOffset={-8}
side="top" side="top"
@ -148,7 +148,7 @@
className="w-full" className="w-full"
> >
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl {!fileUploadEnabled class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-xl {!fileUploadEnabled
? 'opacity-50' ? 'opacity-50'
: ''}" : ''}"
on:click={() => { on:click={() => {
@ -175,7 +175,7 @@
className="w-full" className="w-full"
> >
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl {!fileUploadEnabled class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-xl {!fileUploadEnabled
? 'opacity-50' ? 'opacity-50'
: ''}" : ''}"
on:click={() => { on:click={() => {
@ -191,7 +191,7 @@
{#if $config?.features?.enable_google_drive_integration} {#if $config?.features?.enable_google_drive_integration}
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 rounded-xl"
on:click={() => { on:click={() => {
uploadGoogleDriveHandler(); uploadGoogleDriveHandler();
}} }}

4
src/lib/components/chat/MessageInput/VoiceRecording.svelte

@ -320,7 +320,7 @@
<div <div
bind:clientWidth={containerWidth} bind:clientWidth={containerWidth}
class="{loading class="{loading
? ' bg-gray-100/50 dark:bg-gray-850/50' ? ' bg-gray-100/50 /50'
: 'bg-indigo-300/10 dark:bg-indigo-500/10 '} rounded-full flex justify-between {className}" : 'bg-indigo-300/10 dark:bg-indigo-500/10 '} rounded-full flex justify-between {className}"
> >
<div class="flex items-center mr-1"> <div class="flex items-center mr-1">
@ -382,7 +382,7 @@
class="text-sm class="text-sm
{loading ? ' text-gray-500 dark:text-gray-400 ' : ' text-indigo-400 '} {loading ? ' text-gray-500 ' : ' text-indigo-400 '}
font-medium flex-1 mx-auto text-center" font-medium flex-1 mx-auto text-center"
> >
{formatSeconds(durationSeconds)} {formatSeconds(durationSeconds)}

8
src/lib/components/chat/Messages/Citations.svelte

@ -102,7 +102,7 @@
{#each citations as citation, idx} {#each citations as citation, idx}
<button <button
id={`source-${id}-${idx}`} id={`source-${id}-${idx}`}
class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-white rounded-xl max-w-96" class="no-toggle outline-hidden flex p-1 bg-white rounded-xl max-w-96"
on:click={() => { on:click={() => {
showCitationModal = true; showCitationModal = true;
selectedCitation = citation; selectedCitation = citation;
@ -114,7 +114,7 @@
</div> </div>
{/if} {/if}
<div <div
class="flex-1 mx-1 truncate text-black/60 hover:text-black dark:text-white/60 dark:hover:text-white transition" class="flex-1 mx-1 truncate text-black/60 hover:text-black /60 dark:hover:text-white transition"
> >
{citation.source.name} {citation.source.name}
</div> </div>
@ -141,7 +141,7 @@
<div class="flex text-xs font-medium items-center"> <div class="flex text-xs font-medium items-center">
{#each citations.slice(0, 2) as citation, idx} {#each citations.slice(0, 2) as citation, idx}
<button <button
class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-gray-50 hover:bg-gray-100 dark:hover:bg-gray-850 transition rounded-xl max-w-96" class="no-toggle outline-hidden flex p-1 bg-gray-50 hover:bg-gray-100 transition rounded-xl max-w-96"
on:click={() => { on:click={() => {
showCitationModal = true; showCitationModal = true;
selectedCitation = citation; selectedCitation = citation;
@ -181,7 +181,7 @@
{#each citations as citation, idx} {#each citations as citation, idx}
<button <button
id={`source-${id}-${idx}`} id={`source-${id}-${idx}`}
class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-gray-50 hover:bg-gray-100 dark:hover:bg-gray-850 transition rounded-xl max-w-96" class="no-toggle outline-hidden flex p-1 bg-gray-50 hover:bg-gray-100 transition rounded-xl max-w-96"
on:click={() => { on:click={() => {
showCitationModal = true; showCitationModal = true;
selectedCitation = citation; selectedCitation = citation;

24
src/lib/components/chat/Messages/CitationsModal.svelte

@ -48,7 +48,7 @@
<Modal size="lg" bind:show> <Modal size="lg" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center capitalize"> <div class=" text-lg font-medium self-center capitalize">
{$i18n.t('Citation')} {$i18n.t('Citation')}
</div> </div>
@ -73,11 +73,11 @@
<div class="flex flex-col md:flex-row w-full px-6 pb-5 md:space-x-4"> <div class="flex flex-col md:flex-row w-full px-6 pb-5 md:space-x-4">
<div <div
class="flex flex-col w-full dark:text-gray-200 overflow-y-scroll max-h-[22rem] scrollbar-hidden" class="flex flex-col w-full overflow-y-scroll max-h-[22rem] scrollbar-hidden"
> >
{#each mergedDocuments as document, documentIdx} {#each mergedDocuments as document, documentIdx}
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class="text-sm font-medium dark:text-gray-300"> <div class="text-sm font-medium ">
{$i18n.t('Source')} {$i18n.t('Source')}
</div> </div>
@ -88,7 +88,7 @@
placement="top-start" placement="top-start"
tippyOptions={{ duration: [500, 0] }} tippyOptions={{ duration: [500, 0] }}
> >
<div class="text-sm dark:text-gray-400 flex items-center gap-2 w-fit"> <div class="text-sm flex items-center gap-2 w-fit">
<a <a
class="hover:text-gray-500 dark:hover:text-gray-100 underline grow" class="hover:text-gray-500 dark:hover:text-gray-100 underline grow"
href={document?.metadata?.file_id href={document?.metadata?.file_id
@ -101,7 +101,7 @@
{document?.metadata?.name ?? document.source.name} {document?.metadata?.name ?? document.source.name}
</a> </a>
{#if document?.metadata?.page} {#if document?.metadata?.page}
<span class="text-xs text-gray-500 dark:text-gray-400"> <span class="text-xs text-gray-500 ">
({$i18n.t('page')} ({$i18n.t('page')}
{document.metadata.page + 1}) {document.metadata.page + 1})
</span> </span>
@ -109,7 +109,7 @@
</div> </div>
</Tooltip> </Tooltip>
{#if showRelevance} {#if showRelevance}
<div class="text-sm font-medium dark:text-gray-300 mt-2"> <div class="text-sm font-medium mt-2">
{$i18n.t('Relevance')} {$i18n.t('Relevance')}
</div> </div>
{#if document.distance !== undefined} {#if document.distance !== undefined}
@ -119,7 +119,7 @@
placement="top-start" placement="top-start"
tippyOptions={{ duration: [500, 0] }} tippyOptions={{ duration: [500, 0] }}
> >
<div class="text-sm my-1 dark:text-gray-400 flex items-center gap-2 w-fit"> <div class="text-sm my-1 flex items-center gap-2 w-fit">
{#if showPercentage} {#if showPercentage}
{@const percentage = calculatePercentage(document.distance)} {@const percentage = calculatePercentage(document.distance)}
<span <span
@ -138,19 +138,19 @@
</div> </div>
</Tooltip> </Tooltip>
{:else} {:else}
<div class="text-sm dark:text-gray-400"> <div class="text-sm ">
{$i18n.t('No distance available')} {$i18n.t('No distance available')}
</div> </div>
{/if} {/if}
{/if} {/if}
{:else} {:else}
<div class="text-sm dark:text-gray-400"> <div class="text-sm ">
{$i18n.t('No source available')} {$i18n.t('No source available')}
</div> </div>
{/if} {/if}
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class=" text-sm font-medium dark:text-gray-300 mt-2"> <div class=" text-sm font-medium mt-2">
{$i18n.t('Content')} {$i18n.t('Content')}
</div> </div>
{#if document.metadata?.html} {#if document.metadata?.html}
@ -161,14 +161,14 @@
title={$i18n.t('Content')} title={$i18n.t('Content')}
></iframe> ></iframe>
{:else} {:else}
<pre class="text-sm dark:text-gray-400 whitespace-pre-line"> <pre class="text-sm whitespace-pre-line">
{document.document} {document.document}
</pre> </pre>
{/if} {/if}
</div> </div>
{#if documentIdx !== mergedDocuments.length - 1} {#if documentIdx !== mergedDocuments.length - 1}
<hr class="border-gray-100 dark:border-gray-850 my-3" /> <hr class="border-gray-100 my-3" />
{/if} {/if}
{/each} {/each}
</div> </div>

18
src/lib/components/chat/Messages/CodeBlock.svelte

@ -409,7 +409,7 @@
{#if lang === 'mermaid'} {#if lang === 'mermaid'}
{#if mermaidHtml} {#if mermaidHtml}
<SvgPanZoom <SvgPanZoom
className=" border border-gray-100 dark:border-gray-850 rounded-lg max-h-fit overflow-hidden" className=" border border-gray-100 rounded-lg max-h-fit overflow-hidden"
svg={mermaidHtml} svg={mermaidHtml}
content={_token.text} content={_token.text}
/> />
@ -417,12 +417,12 @@
<pre class="mermaid">{code}</pre> <pre class="mermaid">{code}</pre>
{/if} {/if}
{:else} {:else}
<div class="text-text-300 absolute pl-4 py-1.5 text-xs font-medium dark:text-white"> <div class="text-text-300 absolute pl-4 py-1.5 text-xs font-medium ">
{lang} {lang}
</div> </div>
<div <div
class="sticky {stickyButtonsClassName} mb-1 py-1 pr-2.5 flex items-center justify-end z-10 text-xs text-black dark:text-white" class="sticky {stickyButtonsClassName} mb-1 py-1 pr-2.5 flex items-center justify-end z-10 text-xs text-black "
> >
<div class="flex items-center gap-0.5 translate-y-[1px]"> <div class="flex items-center gap-0.5 translate-y-[1px]">
{#if lang.toLowerCase() === 'python' || lang.toLowerCase() === 'py' || (lang === '' && checkPythonCode(code))} {#if lang.toLowerCase() === 'python' || lang.toLowerCase() === 'py' || (lang === '' && checkPythonCode(code))}
@ -430,7 +430,7 @@
<div class="run-code-button bg-none border-none p-1 cursor-not-allowed">Running</div> <div class="run-code-button bg-none border-none p-1 cursor-not-allowed">Running</div>
{:else if run} {:else if run}
<button <button
class="run-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5" class="run-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 transition rounded-md px-1.5 py-0.5"
on:click={async () => { on:click={async () => {
code = _code; code = _code;
await tick(); await tick();
@ -442,7 +442,7 @@
{#if save} {#if save}
<button <button
class="save-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5" class="save-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 transition rounded-md px-1.5 py-0.5"
on:click={saveCode} on:click={saveCode}
> >
{saved ? $i18n.t('Saved') : $i18n.t('Save')} {saved ? $i18n.t('Saved') : $i18n.t('Save')}
@ -450,7 +450,7 @@
{/if} {/if}
<button <button
class="copy-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-md px-1.5 py-0.5" class="copy-code-button bg-none border-none bg-gray-50 hover:bg-gray-100 transition rounded-md px-1.5 py-0.5"
on:click={copyCode}>{copied ? $i18n.t('Copied') : $i18n.t('Copy')}</button on:click={copyCode}>{copied ? $i18n.t('Copied') : $i18n.t('Copy')}</button
> >
</div> </div>
@ -463,7 +463,7 @@
? '' ? ''
: 'rounded-b-lg'} overflow-hidden" : 'rounded-b-lg'} overflow-hidden"
> >
<div class=" pt-7 bg-gray-50 dark:bg-gray-850"></div> <div class=" pt-7 bg-gray-50 "></div>
<CodeEditor <CodeEditor
value={code} value={code}
{id} {id}
@ -479,12 +479,12 @@
<div <div
id="plt-canvas-{id}" id="plt-canvas-{id}"
class="bg-gray-50 dark:bg-[#202123] dark:text-white max-w-full overflow-x-auto scrollbar-hidden" class="bg-gray-50 dark:bg-[#202123] max-w-full overflow-x-auto scrollbar-hidden"
/> />
{#if executing || stdout || stderr || result || files} {#if executing || stdout || stderr || result || files}
<div <div
class="bg-gray-50 dark:bg-[#202123] dark:text-white rounded-b-lg! py-4 px-4 flex flex-col gap-2" class="bg-gray-50 dark:bg-[#202123] rounded-b-lg! py-4 px-4 flex flex-col gap-2"
> >
{#if executing} {#if executing}
<div class=" "> <div class=" ">

10
src/lib/components/chat/Messages/CodeExecutionModal.svelte

@ -12,7 +12,7 @@
<Modal size="lg" bind:show> <Modal size="lg" bind:show>
<div> <div>
<div class="flex justify-between dark:text-gray-300 px-5 pt-4 pb-2"> <div class="flex justify-between px-5 pt-4 pb-2">
<div class="text-lg font-medium self-center flex flex-col gap-0.5 capitalize"> <div class="text-lg font-medium self-center flex flex-col gap-0.5 capitalize">
{#if codeExecution?.result} {#if codeExecution?.result}
<div> <div>
@ -64,7 +64,7 @@
<div class="flex flex-col md:flex-row w-full px-4 pb-5"> <div class="flex flex-col md:flex-row w-full px-4 pb-5">
<div <div
class="flex flex-col w-full dark:text-gray-200 overflow-y-scroll max-h-[22rem] scrollbar-hidden" class="flex flex-col w-full overflow-y-scroll max-h-[22rem] scrollbar-hidden"
> >
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<CodeBlock <CodeBlock
@ -82,7 +82,7 @@
</div> </div>
{#if codeExecution?.result && (codeExecution?.result?.error || codeExecution?.result?.output)} {#if codeExecution?.result && (codeExecution?.result?.error || codeExecution?.result?.output)}
<div class="dark:bg-[#202123] dark:text-white px-4 py-4 rounded-b-lg flex flex-col gap-3"> <div class="dark:bg-[#202123] px-4 py-4 rounded-b-lg flex flex-col gap-3">
{#if codeExecution?.result?.error} {#if codeExecution?.result?.error}
<div> <div>
<div class=" text-gray-500 text-xs mb-1">{$i18n.t('ERROR')}</div> <div class=" text-gray-500 text-xs mb-1">{$i18n.t('ERROR')}</div>
@ -99,8 +99,8 @@
{/if} {/if}
{#if codeExecution?.result?.files && codeExecution?.result?.files.length > 0} {#if codeExecution?.result?.files && codeExecution?.result?.files.length > 0}
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<hr class="border-gray-100 dark:border-gray-850 my-2" /> <hr class="border-gray-100 my-2" />
<div class=" text-sm font-medium dark:text-gray-300"> <div class=" text-sm font-medium ">
{$i18n.t('Files')} {$i18n.t('Files')}
</div> </div>
<ul class="mt-1 list-disc pl-4 text-xs"> <ul class="mt-1 list-disc pl-4 text-xs">

2
src/lib/components/chat/Messages/CodeExecutions.svelte

@ -30,7 +30,7 @@
{#each codeExecutions as execution (execution.id)} {#each codeExecutions as execution (execution.id)}
<div class="flex gap-1 text-xs font-semibold"> <div class="flex gap-1 text-xs font-semibold">
<button <button
class="flex dark:text-gray-300 py-1 px-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-xl max-w-96" class="flex py-1 px-1 bg-gray-50 hover:bg-gray-100 transition rounded-xl max-w-96"
on:click={() => { on:click={() => {
selectedCodeExecution = execution; selectedCodeExecution = execution;
showCodeExecutionModal = true; showCodeExecutionModal = true;

12
src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte

@ -74,7 +74,7 @@
<!-- {JSON.stringify(tokens)} --> <!-- {JSON.stringify(tokens)} -->
{#each tokens as token, tokenIdx (tokenIdx)} {#each tokens as token, tokenIdx (tokenIdx)}
{#if token.type === 'hr'} {#if token.type === 'hr'}
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
{:else if token.type === 'heading'} {:else if token.type === 'heading'}
<svelte:element this={headerComponent(token.depth)} dir="auto"> <svelte:element this={headerComponent(token.depth)} dir="auto">
<MarkdownInlineTokens id={`${id}-${tokenIdx}-h`} tokens={token.tokens} {onSourceClick} /> <MarkdownInlineTokens id={`${id}-${tokenIdx}-h`} tokens={token.tokens} {onSourceClick} />
@ -106,16 +106,16 @@
<div class="relative w-full group"> <div class="relative w-full group">
<div class="scrollbar-hidden relative overflow-x-auto max-w-full rounded-lg"> <div class="scrollbar-hidden relative overflow-x-auto max-w-full rounded-lg">
<table <table
class=" w-full text-sm text-left text-gray-500 dark:text-gray-400 max-w-full rounded-xl" class=" w-full text-sm text-left text-gray-500 max-w-full rounded-xl"
> >
<thead <thead
class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-850 dark:text-gray-400 border-none" class="text-xs text-gray-700 uppercase bg-gray-50 border-none"
> >
<tr class=""> <tr class="">
{#each token.header as header, headerIdx} {#each token.header as header, headerIdx}
<th <th
scope="col" scope="col"
class="px-3! py-1.5! cursor-pointer border border-gray-100 dark:border-gray-850" class="px-3! py-1.5! cursor-pointer border border-gray-100 "
style={token.align[headerIdx] ? '' : `text-align: ${token.align[headerIdx]}`} style={token.align[headerIdx] ? '' : `text-align: ${token.align[headerIdx]}`}
> >
<div class="flex flex-col gap-1.5 text-left"> <div class="flex flex-col gap-1.5 text-left">
@ -133,10 +133,10 @@
</thead> </thead>
<tbody> <tbody>
{#each token.rows as row, rowIdx} {#each token.rows as row, rowIdx}
<tr class="bg-white dark:border-gray-850 text-xs"> <tr class="bg-white text-xs">
{#each row ?? [] as cell, cellIdx} {#each row ?? [] as cell, cellIdx}
<td <td
class="px-3! py-1.5! text-gray-900 dark:text-white w-max border border-gray-100 dark:border-gray-850" class="px-3! py-1.5! text-gray-900 w-max border border-gray-100 "
style={token.align[cellIdx] ? '' : `text-align: ${token.align[cellIdx]}`} style={token.align[cellIdx] ? '' : `text-align: ${token.align[cellIdx]}`}
> >
<div class="flex flex-col break-normal"> <div class="flex flex-col break-normal">

2
src/lib/components/chat/Messages/Markdown/Source.svelte

@ -38,7 +38,7 @@
{#if attributes.title !== 'N/A'} {#if attributes.title !== 'N/A'}
<button <button
class="text-xs font-medium w-fit translate-y-[2px] px-2 py-0.5 dark:bg-white/5 dark:text-white/60 dark:hover:text-white bg-gray-50 text-black/60 hover:text-black transition rounded-lg" class="text-xs font-medium w-fit translate-y-[2px] px-2 py-0.5 dark:bg-white/5 /60 dark:hover:text-white bg-gray-50 text-black/60 hover:text-black transition rounded-lg"
on:click={() => { on:click={() => {
onClick(id, attributes.data); onClick(id, attributes.data);
}} }}

6
src/lib/components/chat/Messages/MultiResponseMessages.svelte

@ -194,10 +194,10 @@
<div <div
class=" snap-center w-full max-w-full m-1 border {history.messages[messageId] class=" snap-center w-full max-w-full m-1 border {history.messages[messageId]
?.modelIdx == modelIdx ?.modelIdx == modelIdx
? `border-gray-100 dark:border-gray-850 border-[1.5px] ${ ? `border-gray-100 border-[1.5px] ${
$mobile ? 'min-w-full' : 'min-w-80' $mobile ? 'min-w-full' : 'min-w-80'
}` }`
: `border-gray-100 dark:border-gray-850 border-dashed ${ : `border-gray-100 border-dashed ${
$mobile ? 'min-w-full' : 'min-w-80' $mobile ? 'min-w-full' : 'min-w-80'
}`} transition-all p-5 rounded-2xl" }`} transition-all p-5 rounded-2xl"
on:click={async () => { on:click={async () => {
@ -293,7 +293,7 @@
id="merge-response-button" id="merge-response-button"
class="{true class="{true
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" : 'invisible group-hover:visible'} p-1 hover:bg-black/5 hover:text-black transition regenerate-response-button"
on:click={() => { on:click={() => {
mergeResponsesHandler(); mergeResponsesHandler();
}} }}

8
src/lib/components/chat/Messages/RateComment.svelte

@ -110,7 +110,7 @@
{/if} {/if}
<div <div
class=" my-2.5 rounded-xl px-4 py-3 border border-gray-100 dark:border-gray-850" class=" my-2.5 rounded-xl px-4 py-3 border border-gray-100 "
id="message-feedback-{message.id}" id="message-feedback-{message.id}"
> >
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
@ -142,7 +142,7 @@
<!-- 1-10 scale --> <!-- 1-10 scale -->
{#each Array.from({ length: 10 }).map((_, i) => i + 1) as rating} {#each Array.from({ length: 10 }).map((_, i) => i + 1) as rating}
<button <button
class="size-7 text-sm border border-gray-100 dark:border-gray-850 hover:bg-gray-50 dark:hover:bg-gray-850 {detailedRating === class="size-7 text-sm border border-gray-100 hover:bg-gray-50 {detailedRating ===
rating rating
? 'bg-gray-100 dark:bg-gray-800' ? 'bg-gray-100 dark:bg-gray-800'
: ''} transition rounded-full disabled:cursor-not-allowed disabled:text-gray-500 disabled:bg-white dark:disabled:bg-gray-900" : ''} transition rounded-full disabled:cursor-not-allowed disabled:text-gray-500 disabled:bg-white dark:disabled:bg-gray-900"
@ -175,7 +175,7 @@
<div class="flex flex-wrap gap-1.5 text-sm mt-1.5"> <div class="flex flex-wrap gap-1.5 text-sm mt-1.5">
{#each reasons as reason} {#each reasons as reason}
<button <button
class="px-3 py-0.5 border border-gray-100 dark:border-gray-850 hover:bg-gray-50 dark:hover:bg-gray-850 {selectedReason === class="px-3 py-0.5 border border-gray-100 hover:bg-gray-50 {selectedReason ===
reason reason
? 'bg-gray-100 dark:bg-gray-800' ? 'bg-gray-100 dark:bg-gray-800'
: ''} transition rounded-xl" : ''} transition rounded-xl"
@ -247,7 +247,7 @@
</div> </div>
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
on:click={() => { on:click={() => {
saveHandler(); saveHandler();
}} }}

26
src/lib/components/chat/Messages/ResponseMessage.svelte

@ -541,7 +541,7 @@
/> />
</div> </div>
<div class="flex-auto w-0 pl-1 message" style="background-color: #ebf4ff;"> <div class="flex-auto w-0 pl-1 message rounded-2xl" style="background-color:#a5d1fe;">
<div> <div>
{#if message?.files && message.files?.filter((f) => f.type === 'image').length > 0} {#if message?.files && message.files?.filter((f) => f.type === 'image').length > 0}
@ -663,7 +663,7 @@
<div> <div>
<button <button
id="save-new-message-button" id="save-new-message-button"
class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl" class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 border dark:border-gray-700 text-gray-700 transition rounded-3xl"
on:click={() => { on:click={() => {
saveAsCopyHandler(); saveAsCopyHandler();
}} }}
@ -675,7 +675,7 @@
<div class="flex space-x-1.5"> <div class="flex space-x-1.5">
<button <button
id="close-edit-message-button" id="close-edit-message-button"
class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl" class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 transition rounded-3xl"
on:click={() => { on:click={() => {
cancelEditMessage(); cancelEditMessage();
}} }}
@ -812,7 +812,7 @@
</button> </button>
<div <div
class="text-sm tracking-widest font-semibold self-center dark:text-gray-100 min-w-fit" class="text-sm tracking-widest font-semibold self-center min-w-fit"
> >
{siblings.indexOf(message.id) + 1}/{siblings.length} {siblings.indexOf(message.id) + 1}/{siblings.length}
</div> </div>
@ -848,7 +848,7 @@
<button <button
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition"
on:click={() => { on:click={() => {
editMessageHandler(); editMessageHandler();
}} }}
@ -876,7 +876,7 @@
<button <button
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition copy-response-button" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition copy-response-button"
on:click={() => { on:click={() => {
copyToClipboard(message.content); copyToClipboard(message.content);
}} }}
@ -903,7 +903,7 @@
id="speak-button-{message.id}" id="speak-button-{message.id}"
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition"
on:click={() => { on:click={() => {
if (!loadingSpeech) { if (!loadingSpeech) {
toggleSpeakMessage(); toggleSpeakMessage();
@ -981,7 +981,7 @@
<button <button
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition"
on:click={() => { on:click={() => {
if (!generatingImage) { if (!generatingImage) {
generateImage(message); generateImage(message);
@ -1058,7 +1058,7 @@
<button <button
class=" {isLastMessage class=" {isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition whitespace-pre-wrap" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition whitespace-pre-wrap"
on:click={() => { on:click={() => {
console.log(message); console.log(message);
}} }}
@ -1164,7 +1164,7 @@
id="continue-response-button" id="continue-response-button"
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition regenerate-response-button"
on:click={() => { on:click={() => {
continueResponse(); continueResponse();
}} }}
@ -1197,7 +1197,7 @@
type="button" type="button"
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition regenerate-response-button"
on:click={() => { on:click={() => {
showRateComment = false; showRateComment = false;
regenerateResponse(message); regenerateResponse(message);
@ -1239,7 +1239,7 @@
id="continue-response-button" id="continue-response-button"
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition regenerate-response-button"
on:click={() => { on:click={() => {
showDeleteConfirm = true; showDeleteConfirm = true;
}} }}
@ -1269,7 +1269,7 @@
type="button" type="button"
class="{isLastMessage class="{isLastMessage
? 'visible' ? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition" : 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 hover:text-black transition"
on:click={() => { on:click={() => {
actionMessage(action.id, message); actionMessage(action.id, message);
}} }}

6
src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte

@ -10,7 +10,7 @@
<Collapsible bind:open={state} className="w-full space-y-1"> <Collapsible bind:open={state} className="w-full space-y-1">
<div <div
class="flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition" class="flex items-center gap-2 text-gray-500 hover:text-gray-700 transition"
> >
<slot /> <slot />
@ -28,7 +28,7 @@
<a <a
href="https://www.google.com/search?q={status.query}" href="https://www.google.com/search?q={status.query}"
target="_blank" target="_blank"
class="flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 dark:text-gray-300 no-underline" class="flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 no-underline"
> >
<div class="flex gap-2 items-center"> <div class="flex gap-2 items-center">
<MagnifyingGlass /> <MagnifyingGlass />
@ -64,7 +64,7 @@
target="_blank" target="_blank"
class="flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1 class="flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1
? '' ? ''
: 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 dark:text-gray-300" : 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 "
> >
<div class=" line-clamp-1"> <div class=" line-clamp-1">
{url} {url}

18
src/lib/components/chat/Messages/UserMessage.svelte

@ -109,7 +109,7 @@
/> />
</div> </div>
{/if} {/if}
<div class="flex-auto w-0 max-w-full pl-1" style="background-color:#ffffff;"> <div class="flex-auto w-0 max-w-full pl-1" >
{#if !($settings?.chatBubble ?? true)} {#if !($settings?.chatBubble ?? true)}
<div> <div>
<Name> <Name>
@ -149,7 +149,7 @@
name={file.name} name={file.name}
type={file.type} type={file.type}
size={file?.size} size={file?.size}
colorClassName="bg-white dark:bg-gray-850 " colorClassName="bg-white "
/> />
{/if} {/if}
</div> </div>
@ -189,7 +189,7 @@
<div> <div>
<button <button
id="save-edit-message-button" id="save-edit-message-button"
class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl" class=" px-4 py-2 bg-gray-50 hover:bg-gray-100 border dark:border-gray-700 text-gray-700 transition rounded-3xl"
on:click={() => { on:click={() => {
editMessageConfirmHandler(false); editMessageConfirmHandler(false);
}} }}
@ -201,7 +201,7 @@
<div class="flex space-x-1.5"> <div class="flex space-x-1.5">
<button <button
id="close-edit-message-button" id="close-edit-message-button"
class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl" class="px-4 py-2 bg-white hover:bg-gray-100 text-gray-800 transition rounded-3xl"
on:click={() => { on:click={() => {
cancelEditMessage(); cancelEditMessage();
}} }}
@ -226,7 +226,7 @@
<div class="flex {($settings?.chatBubble ?? true) ? 'justify-end pb-1' : 'w-full'}"> <div class="flex {($settings?.chatBubble ?? true) ? 'justify-end pb-1' : 'w-full'}">
<div style="background-color: #ffffff;border:solid #ebecef 1px" <div style="background-color: #ffffff;border:solid #ebecef 1px"
class="rounded-3xl {($settings?.chatBubble ?? true) class="rounded-3xl {($settings?.chatBubble ?? true)
? `max-w-[90%] px-5 py-2 bg-gray-50 dark:bg-gray-850 ${ ? `max-w-[90%] px-5 py-2 bg-gray-50 ${
message.files ? 'rounded-tr-lg' : '' message.files ? 'rounded-tr-lg' : ''
}` }`
: ' w-full'}" : ' w-full'}"
@ -268,7 +268,7 @@
</button> </button>
<div <div
class="text-sm tracking-widest font-semibold self-center dark:text-gray-100" class="text-sm tracking-widest font-semibold self-center "
> >
{siblings.indexOf(message.id) + 1}/{siblings.length} {siblings.indexOf(message.id) + 1}/{siblings.length}
</div> </div>
@ -300,7 +300,7 @@
{#if !readOnly} {#if !readOnly}
<Tooltip content={$i18n.t('Edit')} placement="bottom"> <Tooltip content={$i18n.t('Edit')} placement="bottom">
<button <button
class="invisible group-hover:visible p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition edit-user-message-button" class="invisible group-hover:visible p-1.5 hover:bg-black/5 hover:text-black transition edit-user-message-button"
on:click={() => { on:click={() => {
editMessageHandler(); editMessageHandler();
}} }}
@ -325,7 +325,7 @@
<Tooltip content={$i18n.t('Copy')} placement="bottom"> <Tooltip content={$i18n.t('Copy')} placement="bottom">
<button <button
class="invisible group-hover:visible p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition" class="invisible group-hover:visible p-1.5 hover:bg-black/5 hover:text-black transition"
on:click={() => { on:click={() => {
copyToClipboard(message.content); copyToClipboard(message.content);
}} }}
@ -399,7 +399,7 @@
</button> </button>
<div <div
class="text-sm tracking-widest font-semibold self-center dark:text-gray-100" class="text-sm tracking-widest font-semibold self-center "
> >
{siblings.indexOf(message.id) + 1}/{siblings.length} {siblings.indexOf(message.id) + 1}/{siblings.length}
</div> </div>

26
src/lib/components/chat/ModelSelector/Selector.svelte

@ -262,7 +262,7 @@
<DropdownMenu.Content <DropdownMenu.Content
class=" z-40 {$mobile class=" z-40 {$mobile
? `w-full` ? `w-full`
: `${className}`} max-w-[calc(100vw-1rem)] justify-start rounded-xl bg-white dark:bg-gray-850 dark:text-white shadow-lg outline-hidden" : `${className}`} max-w-[calc(100vw-1rem)] justify-start rounded-xl bg-white shadow-lg outline-hidden"
transition={flyAndScale} transition={flyAndScale}
side={$mobile ? 'bottom' : 'bottom-start'} side={$mobile ? 'bottom' : 'bottom-start'}
sideOffset={3} sideOffset={3}
@ -298,14 +298,14 @@
/> />
</div> </div>
<hr class="border-gray-100 dark:border-gray-850" /> <hr class="border-gray-100 " />
{/if} {/if}
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group"> <div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group">
{#each filteredItems as item, index} {#each filteredItems as item, index}
<button <button
aria-label="model-item" aria-label="model-item"
class="flex w-full text-left 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-hidden transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer data-highlighted:bg-muted {index === class="flex w-full text-left font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 outline-hidden transition-all duration-75 hover:bg-gray-100 rounded-lg cursor-pointer data-highlighted:bg-muted {index ===
selectedModelIdx selectedModelIdx
? 'bg-gray-100 dark:bg-gray-800 group-hover:bg-transparent' ? 'bg-gray-100 dark:bg-gray-800 group-hover:bg-transparent'
: ''}" : ''}"
@ -322,7 +322,7 @@
<div class="flex gap-0.5 self-start h-full mb-1.5 -translate-x-1"> <div class="flex gap-0.5 self-start h-full mb-1.5 -translate-x-1">
{#each item.model?.info?.meta.tags as tag} {#each item.model?.info?.meta.tags as tag}
<div <div
class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200" class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 "
> >
{tag.name} {tag.name}
</div> </div>
@ -361,7 +361,7 @@
className="self-end" className="self-end"
> >
<span <span
class=" text-xs font-medium text-gray-600 dark:text-gray-400 line-clamp-1" class=" text-xs font-medium text-gray-600 line-clamp-1"
>{item.model.ollama?.details?.parameter_size ?? ''}</span >{item.model.ollama?.details?.parameter_size ?? ''}</span
> >
</Tooltip> </Tooltip>
@ -445,7 +445,7 @@
{#each item.model?.info?.meta.tags as tag} {#each item.model?.info?.meta.tags as tag}
<Tooltip content={tag.name}> <Tooltip content={tag.name}>
<div <div
class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200" class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 "
> >
{tag.name} {tag.name}
</div> </div>
@ -464,7 +464,7 @@
</button> </button>
{:else} {:else}
<div> <div>
<div class="block px-3 py-2 text-sm text-gray-700 dark:text-gray-100"> <div class="block px-3 py-2 text-sm text-gray-700 ">
{$i18n.t('No results found')} {$i18n.t('No results found')}
</div> </div>
</div> </div>
@ -478,7 +478,7 @@
placement="top-start" placement="top-start"
> >
<button <button
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-hidden transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-800 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 outline-hidden transition-all duration-75 hover:bg-gray-100 rounded-lg cursor-pointer data-highlighted:bg-muted"
on:click={() => { on:click={() => {
pullModelHandler(); pullModelHandler();
}} }}
@ -492,7 +492,7 @@
{#each Object.keys($MODEL_DOWNLOAD_POOL) as model} {#each Object.keys($MODEL_DOWNLOAD_POOL) as model}
<div <div
class="flex w-full justify-between font-medium select-none rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 dark:text-gray-100 outline-hidden transition-all duration-75 rounded-lg cursor-pointer data-highlighted:bg-muted" class="flex w-full justify-between font-medium select-none rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 outline-hidden transition-all duration-75 rounded-lg cursor-pointer data-highlighted:bg-muted"
> >
<div class="flex"> <div class="flex">
<div class="-ml-2 mr-2.5 translate-y-0.5"> <div class="-ml-2 mr-2.5 translate-y-0.5">
@ -545,13 +545,13 @@
<div class="mr-2 ml-1 translate-y-0.5"> <div class="mr-2 ml-1 translate-y-0.5">
<Tooltip content={$i18n.t('Cancel')}> <Tooltip content={$i18n.t('Cancel')}>
<button <button
class="text-gray-800 dark:text-gray-100" class="text-gray-800 "
on:click={() => { on:click={() => {
cancelModelPullHandler(model); cancelModelPullHandler(model);
}} }}
> >
<svg <svg
class="w-4 h-4 text-gray-800 dark:text-white" class="w-4 h-4 text-gray-800 "
aria-hidden="true" aria-hidden="true"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="24" width="24"
@ -575,11 +575,11 @@
</div> </div>
{#if showTemporaryChatControl} {#if showTemporaryChatControl}
<hr class="border-gray-100 dark:border-gray-850" /> <hr class="border-gray-100 " />
<div class="flex items-center mx-2 my-2"> <div class="flex items-center mx-2 my-2">
<button <button
class="flex justify-between w-full font-medium line-clamp-1 select-none items-center rounded-button py-2 px-3 text-sm text-gray-700 dark:text-gray-100 outline-hidden transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer data-highlighted:bg-muted" class="flex justify-between w-full font-medium line-clamp-1 select-none items-center rounded-button py-2 px-3 text-sm text-gray-700 outline-hidden transition-all duration-75 hover:bg-gray-100 rounded-lg cursor-pointer data-highlighted:bg-muted"
on:click={async () => { on:click={async () => {
temporaryChatEnabled.set(!$temporaryChatEnabled); temporaryChatEnabled.set(!$temporaryChatEnabled);
await goto('/'); await goto('/');

28
src/lib/components/chat/Navbar.svelte

@ -43,9 +43,9 @@
<ShareChatModal bind:show={showShareChatModal} chatId={$chatId} /> <ShareChatModal bind:show={showShareChatModal} chatId={$chatId} />
<!-- <nav class="sticky top-0 z-30 w-full px-1.5 py-1.5 -mb-8 flex items-center drag-region"> <nav class="sticky top-0 z-30 w-full px-1.5 py-1.5 -mb-8 flex items-center drag-region">
<div <div
class=" bg-linear-to-b via-50% from-white via-white to-transparent dark:from-gray-900 dark:via-gray-900 dark:to-transparent pointer-events-none absolute inset-0 -bottom-7 z-[-1]" class=" bg-linear-to-b via-50% from-white via-white to-transparent dark:to-transparent pointer-events-none absolute inset-0 -bottom-7 z-[-1]"
></div> ></div>
<div class=" flex max-w-full w-full mx-auto px-1 pt-0.5 bg-transparent"> <div class=" flex max-w-full w-full mx-auto px-1 pt-0.5 bg-transparent">
@ -53,11 +53,11 @@
<div <div
class="{$showSidebar class="{$showSidebar
? 'md:hidden' ? 'md:hidden'
: ''} mr-1 self-start flex flex-none items-center text-gray-600 dark:text-gray-400" : ''} mr-1 self-start flex flex-none items-center text-gray-600 "
> >
<button <button
id="sidebar-toggle-button" id="sidebar-toggle-button"
class="cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition" class="cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-50 transition"
on:click={() => { on:click={() => {
showSidebar.set(!$showSidebar); showSidebar.set(!$showSidebar);
}} }}
@ -69,7 +69,7 @@
</button> </button>
</div> </div>
<div <!-- <div
class="flex-1 overflow-hidden max-w-full py-0.5 class="flex-1 overflow-hidden max-w-full py-0.5
{$showSidebar ? 'ml-1' : ''} {$showSidebar ? 'ml-1' : ''}
" "
@ -77,9 +77,9 @@
{#if showModelSelector} {#if showModelSelector}
<ModelSelector bind:selectedModels showSetDefault={!shareEnabled} /> <ModelSelector bind:selectedModels showSetDefault={!shareEnabled} />
{/if} {/if}
</div> </div> -->
<div class="self-start flex flex-none items-center text-gray-600 dark:text-gray-400"> <!-- <div class="self-start flex flex-none items-center text-gray-600 ">
{#if shareEnabled && chat && (chat.id || $temporaryChatEnabled)} {#if shareEnabled && chat && (chat.id || $temporaryChatEnabled)}
<Menu <Menu
{chat} {chat}
@ -92,7 +92,7 @@
}} }}
> >
<button <button
class="flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition" class="flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 transition"
id="chat-context-menu-button" id="chat-context-menu-button"
> >
<div class=" m-auto self-center"> <div class=" m-auto self-center">
@ -116,7 +116,7 @@
{:else if $mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)} {:else if $mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)}
<Tooltip content={$i18n.t('Controls')}> <Tooltip content={$i18n.t('Controls')}>
<button <button
class=" flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition" class=" flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 transition"
on:click={async () => { on:click={async () => {
await showControls.set(!$showControls); await showControls.set(!$showControls);
}} }}
@ -132,7 +132,7 @@
{#if !$mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)} {#if !$mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)}
<Tooltip content={$i18n.t('Controls')}> <Tooltip content={$i18n.t('Controls')}>
<button <button
class=" flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-850 transition" class=" flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-50 transition"
on:click={async () => { on:click={async () => {
await showControls.set(!$showControls); await showControls.set(!$showControls);
}} }}
@ -150,7 +150,7 @@
id="new-chat-button" id="new-chat-button"
class=" flex {$showSidebar class=" flex {$showSidebar
? 'md:hidden' ? 'md:hidden'
: ''} cursor-pointer px-2 py-2 rounded-xl text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-850 transition" : ''} cursor-pointer px-2 py-2 rounded-xl text-gray-600 hover:bg-gray-50 transition"
on:click={() => { on:click={() => {
initNewChat(); initNewChat();
}} }}
@ -173,7 +173,7 @@
}} }}
> >
<button <button
class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-50 dark:hover:bg-gray-850 transition" class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-50 transition"
aria-label="User Menu" aria-label="User Menu"
> >
<div class=" self-center"> <div class=" self-center">
@ -187,7 +187,7 @@
</button> </button>
</UserMenu> </UserMenu>
{/if} {/if}
</div> </div> -->
</div> </div>
</div> </div>
</nav> --> </nav>

2
src/lib/components/chat/Overview.svelte

@ -160,7 +160,7 @@
</script> </script>
<div class="w-full h-full relative"> <div class="w-full h-full relative">
<div class=" absolute z-50 w-full flex justify-between dark:text-gray-100 px-4 py-3.5"> <div class=" absolute z-50 w-full flex justify-between px-4 py-3.5">
<div class="flex items-center gap-2.5"> <div class="flex items-center gap-2.5">
<button <button
class="self-center p-0.5" class="self-center p-0.5"

6
src/lib/components/chat/Overview/Node.svelte

@ -11,7 +11,7 @@
</script> </script>
<div <div
class="px-4 py-3 shadow-md rounded-xl dark:bg-black bg-white border dark:border-gray-900 w-60 h-20 group" class="px-4 py-3 shadow-md rounded-xl bg-white border dark:border-gray-900 w-60 h-20 group"
> >
<Tooltip <Tooltip
content={data?.message?.error ? data.message.error.content : data.message.content} content={data?.message?.error ? data.message.error.content : data.message.content}
@ -26,7 +26,7 @@
/> />
<div class="ml-2"> <div class="ml-2">
<div class=" flex justify-between items-center"> <div class=" flex justify-between items-center">
<div class="text-xs text-black dark:text-white font-medium line-clamp-1"> <div class="text-xs text-black font-medium line-clamp-1">
{data?.user?.name ?? 'User'} {data?.user?.name ?? 'User'}
</div> </div>
</div> </div>
@ -47,7 +47,7 @@
<div class="ml-2"> <div class="ml-2">
<div class=" flex justify-between items-center"> <div class=" flex justify-between items-center">
<div class="text-xs text-black dark:text-white font-medium line-clamp-1"> <div class="text-xs text-black font-medium line-clamp-1">
{data?.model?.name ?? data?.message?.model ?? 'Assistant'} {data?.model?.name ?? data?.message?.model ?? 'Assistant'}
</div> </div>

4
src/lib/components/chat/Placeholder.svelte

@ -102,7 +102,7 @@
{/if} {/if}
<div <div
class="w-full text-3xl text-gray-800 dark:text-gray-100 font-medium text-center flex items-center gap-4 font-primary" class="w-full text-3xl text-gray-800 font-medium text-center flex items-center gap-4 font-primary"
> >
<div class="w-full flex flex-col justify-center items-center"> <div class="w-full flex flex-col justify-center items-center">
<div class="flex flex-row justify-center gap-3 @sm:gap-3.5 w-fit px-5"> <div class="flex flex-row justify-center gap-3 @sm:gap-3.5 w-fit px-5">
@ -124,7 +124,7 @@
placement="top" placement="top"
> >
<div <div
class="mt-0.5 px-2 text-sm font-normal text-gray-500 dark:text-gray-400 line-clamp-2 max-w-xl markdown" class="mt-0.5 px-2 text-sm font-normal text-gray-500 line-clamp-2 max-w-xl markdown"
> >
{@html marked.parse( {@html marked.parse(
sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description) sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)

14
src/lib/components/chat/Settings/About.svelte

@ -52,7 +52,7 @@
</div> </div>
</div> </div>
<div class="flex w-full justify-between items-center"> <div class="flex w-full justify-between items-center">
<div class="flex flex-col text-xs text-gray-700 dark:text-gray-200"> <div class="flex flex-col text-xs text-gray-700 ">
<div class="flex gap-1"> <div class="flex gap-1">
<Tooltip content={WEBUI_BUILD_HASH}> <Tooltip content={WEBUI_BUILD_HASH}>
v{WEBUI_VERSION} v{WEBUI_VERSION}
@ -81,7 +81,7 @@
</div> </div>
<button <button
class=" text-xs px-3 py-1.5 bg-gray-100 hover:bg-gray-200 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-lg font-medium" class=" text-xs px-3 py-1.5 bg-gray-100 hover:bg-gray-200 transition rounded-lg font-medium"
on:click={() => { on:click={() => {
checkForVersionUpdates(); checkForVersionUpdates();
}} }}
@ -92,19 +92,19 @@
</div> </div>
{#if ollamaVersion} {#if ollamaVersion}
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div> <div>
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Ollama Version')}</div> <div class=" mb-2.5 text-sm font-medium">{$i18n.t('Ollama Version')}</div>
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1 text-xs text-gray-700 dark:text-gray-200"> <div class="flex-1 text-xs text-gray-700 ">
{ollamaVersion ?? 'N/A'} {ollamaVersion ?? 'N/A'}
</div> </div>
</div> </div>
</div> </div>
{/if} {/if}
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500"> <div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
Emoji graphics provided by Emoji graphics provided by
@ -173,11 +173,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500"> <div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
{#if !$WEBUI_NAME.includes('Open WebUI')} {#if !$WEBUI_NAME.includes('Open WebUI')}
<span class=" text-gray-500 dark:text-gray-300 font-medium">{$WEBUI_NAME}</span> - <span class=" text-gray-500 font-medium">{$WEBUI_NAME}</span> -
{/if} {/if}
{$i18n.t('Created by')} {$i18n.t('Created by')}
<a <a
class=" text-gray-500 dark:text-gray-300 font-medium" class=" text-gray-500 font-medium"
href="https://github.com/tjbck" href="https://github.com/tjbck"
target="_blank">Timothy J. Baek</a target="_blank">Timothy J. Baek</a
> >

22
src/lib/components/chat/Settings/Account.svelte

@ -194,7 +194,7 @@
<div> <div>
<button <button
class=" text-xs text-center text-gray-800 dark:text-gray-400 rounded-full px-4 py-0.5 bg-gray-100 dark:bg-gray-850" class=" text-xs text-center text-gray-800 rounded-full px-4 py-0.5 bg-gray-100 "
on:click={async () => { on:click={async () => {
if (canvasPixelTest()) { if (canvasPixelTest()) {
profileImageUrl = generateInitialsImage(name); profileImageUrl = generateInitialsImage(name);
@ -212,7 +212,7 @@
> >
<button <button
class=" text-xs text-center text-gray-800 dark:text-gray-400 rounded-full px-4 py-0.5 bg-gray-100 dark:bg-gray-850" class=" text-xs text-center text-gray-800 rounded-full px-4 py-0.5 bg-gray-100 "
on:click={async () => { on:click={async () => {
const url = await getGravatarUrl(localStorage.token, $user.email); const url = await getGravatarUrl(localStorage.token, $user.email);
@ -221,7 +221,7 @@
> >
<button <button
class=" text-xs text-center text-gray-800 dark:text-gray-400 rounded-lg px-2 py-1" class=" text-xs text-center text-gray-800 rounded-lg px-2 py-1"
on:click={async () => { on:click={async () => {
profileImageUrl = '/user.png'; profileImageUrl = '/user.png';
}}>{$i18n.t('Remove')}</button }}>{$i18n.t('Remove')}</button
@ -236,7 +236,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm outline-hidden"
type="text" type="text"
bind:value={name} bind:value={name}
required required
@ -251,7 +251,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm outline-hidden"
type="url" type="url"
placeholder={$i18n.t('Enter your webhook URL')} placeholder={$i18n.t('Enter your webhook URL')}
bind:value={webhookUrl} bind:value={webhookUrl}
@ -266,7 +266,7 @@
<UpdatePassword /> <UpdatePassword />
</div> </div>
<hr class="border-gray-100 dark:border-gray-850 my-4" /> <hr class="border-gray-100 my-4" />
<div class="flex justify-between items-center text-sm"> <div class="flex justify-between items-center text-sm">
<div class=" font-medium">{$i18n.t('API keys')}</div> <div class=" font-medium">{$i18n.t('API keys')}</div>
@ -290,7 +290,7 @@
<SensitiveInput value={localStorage.token} readOnly={true} /> <SensitiveInput value={localStorage.token} readOnly={true} />
<button <button
class="ml-1.5 px-1.5 py-1 dark:hover:bg-gray-850 transition rounded-lg" class="ml-1.5 px-1.5 py-1 transition rounded-lg"
on:click={() => { on:click={() => {
copyToClipboard(localStorage.token); copyToClipboard(localStorage.token);
JWTTokenCopied = true; JWTTokenCopied = true;
@ -344,7 +344,7 @@
<SensitiveInput value={APIKey} readOnly={true} /> <SensitiveInput value={APIKey} readOnly={true} />
<button <button
class="ml-1.5 px-1.5 py-1 dark:hover:bg-gray-850 transition rounded-lg" class="ml-1.5 px-1.5 py-1 transition rounded-lg"
on:click={() => { on:click={() => {
copyToClipboard(APIKey); copyToClipboard(APIKey);
APIKeyCopied = true; APIKeyCopied = true;
@ -389,7 +389,7 @@
<Tooltip content={$i18n.t('Create new key')}> <Tooltip content={$i18n.t('Create new key')}>
<button <button
class=" px-1.5 py-1 dark:hover:bg-gray-850transition rounded-lg" class=" px-1.5 py-1 transition rounded-lg"
on:click={() => { on:click={() => {
createAPIKeyHandler(); createAPIKeyHandler();
}} }}
@ -412,7 +412,7 @@
</Tooltip> </Tooltip>
{:else} {:else}
<button <button
class="flex gap-1.5 items-center font-medium px-3.5 py-1.5 rounded-lg bg-gray-100/70 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-850 transition" class="flex gap-1.5 items-center font-medium px-3.5 py-1.5 rounded-lg bg-gray-100/70 hover:bg-gray-100 transition"
on:click={() => { on:click={() => {
createAPIKeyHandler(); createAPIKeyHandler();
}} }}
@ -431,7 +431,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
on:click={async () => { on:click={async () => {
const res = await submitHandler(); const res = await submitHandler();

8
src/lib/components/chat/Settings/Account/UpdatePassword.svelte

@ -60,7 +60,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full bg-transparent dark:text-gray-300 outline-hidden placeholder:opacity-30" class="w-full bg-transparent outline-hidden placeholder:opacity-30"
type="password" type="password"
bind:value={currentPassword} bind:value={currentPassword}
placeholder={$i18n.t('Enter your current password')} placeholder={$i18n.t('Enter your current password')}
@ -75,7 +75,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full bg-transparent text-sm dark:text-gray-300 outline-hidden placeholder:opacity-30" class="w-full bg-transparent text-sm outline-hidden placeholder:opacity-30"
type="password" type="password"
bind:value={newPassword} bind:value={newPassword}
placeholder={$i18n.t('Enter your new password')} placeholder={$i18n.t('Enter your new password')}
@ -90,7 +90,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
class="w-full bg-transparent text-sm dark:text-gray-300 outline-hidden placeholder:opacity-30" class="w-full bg-transparent text-sm outline-hidden placeholder:opacity-30"
type="password" type="password"
bind:value={newPasswordConfirm} bind:value={newPasswordConfirm}
placeholder={$i18n.t('Confirm your new password')} placeholder={$i18n.t('Confirm your new password')}
@ -103,7 +103,7 @@
<div class="mt-3 flex justify-end"> <div class="mt-3 flex justify-end">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
> >
{$i18n.t('Update password')} {$i18n.t('Update password')}
</button> </button>

6
src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte

@ -144,7 +144,7 @@
<div class="flex mt-0.5 space-x-2"> <div class="flex mt-0.5 space-x-2">
<div class=" flex-1"> <div class=" flex-1">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm outline-hidden"
type="number" type="number"
placeholder={$i18n.t('Enter Seed')} placeholder={$i18n.t('Enter Seed')}
bind:value={params.seed} bind:value={params.seed}
@ -189,7 +189,7 @@
<div class="flex mt-0.5 space-x-2"> <div class="flex mt-0.5 space-x-2">
<div class=" flex-1"> <div class=" flex-1">
<input <input
class="w-full rounded-lg py-2 px-1 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-1 text-sm outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter stop sequence')} placeholder={$i18n.t('Enter stop sequence')}
bind:value={params.stop} bind:value={params.stop}
@ -287,7 +287,7 @@
<div class="flex mt-0.5 space-x-2"> <div class="flex mt-0.5 space-x-2">
<div class=" flex-1"> <div class=" flex-1">
<input <input
class="w-full rounded-lg py-2 px-1 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-1 text-sm outline-hidden"
type="text" type="text"
placeholder={$i18n.t('Enter reasoning effort')} placeholder={$i18n.t('Enter reasoning effort')}
bind:value={params.reasoning_effort} bind:value={params.reasoning_effort}

10
src/lib/components/chat/Settings/Audio.svelte

@ -283,7 +283,7 @@
</div> </div>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
{#if TTSEngine === 'browser-kokoro'} {#if TTSEngine === 'browser-kokoro'}
{#if TTSModel} {#if TTSModel}
@ -293,7 +293,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="voice-list" list="voice-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-white dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-white outline-hidden"
bind:value={voice} bind:value={voice}
placeholder="Select a voice" placeholder="Select a voice"
/> />
@ -330,7 +330,7 @@
<div class="flex w-full"> <div class="flex w-full">
<div class="flex-1"> <div class="flex-1">
<select <select
class="w-full rounded-lg py-2 px-4 text-sm bg-white dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-white outline-hidden"
bind:value={voice} bind:value={voice}
> >
<option value="" selected={voice !== ''}>{$i18n.t('Default')}</option> <option value="" selected={voice !== ''}>{$i18n.t('Default')}</option>
@ -361,7 +361,7 @@
<div class="flex-1"> <div class="flex-1">
<input <input
list="voice-list" list="voice-list"
class="w-full rounded-lg py-2 px-4 text-sm bg-white dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm bg-white outline-hidden"
bind:value={voice} bind:value={voice}
placeholder="Select a voice" placeholder="Select a voice"
/> />
@ -379,7 +379,7 @@
<div class="flex justify-end text-sm font-medium"> <div class="flex justify-end text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

10
src/lib/components/chat/Settings/Chats.svelte

@ -109,7 +109,7 @@
hidden hidden
/> />
<button <button
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
chatImportInputElement.click(); chatImportInputElement.click();
}} }}
@ -131,7 +131,7 @@
<div class=" self-center text-sm font-medium">{$i18n.t('Import Chats')}</div> <div class=" self-center text-sm font-medium">{$i18n.t('Import Chats')}</div>
</button> </button>
<button <button
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
exportChats(); exportChats();
}} }}
@ -154,7 +154,7 @@
</button> </button>
</div> </div>
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class="flex flex-col"> <div class="flex flex-col">
{#if showArchiveConfirm} {#if showArchiveConfirm}
@ -218,7 +218,7 @@
</div> </div>
{:else} {:else}
<button <button
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
showArchiveConfirm = true; showArchiveConfirm = true;
}} }}
@ -305,7 +305,7 @@
</div> </div>
{:else} {:else}
<button <button
class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 dark:hover:bg-gray-800 transition" class=" flex rounded-md py-2 px-3.5 w-full hover:bg-gray-200 transition"
on:click={() => { on:click={() => {
showDeleteConfirm = true; showDeleteConfirm = true;
}} }}

2
src/lib/components/chat/Settings/Connections.svelte

@ -147,7 +147,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

2
src/lib/components/chat/Settings/Connections/Connection.svelte

@ -71,7 +71,7 @@
<div class="flex gap-1"> <div class="flex gap-1">
<Tooltip content={$i18n.t('Configure')} className="self-start"> <Tooltip content={$i18n.t('Configure')} className="self-start">
<button <button
class="self-center p-1 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg transition" class="self-center p-1 bg-transparent hover:bg-gray-100 rounded-lg transition"
on:click={() => { on:click={() => {
showConfigModal = true; showConfigModal = true;
}} }}

10
src/lib/components/chat/Settings/General.svelte

@ -239,13 +239,13 @@
</div> </div>
{#if $user.role === 'admin' || $user?.permissions.chat?.controls} {#if $user.role === 'admin' || $user?.permissions.chat?.controls}
<hr class="border-gray-100 dark:border-gray-850 my-3" /> <hr class="border-gray-100 my-3" />
<div> <div>
<div class=" my-2.5 text-sm font-medium">{$i18n.t('System Prompt')}</div> <div class=" my-2.5 text-sm font-medium">{$i18n.t('System Prompt')}</div>
<textarea <textarea
bind:value={system} bind:value={system}
class="w-full rounded-lg p-4 text-sm bg-white dark:text-gray-300 dark:bg-gray-850 outline-hidden resize-none" class="w-full rounded-lg p-4 text-sm bg-white outline-hidden resize-none"
rows="4" rows="4"
/> />
</div> </div>
@ -264,7 +264,7 @@
{#if showAdvanced} {#if showAdvanced}
<AdvancedParams admin={$user?.role === 'admin'} bind:params /> <AdvancedParams admin={$user?.role === 'admin'} bind:params />
<hr class=" border-gray-100 dark:border-gray-850" /> <hr class=" border-gray-100 " />
<div class=" py-1 w-full justify-between"> <div class=" py-1 w-full justify-between">
<div class="flex w-full justify-between"> <div class="flex w-full justify-between">
@ -288,7 +288,7 @@
{#if keepAlive !== null} {#if keepAlive !== null}
<div class="flex mt-1 space-x-2"> <div class="flex mt-1 space-x-2">
<input <input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-hidden" class="w-full rounded-lg py-2 px-4 text-sm outline-hidden"
type="text" type="text"
placeholder={$i18n.t("e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.")} placeholder={$i18n.t("e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.")}
bind:value={keepAlive} bind:value={keepAlive}
@ -332,7 +332,7 @@
<div class="flex justify-end pt-3 text-sm font-medium"> <div class="flex justify-end pt-3 text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
on:click={() => { on:click={() => {
saveSettings({ saveSettings({
system: system !== '' ? system : undefined, system: system !== '' ? system : undefined,

2
src/lib/components/chat/Settings/Interface.svelte

@ -787,7 +787,7 @@
<div class="flex justify-end text-sm font-medium"> <div class="flex justify-end text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

4
src/lib/components/chat/Settings/Personalization.svelte

@ -57,7 +57,7 @@
</div> </div>
</div> </div>
<div class="text-xs text-gray-600 dark:text-gray-400"> <div class="text-xs text-gray-600 ">
<div> <div>
{$i18n.t( {$i18n.t(
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you." "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you."
@ -89,7 +89,7 @@
<div class="flex justify-end text-sm font-medium"> <div class="flex justify-end text-sm font-medium">
<button <button
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="submit" type="submit"
> >
{$i18n.t('Save')} {$i18n.t('Save')}

4
src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte

@ -36,7 +36,7 @@
<Modal bind:show size="sm"> <Modal bind:show size="sm">
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center"> <div class=" text-lg font-medium self-center">
{$i18n.t('Add Memory')} {$i18n.t('Add Memory')}
</div> </div>
@ -59,7 +59,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"

4
src/lib/components/chat/Settings/Personalization/EditMemoryModal.svelte

@ -46,7 +46,7 @@
<Modal bind:show size="sm"> <Modal bind:show size="sm">
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2"> <div class=" flex justify-between px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center"> <div class=" text-lg font-medium self-center">
{$i18n.t('Edit Memory')} {$i18n.t('Edit Memory')}
</div> </div>
@ -69,7 +69,7 @@
</button> </button>
</div> </div>
<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200"> <div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 ">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<form <form
class="flex flex-col w-full" class="flex flex-col w-full"

10
src/lib/components/chat/Settings/Personalization/ManageModal.svelte

@ -36,7 +36,7 @@
<Modal size="xl" bind:show> <Modal size="xl" bind:show>
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-1"> <div class=" flex justify-between px-5 pt-4 pb-1">
<div class=" text-lg font-medium self-center">{$i18n.t('Memory')}</div> <div class=" text-lg font-medium self-center">{$i18n.t('Memory')}</div>
<button <button
class="self-center" class="self-center"
@ -57,16 +57,16 @@
</button> </button>
</div> </div>
<div class="flex flex-col w-full px-5 pb-5 dark:text-gray-200"> <div class="flex flex-col w-full px-5 pb-5 ">
<div <div
class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6 h-[28rem] max-h-screen outline outline-1 rounded-xl outline-gray-100 dark:outline-gray-800 mb-4 mt-1" class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6 h-[28rem] max-h-screen outline outline-1 rounded-xl outline-gray-100 dark:outline-gray-800 mb-4 mt-1"
> >
{#if memories.length > 0} {#if memories.length > 0}
<div class="text-left text-sm w-full mb-4 overflow-y-scroll"> <div class="text-left text-sm w-full mb-4 overflow-y-scroll">
<div class="relative overflow-x-auto"> <div class="relative overflow-x-auto">
<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto"> <table class="w-full text-sm text-left text-gray-600 table-auto">
<thead <thead
class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-850" class="text-xs text-gray-700 uppercase bg-transparent border-b-2 "
> >
<tr> <tr>
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th> <th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
@ -78,7 +78,7 @@
</thead> </thead>
<tbody> <tbody>
{#each memories as memory} {#each memories as memory}
<tr class="border-b dark:border-gray-850 items-center"> <tr class="border-b items-center">
<td class="px-3 py-1"> <td class="px-3 py-1">
<div class="line-clamp-1"> <div class="line-clamp-1">
{memory.content} {memory.content}

8
src/lib/components/chat/SettingsModal.svelte

@ -363,8 +363,8 @@
</script> </script>
<Modal size="xl" bind:show> <Modal size="xl" bind:show>
<div class="text-gray-700 dark:text-gray-100"> <div class="text-gray-700 ">
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-1"> <div class=" flex justify-between px-5 pt-4 pb-1">
<div class=" text-lg font-medium self-center">{$i18n.t('Settings')}</div> <div class=" text-lg font-medium self-center">{$i18n.t('Settings')}</div>
<button <button
class="self-center" class="self-center"
@ -388,14 +388,14 @@
<div class="flex flex-col md:flex-row w-full px-4 pt-1 pb-4 md:space-x-4"> <div class="flex flex-col md:flex-row w-full px-4 pt-1 pb-4 md:space-x-4">
<div <div
id="settings-tabs-container" id="settings-tabs-container"
class="tabs flex flex-row overflow-x-auto gap-2.5 md:gap-1 md:flex-col flex-1 md:flex-none md:w-40 dark:text-gray-200 text-sm font-medium text-left mb-1 md:mb-0 -translate-y-1" class="tabs flex flex-row overflow-x-auto gap-2.5 md:gap-1 md:flex-col flex-1 md:flex-none md:w-40 text-sm font-medium text-left mb-1 md:mb-0 -translate-y-1"
> >
<div class="hidden md:flex w-full rounded-xl -mb-1 px-0.5 gap-2" id="settings-search"> <div class="hidden md:flex w-full rounded-xl -mb-1 px-0.5 gap-2" id="settings-search">
<div class="self-center rounded-l-xl bg-transparent"> <div class="self-center rounded-l-xl bg-transparent">
<Search className="size-3.5" /> <Search className="size-3.5" />
</div> </div>
<input <input
class="w-full py-1.5 text-sm bg-transparent dark:text-gray-300 outline-hidden" class="w-full py-1.5 text-sm bg-transparent outline-hidden"
bind:value={search} bind:value={search}
on:input={searchDebounceHandler} on:input={searchDebounceHandler}
placeholder={$i18n.t('Search')} placeholder={$i18n.t('Search')}

8
src/lib/components/chat/ShareChatModal.svelte

@ -82,7 +82,7 @@
<Modal bind:show size="md"> <Modal bind:show size="md">
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-0.5"> <div class=" flex justify-between px-5 pt-4 pb-0.5">
<div class=" text-lg font-medium self-center">{$i18n.t('Share Chat')}</div> <div class=" text-lg font-medium self-center">{$i18n.t('Share Chat')}</div>
<button <button
class="self-center" class="self-center"
@ -105,7 +105,7 @@
{#if chat} {#if chat}
<div class="px-5 pt-4 pb-5 w-full flex flex-col justify-center"> <div class="px-5 pt-4 pb-5 w-full flex flex-col justify-center">
<div class=" text-sm dark:text-gray-300 mb-1"> <div class=" text-sm mb-1">
{#if chat.share_id} {#if chat.share_id}
<a href="/s/{chat.share_id}" target="_blank" <a href="/s/{chat.share_id}" target="_blank"
>{$i18n.t('You have shared this chat')} >{$i18n.t('You have shared this chat')}
@ -136,7 +136,7 @@
<div class="flex gap-1"> <div class="flex gap-1">
{#if $config?.features.enable_community_sharing} {#if $config?.features.enable_community_sharing}
<button <button
class="self-center flex items-center gap-1 px-3.5 py-2 text-sm font-medium bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:text-white dark:hover:bg-gray-800 transition rounded-full" class="self-center flex items-center gap-1 px-3.5 py-2 text-sm font-medium bg-gray-100 hover:bg-gray-200 text-gray-800 transition rounded-full"
type="button" type="button"
on:click={() => { on:click={() => {
shareChat(); shareChat();
@ -148,7 +148,7 @@
{/if} {/if}
<button <button
class="self-center flex items-center gap-1 px-3.5 py-2 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full" class="self-center flex items-center gap-1 px-3.5 py-2 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black transition rounded-full"
type="button" type="button"
id="copy-and-share-chat-button" id="copy-and-share-chat-button"
on:click={async () => { on:click={async () => {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save