FolderMenu.svelte 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <script lang="ts">
  2. import { DropdownMenu } from 'bits-ui';
  3. import { flyAndScale } from '$lib/utils/transitions';
  4. import { getContext, createEventDispatcher } from 'svelte';
  5. const i18n = getContext('i18n');
  6. const dispatch = createEventDispatcher();
  7. import Dropdown from '$lib/components/common/Dropdown.svelte';
  8. import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
  9. import Pencil from '$lib/components/icons/Pencil.svelte';
  10. import Tooltip from '$lib/components/common/Tooltip.svelte';
  11. import Download from '$lib/components/icons/Download.svelte';
  12. export let align: 'start' | 'end' = 'start';
  13. export let onEdit = () => {};
  14. export let onExport = () => {};
  15. export let onDelete = () => {};
  16. let show = false;
  17. </script>
  18. <Dropdown
  19. bind:show
  20. on:change={(e) => {
  21. if (e.detail === false) {
  22. dispatch('close');
  23. }
  24. }}
  25. >
  26. <Tooltip content={$i18n.t('More')}>
  27. <slot />
  28. </Tooltip>
  29. <div slot="content">
  30. <DropdownMenu.Content
  31. class="w-full max-w-[170px] rounded-lg px-1 py-1.5 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg"
  32. sideOffset={-2}
  33. side="bottom"
  34. {align}
  35. transition={flyAndScale}
  36. >
  37. <DropdownMenu.Item
  38. 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-md"
  39. on:click={() => {
  40. onEdit();
  41. }}
  42. >
  43. <Pencil strokeWidth="2" />
  44. <div class="flex items-center">{$i18n.t('Edit')}</div>
  45. </DropdownMenu.Item>
  46. <DropdownMenu.Item
  47. 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-md"
  48. on:click={() => {
  49. onExport();
  50. }}
  51. >
  52. <Download strokeWidth="2" />
  53. <div class="flex items-center">{$i18n.t('Export')}</div>
  54. </DropdownMenu.Item>
  55. <DropdownMenu.Item
  56. 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-md"
  57. on:click={() => {
  58. onDelete();
  59. }}
  60. >
  61. <GarbageBin strokeWidth="2" />
  62. <div class="flex items-center">{$i18n.t('Delete')}</div>
  63. </DropdownMenu.Item>
  64. </DropdownMenu.Content>
  65. </div>
  66. </Dropdown>