Message.svelte 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <script lang="ts">
  2. import { onMount, getContext } from 'svelte';
  3. const i18n = getContext('i18n');
  4. export let message;
  5. export let idx;
  6. export let onDelete;
  7. let textAreaElement: HTMLTextAreaElement;
  8. onMount(() => {
  9. textAreaElement.style.height = '';
  10. textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
  11. });
  12. </script>
  13. <div class="flex gap-2 group">
  14. <div class="flex items-start pt-1">
  15. <div
  16. class="px-2 py-1 text-sm font-semibold uppercase min-w-[6rem] text-left rounded-lg transition"
  17. >
  18. {$i18n.t(message.role)}
  19. </div>
  20. </div>
  21. <div class="flex-1">
  22. <!-- $i18n.t('a user') -->
  23. <!-- $i18n.t('an assistant') -->
  24. <textarea
  25. id="{message.role}-{idx}-textarea"
  26. bind:this={textAreaElement}
  27. class="w-full bg-transparent outline-none rounded-lg p-2 text-sm resize-none overflow-hidden"
  28. placeholder={$i18n.t(`Enter {{role}} message here`, {
  29. role: message.role === 'user' ? $i18n.t('a user') : $i18n.t('an assistant')
  30. })}
  31. rows="1"
  32. on:input={(e) => {
  33. textAreaElement.style.height = '';
  34. textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
  35. }}
  36. on:focus={(e) => {
  37. textAreaElement.style.height = '';
  38. textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
  39. // e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
  40. }}
  41. bind:value={message.content}
  42. />
  43. </div>
  44. <div class=" pt-1">
  45. <button
  46. class=" group-hover:text-gray-500 dark:text-gray-900 dark:hover:text-gray-300 transition"
  47. on:click={() => {
  48. onDelete();
  49. }}
  50. >
  51. <svg
  52. xmlns="http://www.w3.org/2000/svg"
  53. fill="none"
  54. viewBox="0 0 24 24"
  55. stroke-width="2"
  56. stroke="currentColor"
  57. class="w-5 h-5"
  58. >
  59. <path
  60. stroke-linecap="round"
  61. stroke-linejoin="round"
  62. d="M15 12H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
  63. />
  64. </svg>
  65. </button>
  66. </div>
  67. </div>