Mask.svelte 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <script>
  2. import { fade } from 'svelte/transition';
  3. /** @typedef {import('../../index.d').Mask} MaskProps */
  4. /** @type {MaskProps} */
  5. let {
  6. visible = false,
  7. opacity = '0.5',
  8. clickable = false,
  9. inverse = false,
  10. backdropBlur = 'none',
  11. duration = 150,
  12. outDuration = 0,
  13. zIndex = 500,
  14. children,
  15. onclickMask,
  16. } = $props();
  17. //遮罩模糊度样式
  18. // Mask blur style
  19. const backdropBlurClass = {
  20. none: '',
  21. sm: ' backdrop-blur-sm',
  22. base: ' backdrop-blur',
  23. md: ' backdrop-blur-md',
  24. lg: ' backdrop-blur-lg',
  25. xl: ' backdrop-blur-xl',
  26. '2xl': ' backdrop-blur-2xl',
  27. '3xl': ' backdrop-blur-3xl',
  28. };
  29. // 遮罩背景色
  30. // Mask background color
  31. const bgClass = {
  32. '0': ' bg-transparent',
  33. '0.1': ' bg-black/10 dark:bg-white/10',
  34. '0.2': ' bg-black/20 dark:bg-white/20',
  35. '0.3': ' bg-black/30 dark:bg-white/30',
  36. '0.4': ' bg-black/40 dark:bg-white/40',
  37. '0.5': ' bg-black/50 dark:bg-white/50',
  38. '0.6': ' bg-black/60 dark:bg-white/60',
  39. '0.7': ' bg-black/70 dark:bg-white/70',
  40. '0.8': ' bg-black/80 dark:bg-white/80',
  41. '0.9': ' bg-black/90 dark:bg-white/90',
  42. '1': ' bg-black dark:bg-white',
  43. };
  44. // 遮罩背景色反色
  45. // Mask background color reverse color
  46. const bgClassInverse = {
  47. '0': ' bg-transparent',
  48. '0.1': ' bg-white/10 dark:bg-black/10',
  49. '0.2': ' bg-white/20 dark:bg-black/20',
  50. '0.3': ' bg-white/30 dark:bg-black/30',
  51. '0.4': ' bg-white/40 dark:bg-black/40',
  52. '0.5': ' bg-white/50 dark:bg-black/50',
  53. '0.6': ' bg-white/60 dark:bg-black/60',
  54. '0.7': ' bg-white/70 dark:bg-black/70',
  55. '0.8': ' bg-white/80 dark:bg-black/80',
  56. '0.9': ' bg-white/90 dark:bg-black/90',
  57. '1': ' bg-white dark:bg-black',
  58. };
  59. </script>
  60. {#if visible}
  61. <button
  62. in:fade|global={{ duration }}
  63. out:fade|global={{ duration: outDuration }}
  64. onclick={() => onclickMask && onclickMask?.()}
  65. class="fixed w-screen h-screen inset-0{inverse
  66. ? bgClassInverse[opacity] || bgClassInverse['0.5']
  67. : bgClass[opacity] || bgClass['0.5']}{clickable ? ' pointer-events-none' : ''}{backdropBlurClass[backdropBlur] ||
  68. backdropBlurClass['none']}"
  69. style="z-index:{zIndex}"
  70. >
  71. {@render children?.()}
  72. </button>
  73. {/if}