167 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <transition name="slide">
 | |
|     <div class="toast" :class="type" v-if="show" ref="toast">
 | |
|       <div class="message">
 | |
|         <span v-html="title"></span>
 | |
|         <span class="description" v-if="description">
 | |
|           {{ description }}
 | |
|         </span>
 | |
|       </div>
 | |
| 
 | |
|       <div class="button-container">
 | |
|         <button @click="dismiss">Lukk</button>
 | |
|       </div>
 | |
|     </div>
 | |
|   </transition>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| export default {
 | |
|   data() {
 | |
|     return {
 | |
|       type: this.$root.type || "info",
 | |
|       title: this.$root.title || undefined,
 | |
|       description: this.$root.description || undefined,
 | |
|       image: this.$root.image || undefined,
 | |
|       link: this.$root.link || undefined,
 | |
|       timeout: this.$root.timeout || 4500,
 | |
|       show: false,
 | |
|       mouseover: false,
 | |
|       timedOut: false
 | |
|     };
 | |
|   },
 | |
|   mounted() {
 | |
|     // Here we set show when mounted in-order to get the transition animation to be displayed correctly
 | |
|     this.show = true;
 | |
|     const timeout = setTimeout(() => {
 | |
|       console.log("Your toast time is up 👋");
 | |
| 
 | |
|       if (this.mouseover === false) {
 | |
|         this.show = false;
 | |
|       } else {
 | |
|         this.timedOut = true;
 | |
|       }
 | |
|     }, this.timeout);
 | |
| 
 | |
|     setTimeout(() => {
 | |
|       const { toast } = this.$refs;
 | |
| 
 | |
|       if (toast) {
 | |
|         toast.addEventListener("mouseenter", _ => {
 | |
|           this.mouseover = true;
 | |
|         });
 | |
| 
 | |
|         toast.addEventListener("mouseleave", _ => {
 | |
|           this.mouseover = false;
 | |
| 
 | |
|           if (this.timedOut === true) {
 | |
|             this.show = false;
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|     }, 10);
 | |
|   },
 | |
|   methods: {
 | |
|     dismiss() {
 | |
|       this.show = false;
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| @import "@/styles/media-queries.scss";
 | |
| 
 | |
| .slide-enter-active {
 | |
|   transition: all 0.3s ease;
 | |
| }
 | |
| .slide-enter,
 | |
| .slide-leave-to {
 | |
|   transform: translateY(100vh);
 | |
|   opacity: 0;
 | |
| }
 | |
| .slide-leave-active {
 | |
|   transition: all 2s ease;
 | |
| }
 | |
| 
 | |
| .toast {
 | |
|   position: fixed;
 | |
|   bottom: 1.3rem;
 | |
|   left: 0;
 | |
|   right: 0;
 | |
|   margin: auto;
 | |
|   background: #2d2d2d;
 | |
|   border-radius: 5px;
 | |
|   padding: 15px;
 | |
|   display: flex;
 | |
|   flex-direction: row;
 | |
|   justify-content: space-between;
 | |
|   align-items: center;
 | |
|   width: 80vw;
 | |
| 
 | |
|   @include mobile {
 | |
|     width: 85vw;
 | |
|   }
 | |
| 
 | |
|   .message {
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
|   }
 | |
| 
 | |
|   & span {
 | |
|     color: white;
 | |
| 
 | |
|     &.description {
 | |
|       margin-top: 0.5rem;
 | |
|       font-size: 0.9rem;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   & .button-container {
 | |
|     & button {
 | |
|       color: #2d2d2d;
 | |
|       background-color: white;
 | |
|       border-radius: 5px;
 | |
|       padding: 10px;
 | |
|       margin: 0 3px;
 | |
|       font-size: 0.8rem;
 | |
|       height: max-content;
 | |
|       border: 0;
 | |
|       font-size: 0.9rem;
 | |
| 
 | |
|       &:active {
 | |
|         background: #2d2d2d;
 | |
|         color: white;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   &.success {
 | |
|     background-color: #5bc2a1;
 | |
|     color: white;
 | |
|   }
 | |
| 
 | |
|   &.info {
 | |
|     background: #2d2d2d;
 | |
|     color: white;
 | |
|   }
 | |
| 
 | |
|   &.warning {
 | |
|     border-left: 6px solid #f6993f;
 | |
|   }
 | |
| 
 | |
|   &.error {
 | |
|     background-color: var(--red);
 | |
| 
 | |
|     button {
 | |
|       color: var(--dark-red);
 | |
| 
 | |
|       &:active {
 | |
|         background-color: var(--dark-red);
 | |
|         color: white;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </style>
 |