Spaces:
Paused
Paused
| <script lang="ts"> | |
| import { createEventDispatcher, onDestroy, onMount } from 'svelte'; | |
| const dispatch = createEventDispatcher(); | |
| let loaderElement: HTMLElement; | |
| let observer; | |
| let intervalId; | |
| onMount(() => { | |
| observer = new IntersectionObserver( | |
| (entries, observer) => { | |
| entries.forEach((entry) => { | |
| if (entry.isIntersecting) { | |
| intervalId = setInterval(() => { | |
| dispatch('visible'); | |
| }, 100); | |
| // dispatch('visible'); | |
| // observer.unobserve(loaderElement); // Stop observing until content is loaded | |
| } else { | |
| clearInterval(intervalId); | |
| } | |
| }); | |
| }, | |
| { | |
| root: null, // viewport | |
| rootMargin: '0px', | |
| threshold: 0.1 // When 10% of the loader is visible | |
| } | |
| ); | |
| observer.observe(loaderElement); | |
| }); | |
| onDestroy(() => { | |
| observer.disconnect(); | |
| if (intervalId) { | |
| clearInterval(intervalId); | |
| } | |
| }); | |
| </script> | |
| <div bind:this={loaderElement}> | |
| <slot /> | |
| </div> | |