| <script lang="ts"> |
| import { DropdownMenu } from 'bits-ui'; |
| import { flyAndScale } from '$lib/utils/transitions'; |
| import { getContext } from 'svelte'; |
| |
| import Dropdown from '$lib/components/common/Dropdown.svelte'; |
| import LineSpace from '$lib/components/icons/LineSpace.svelte'; |
| import LineSpaceSmaller from '$lib/components/icons/LineSpaceSmaller.svelte'; |
| |
| const i18n = getContext('i18n'); |
| |
| export let onRegenerate: Function = (prompt = null) => {}; |
| export let onClose: Function = () => {}; |
| |
| let show = false; |
| let inputValue = ''; |
| </script> |
|
|
| <Dropdown |
| bind:show |
| on:change={(e) => { |
| if (e.detail === false) { |
| onClose(); |
| } |
| }} |
| align="end" |
| > |
| <slot></slot> |
|
|
| <div slot="content"> |
| <DropdownMenu.Content |
| class="w-full max-w-[200px] rounded-2xl px-1 py-1 border border-gray-100 dark:border-gray-800 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg transition" |
| sideOffset={-2} |
| side="bottom" |
| align="start" |
| transition={flyAndScale} |
| > |
| <div class="py-1.5 px-2.5 flex dark:text-gray-100"> |
| <input |
| type="text" |
| id="floating-message-input" |
| class="bg-transparent outline-hidden w-full flex-1 text-sm" |
| placeholder={$i18n.t('Suggest a change')} |
| bind:value={inputValue} |
| autocomplete="off" |
| on:keydown={(e) => { |
| if (e.key === 'Enter') { |
| onRegenerate(inputValue); |
| show = false; |
| } |
| }} |
| /> |
| |
| <div class="ml-2 self-center flex items-center"> |
| <button |
| class="{inputValue !== '' |
| ? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 ' |
| : 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1 self-center" |
| on:click={() => { |
| onRegenerate(inputValue); |
| show = false; |
| }} |
| > |
| <svg |
| xmlns="http://www.w3.org/2000/svg" |
| viewBox="0 0 16 16" |
| fill="currentColor" |
| class="size-3.5" |
| > |
| <path |
| fill-rule="evenodd" |
| d="M8 14a.75.75 0 0 1-.75-.75V4.56L4.03 7.78a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.75 4.56v8.69A.75.75 0 0 1 8 14Z" |
| clip-rule="evenodd" |
| /> |
| </svg> |
| </button> |
| </div> |
| </div> |
| <hr class="border-gray-50/30 dark:border-gray-800/30 my-1 mx-2" /> |
| <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-xl" |
| on:click={() => { |
| onRegenerate(); |
| show = false; |
| }} |
| > |
| <svg |
| xmlns="http://www.w3.org/2000/svg" |
| fill="none" |
| viewBox="0 0 24 24" |
| stroke-width="2" |
| aria-hidden="true" |
| stroke="currentColor" |
| class="w-4 h-4" |
| > |
| <path |
| stroke-linecap="round" |
| stroke-linejoin="round" |
| d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99" |
| /> |
| </svg> |
| <div class="flex items-center">{$i18n.t('Try Again')}</div> |
| </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-xl" |
| on:click={() => { |
| onRegenerate($i18n.t('Add Details')); |
| }} |
| > |
| <LineSpace strokeWidth="2" /> |
| <div class="flex items-center">{$i18n.t('Add Details')}</div> |
| </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-xl" |
| on:click={() => { |
| onRegenerate($i18n.t('More Concise')); |
| }} |
| > |
| <LineSpaceSmaller strokeWidth="2" /> |
| <div class="flex items-center">{$i18n.t('More Concise')}</div> |
| </DropdownMenu.Item> |
| </DropdownMenu.Content> |
| </div> |
| </Dropdown> |
|
|