Transition.svelte 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <script lang="ts">
  2. import type { Snippet } from 'svelte';
  3. import { fly, scale } from 'svelte/transition';
  4. type Props = {
  5. visible?: boolean;
  6. size?: number;
  7. transitionParams?: any;
  8. transitionOutParams?: any;
  9. position?: string;
  10. px?: string;
  11. py?: string;
  12. children?: Snippet;
  13. };
  14. let {
  15. visible = false,
  16. size = 40,
  17. transitionParams = {},
  18. transitionOutParams = {},
  19. position = 'bottom',
  20. px = '0',
  21. py = '0',
  22. children,
  23. }: Props = $props();
  24. const sizeClass = { bottom: 'w-full', top: 'w-full', left: 'h-full', right: 'h-full', center: 'w-full' };
  25. const sizeStyle = {
  26. bottom: `height:${size === 0 ? 'auto' : size + '%'}`,
  27. top: `height:${size === 0 ? 'auto' : size + '%'}`,
  28. left: `width:${size === 0 ? 'auto' : size + '%'}`,
  29. right: `width:${size === 0 ? 'auto' : size + '%'}`,
  30. center: `height:${size === 0 ? 'auto' : size + '%'}`,
  31. };
  32. const pxClass = {
  33. '0': ' px-0',
  34. '1': ' px-1',
  35. '2': ' px-2',
  36. '3': ' px-3',
  37. '4': ' px-4',
  38. '5': ' px-5',
  39. '6': ' px-6',
  40. '8': ' px-8',
  41. '10': ' px-10',
  42. '12': ' px-12',
  43. '16': ' px-16',
  44. '20': ' px-20',
  45. };
  46. const pyClass = {
  47. '0': ' py-0',
  48. '1': ' py-1',
  49. '2': ' py-2',
  50. '3': ' py-3',
  51. '4': ' py-4',
  52. '5': ' py-5',
  53. '6': ' py-6',
  54. '8': ' py-8',
  55. '10': ' py-10',
  56. '12': ' py-12',
  57. '16': ' py-16',
  58. '24': ' py-24',
  59. '32': ' py-32',
  60. '48': ' py-48',
  61. '64': ' py-64',
  62. };
  63. </script>
  64. {#if visible}
  65. {#if position === 'center'}
  66. <div
  67. out:scale|global={transitionOutParams}
  68. in:scale|global={transitionParams}
  69. class="{sizeClass[position] || sizeClass['bottom']}{pxClass[px] || pxClass['0']}{pyClass[py] || pyClass['0']} pointer-events-auto"
  70. style={sizeStyle[position] || sizeStyle['bottom']}
  71. >
  72. {@render children?.()}
  73. </div>
  74. {:else}
  75. <div
  76. in:fly|global={transitionParams}
  77. out:fly|global={transitionOutParams}
  78. class="{sizeClass[position] || sizeClass['bottom']}{pxClass[px] || pxClass['0']}{pyClass[py] || pyClass['0']} pointer-events-auto"
  79. style={sizeStyle[position] || sizeStyle['bottom']}
  80. >
  81. {@render children?.()}
  82. </div>
  83. {/if}
  84. {/if}