| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | <script lang="ts"> | 
					
						
							|  |  |  | 	import { onMount } from 'svelte'; | 
					
						
							| 
									
										
										
										
											2024-02-22 18:54:55 +08:00
										 |  |  | 	import { fade } from 'svelte/transition'; | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-25 06:43:03 +08:00
										 |  |  | 	import { flyAndScale } from '$lib/utils/transitions'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 	export let show = true; | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | 	export let size = 'md'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-07 15:57:23 +08:00
										 |  |  | 	let modalElement = null; | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 	let mounted = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | 	const sizeToWidth = (size) => { | 
					
						
							| 
									
										
										
										
											2024-01-18 13:01:30 +08:00
										 |  |  | 		if (size === 'xs') { | 
					
						
							|  |  |  | 			return 'w-[16rem]'; | 
					
						
							|  |  |  | 		} else if (size === 'sm') { | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | 			return 'w-[30rem]'; | 
					
						
							| 
									
										
										
										
											2024-04-21 07:24:18 +08:00
										 |  |  | 		} else if (size === 'md') { | 
					
						
							|  |  |  | 			return 'w-[48rem]'; | 
					
						
							| 
									
										
										
										
											2024-05-16 06:55:13 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2024-05-19 15:17:40 +08:00
										 |  |  | 			return 'w-[56rem]'; | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-07 15:57:23 +08:00
										 |  |  | 	const handleKeyDown = (event: KeyboardEvent) => { | 
					
						
							|  |  |  | 		if (event.key === 'Escape') { | 
					
						
							|  |  |  | 			console.log('Escape'); | 
					
						
							|  |  |  | 			show = false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 	onMount(() => { | 
					
						
							|  |  |  | 		mounted = true; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-19 06:39:50 +08:00
										 |  |  | 	$: if (show && modalElement) { | 
					
						
							|  |  |  | 		document.body.appendChild(modalElement); | 
					
						
							|  |  |  | 		window.addEventListener('keydown', handleKeyDown); | 
					
						
							|  |  |  | 		document.body.style.overflow = 'hidden'; | 
					
						
							|  |  |  | 	} else if (modalElement) { | 
					
						
							|  |  |  | 		document.body.removeChild(modalElement); | 
					
						
							|  |  |  | 		window.removeEventListener('keydown', handleKeyDown); | 
					
						
							|  |  |  | 		document.body.style.overflow = 'unset'; | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {#if show} | 
					
						
							|  |  |  | 	<!-- svelte-ignore a11y-click-events-have-key-events --> | 
					
						
							|  |  |  | 	<!-- svelte-ignore a11y-no-static-element-interactions --> | 
					
						
							|  |  |  | 	<div | 
					
						
							| 
									
										
										
										
											2024-04-07 15:57:23 +08:00
										 |  |  | 		bind:this={modalElement} | 
					
						
							| 
									
										
										
										
											2024-04-21 03:40:06 +08:00
										 |  |  | 		class=" fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full min-h-screen h-screen flex justify-center z-[9999] overflow-hidden overscroll-contain" | 
					
						
							| 
									
										
										
										
											2024-02-23 16:47:54 +08:00
										 |  |  | 		in:fade={{ duration: 10 }} | 
					
						
							| 
									
										
										
										
											2024-04-29 16:11:35 +08:00
										 |  |  | 		on:mousedown={() => { | 
					
						
							| 
									
										
										
										
											2024-02-23 17:21:22 +08:00
										 |  |  | 			show = false; | 
					
						
							|  |  |  | 		}} | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 	> | 
					
						
							|  |  |  | 		<div | 
					
						
							| 
									
										
										
										
											2024-03-25 06:43:03 +08:00
										 |  |  | 			class=" m-auto rounded-2xl max-w-full {sizeToWidth( | 
					
						
							| 
									
										
										
										
											2024-01-06 12:59:56 +08:00
										 |  |  | 				size | 
					
						
							|  |  |  | 			)} mx-2 bg-gray-50 dark:bg-gray-900 shadow-3xl" | 
					
						
							| 
									
										
										
										
											2024-03-25 06:43:03 +08:00
										 |  |  | 			in:flyAndScale | 
					
						
							| 
									
										
										
										
											2024-04-29 16:11:35 +08:00
										 |  |  | 			on:mousedown={(e) => { | 
					
						
							| 
									
										
										
										
											2023-10-09 06:38:42 +08:00
										 |  |  | 				e.stopPropagation(); | 
					
						
							|  |  |  | 			}} | 
					
						
							|  |  |  | 		> | 
					
						
							|  |  |  | 			<slot /> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	</div> | 
					
						
							|  |  |  | {/if} | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  | 	.modal-content { | 
					
						
							|  |  |  | 		animation: scaleUp 0.1s ease-out forwards; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	@keyframes scaleUp { | 
					
						
							|  |  |  | 		from { | 
					
						
							| 
									
										
										
										
											2024-02-23 17:23:06 +08:00
										 |  |  | 			transform: scale(0.985); | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:48 +08:00
										 |  |  | 			opacity: 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		to { | 
					
						
							|  |  |  | 			transform: scale(1); | 
					
						
							|  |  |  | 			opacity: 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | </style> |