RecordMenu.svelte 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <script lang="ts">
  2. import { DropdownMenu } from 'bits-ui';
  3. import { createEventDispatcher, getContext, onMount } from 'svelte';
  4. import { showSettings, mobile, showSidebar, user } from '$lib/stores';
  5. import { fade, slide } from 'svelte/transition';
  6. import Mic from '../icons/Mic.svelte';
  7. import CursorArrowRays from '../icons/CursorArrowRays.svelte';
  8. import DocumentArrowUp from '../icons/DocumentArrowUp.svelte';
  9. import CloudArrowUp from '../icons/CloudArrowUp.svelte';
  10. const i18n = getContext('i18n');
  11. export let show = false;
  12. export let className = 'max-w-[170px]';
  13. export let onRecord = () => {};
  14. export let onCaptureAudio = () => {};
  15. export let onUpload = () => {};
  16. const dispatch = createEventDispatcher();
  17. </script>
  18. <DropdownMenu.Root
  19. bind:open={show}
  20. onOpenChange={(state) => {
  21. dispatch('change', state);
  22. }}
  23. >
  24. <DropdownMenu.Trigger>
  25. <slot />
  26. </DropdownMenu.Trigger>
  27. <slot name="content">
  28. <DropdownMenu.Content
  29. class="w-full {className} text-sm rounded-xl px-1 py-1.5 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg font-primary"
  30. sideOffset={8}
  31. side="bottom"
  32. align="start"
  33. transition={(e) => fade(e, { duration: 100 })}
  34. >
  35. <button
  36. class="flex rounded-md py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
  37. on:click={async () => {
  38. onRecord();
  39. show = false;
  40. }}
  41. >
  42. <div class=" self-center mr-2">
  43. <Mic className="size-5" strokeWidth="1.5" />
  44. </div>
  45. <div class=" self-center truncate">{$i18n.t('Record')}</div>
  46. </button>
  47. <button
  48. class="flex rounded-md py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
  49. on:click={() => {
  50. onCaptureAudio();
  51. show = false;
  52. }}
  53. >
  54. <div class=" self-center mr-2">
  55. <CursorArrowRays className="size-5" strokeWidth="1.5" />
  56. </div>
  57. <div class=" self-center truncate">{$i18n.t('Capture Audio')}</div>
  58. </button>
  59. <button
  60. class="flex rounded-md py-1.5 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
  61. on:click={() => {
  62. onUpload();
  63. show = false;
  64. }}
  65. >
  66. <div class=" self-center mr-2">
  67. <CloudArrowUp className="size-5" strokeWidth="1.5" />
  68. </div>
  69. <div class=" self-center truncate">{$i18n.t('Upload Audio')}</div>
  70. </button>
  71. </DropdownMenu.Content>
  72. </slot>
  73. </DropdownMenu.Root>