Placeholder.svelte 3.2 KB

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