Modal.svelte 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <script lang="ts">
  2. import { onMount } from 'svelte';
  3. import { fade, blur } from 'svelte/transition';
  4. export let show = true;
  5. export let size = 'md';
  6. let mounted = false;
  7. const sizeToWidth = (size) => {
  8. if (size === 'sm') {
  9. return 'w-[30rem]';
  10. } else {
  11. return 'w-[40rem]';
  12. }
  13. };
  14. onMount(() => {
  15. mounted = true;
  16. });
  17. $: if (mounted) {
  18. if (show) {
  19. document.body.style.overflow = 'hidden';
  20. } else {
  21. document.body.style.overflow = 'unset';
  22. }
  23. }
  24. </script>
  25. {#if show}
  26. <!-- svelte-ignore a11y-click-events-have-key-events -->
  27. <!-- svelte-ignore a11y-no-static-element-interactions -->
  28. <div
  29. class="fixed top-0 right-0 left-0 bottom-0 bg-stone-900/50 w-full min-h-screen h-screen flex justify-center z-50 overflow-hidden overscroll-contain"
  30. on:click={() => {
  31. show = false;
  32. }}
  33. >
  34. <div
  35. class="m-auto rounded-xl max-w-full {sizeToWidth(
  36. size
  37. )} mx-2 bg-gray-50 dark:bg-gray-900 shadow-3xl"
  38. transition:fade={{ delay: 100, duration: 200 }}
  39. on:click={(e) => {
  40. e.stopPropagation();
  41. }}
  42. >
  43. <slot />
  44. </div>
  45. </div>
  46. {/if}