forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| <script lang="ts">
 | |
|   /**
 | |
|    * This overlay element will regularly show a hand that swipes over the underlying element.
 | |
|    * This element will hide as soon as the Store 'hideSignal' receives a change (which is not undefined)
 | |
|    */
 | |
|   import { Store } from "../../Logic/UIEventSource"
 | |
|   import { onDestroy } from "svelte"
 | |
| 
 | |
|   let mainElem: HTMLElement
 | |
|   export let hideSignal: Store<any>
 | |
|   function hide() {
 | |
|     mainElem.style.visibility = "hidden"
 | |
|   }
 | |
|   let initTime = Date.now()
 | |
|   if (hideSignal) {
 | |
|     onDestroy(
 | |
|       hideSignal.addCallbackD(() => {
 | |
|         if (initTime + 1000 > Date.now()) {
 | |
|           console.log("Ignoring hide signal")
 | |
|           return
 | |
|         }
 | |
|         console.log("Received hide signal")
 | |
|         hide()
 | |
|         return true
 | |
|       })
 | |
|     )
 | |
|   }
 | |
| 
 | |
|   $: {
 | |
|     mainElem?.addEventListener("click", (_) => hide())
 | |
|     mainElem?.addEventListener("touchstart", (_) => hide())
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| <div bind:this={mainElem} class="pointer-events-none absolute bottom-0 right-0 h-full w-full">
 | |
|   <div id="hand-container">
 | |
|     <img src="./assets/svg/hand.svg" />
 | |
|   </div>
 | |
| </div>
 | |
| 
 | |
| <style>
 | |
|   @keyframes hand-drag-animation {
 | |
|     /* This is the animation on the little extra hand on the location input. If fades in, invites the user to interact/drag the map */
 | |
|     0% {
 | |
|       opacity: 0;
 | |
|       transform: rotate(-30deg);
 | |
|     }
 | |
| 
 | |
|     6% {
 | |
|       opacity: 1;
 | |
|       transform: rotate(-30deg);
 | |
|     }
 | |
| 
 | |
|     12% {
 | |
|       opacity: 1;
 | |
|       transform: rotate(-45deg);
 | |
|     }
 | |
| 
 | |
|     24% {
 | |
|       opacity: 1;
 | |
|       transform: rotate(-00deg);
 | |
|     }
 | |
| 
 | |
|     30% {
 | |
|       opacity: 1;
 | |
|       transform: rotate(-30deg);
 | |
|     }
 | |
| 
 | |
|     36% {
 | |
|       opacity: 0;
 | |
|       transform: rotate(-30deg);
 | |
|     }
 | |
| 
 | |
|     100% {
 | |
|       opacity: 0;
 | |
|       transform: rotate(-30deg);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   #hand-container {
 | |
|     position: absolute;
 | |
|     width: 2rem;
 | |
|     left: calc(50% + 4rem);
 | |
|     top: calc(50%);
 | |
|     opacity: 0.7;
 | |
|     animation: hand-drag-animation 4s ease-in-out infinite;
 | |
|     transform-origin: 50% 125%;
 | |
|   }
 | |
| </style>
 |