Placeholder.svelte 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <script lang="ts">
  2. import { WEBUI_BASE_URL } from '$lib/constants';
  3. import { user } from '$lib/stores';
  4. import { onMount, getContext } from 'svelte';
  5. import { blur, fade } from 'svelte/transition';
  6. import Suggestions from '../MessageInput/Suggestions.svelte';
  7. const i18n = getContext('i18n');
  8. export let models = [];
  9. export let modelfiles = [];
  10. export let submitPrompt;
  11. export let suggestionPrompts;
  12. let mounted = false;
  13. let modelfile = null;
  14. let selectedModelIdx = 0;
  15. $: modelfile =
  16. models[selectedModelIdx] in modelfiles ? modelfiles[models[selectedModelIdx]] : null;
  17. $: if (models.length > 0) {
  18. selectedModelIdx = models.length - 1;
  19. }
  20. onMount(() => {
  21. mounted = true;
  22. });
  23. </script>
  24. {#key mounted}
  25. <div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-16">
  26. <div class="flex justify-start">
  27. <div class="flex -space-x-4 mb-1" in:fade={{ duration: 200 }}>
  28. {#each models as model, modelIdx}
  29. <button
  30. on:click={() => {
  31. selectedModelIdx = modelIdx;
  32. }}
  33. >
  34. {#if model in modelfiles}
  35. <img
  36. src={modelfiles[model]?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`}
  37. alt="modelfile"
  38. class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
  39. draggable="false"
  40. />
  41. {:else}
  42. <img
  43. src={$i18n.language === 'dg-DG'
  44. ? `/doge.png`
  45. : `${WEBUI_BASE_URL}/static/favicon.png`}
  46. class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
  47. alt="logo"
  48. draggable="false"
  49. />
  50. {/if}
  51. </button>
  52. {/each}
  53. </div>
  54. </div>
  55. <div
  56. class=" mt-2 mb-4 text-3xl text-gray-800 dark:text-gray-100 font-semibold text-left flex items-center gap-4"
  57. >
  58. <div>
  59. <div class=" capitalize line-clamp-1" in:fade={{ duration: 200 }}>
  60. {#if modelfile}
  61. {modelfile.title}
  62. {:else}
  63. {$i18n.t('Hello, {{name}}', { name: $user.name })}
  64. {/if}
  65. </div>
  66. <div in:fade={{ duration: 200, delay: 200 }}>
  67. {#if modelfile}
  68. <div class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400">
  69. {modelfile.desc}
  70. </div>
  71. {#if modelfile.user}
  72. <div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
  73. By <a href="https://openwebui.com/m/{modelfile.user.username}"
  74. >{modelfile.user.name ? modelfile.user.name : `@${modelfile.user.username}`}</a
  75. >
  76. </div>
  77. {/if}
  78. {:else}
  79. <div class=" font-medium text-gray-400 dark:text-gray-500">
  80. {$i18n.t('How can I help you today?')}
  81. </div>
  82. {/if}
  83. </div>
  84. </div>
  85. </div>
  86. <div class=" w-full" in:fade={{ duration: 200, delay: 300 }}>
  87. <Suggestions {suggestionPrompts} {submitPrompt} />
  88. </div>
  89. </div>
  90. {/key}