mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-30 13:11:08 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			140 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div
 | |
|     v-click-outside="closeDropdown"
 | |
|     :class="[
 | |
|       'dropdown-group',
 | |
|       {'active': (toggle || isActive() )},
 | |
|       {'has-child':hasChild},
 | |
|       {'toggle-arrow':(hasChild)&&(showArrow)},
 | |
|       {'dropdown-light': themeLight}]"
 | |
|   >
 | |
|     <div class="dropdown-activator" @click.stop.prevent="showDropdown">
 | |
|       <slot name="activator"/>
 | |
|     </div>
 | |
|     <transition name="bounce">
 | |
|       <div
 | |
|         v-show="toggle"
 | |
|         v-if="hasChild"
 | |
|         ref="dropdownItems"
 | |
|         :class="['dropdown-container', {'align-right': rightAlign}]"
 | |
|         @click="closeOnSelectDropdownItem"
 | |
|       >
 | |
|         <slot />
 | |
|       </div>
 | |
|     </transition>
 | |
|   </div>
 | |
| </template>
 | |
| <script>
 | |
| export default {
 | |
|   props: {
 | |
|     activeUrl: {
 | |
|       type: String,
 | |
|       require: true,
 | |
|       default: String
 | |
|     },
 | |
|     showArrow: {
 | |
|       type: Boolean,
 | |
|       require: true,
 | |
|       default: true
 | |
|     },
 | |
|     themeLight: {
 | |
|       type: Boolean,
 | |
|       require: true,
 | |
|       default: false
 | |
|     },
 | |
|     closeOnSelect: {
 | |
|       type: Boolean,
 | |
|       require: true,
 | |
|       default: true
 | |
|     }
 | |
|   },
 | |
|   data () {
 | |
|     return {
 | |
|       toggle: true,
 | |
|       hasChild: true,
 | |
|       rightAlign: false
 | |
|     }
 | |
|   },
 | |
|   mounted () {
 | |
|     this.$nextTick(() => {
 | |
|       this.setDropdownPosition()
 | |
|       window.addEventListener('resize', e => {
 | |
|         if (this.toggle === true) {
 | |
|           this.setDropdownPosition()
 | |
|         }
 | |
|       })
 | |
|       if (!this.$slots.default) {
 | |
|         this.hasChild = false
 | |
|       }
 | |
|       this.toggle = false
 | |
|     })
 | |
|   },
 | |
|   methods: {
 | |
|     setDropdownPosition () {
 | |
|       let rect = this.$refs.dropdownItems.getBoundingClientRect()
 | |
| 
 | |
|       let offsetPos = rect.width - this.$el.offsetWidth
 | |
|       let itemPos = rect.right + rect.width + offsetPos
 | |
| 
 | |
|       if (itemPos > window.innerWidth) {
 | |
|         this.rightAlign = true
 | |
|       }
 | |
|       itemPos += offsetPos + rect.width + offsetPos
 | |
|       if (itemPos < window.innerWidth) {
 | |
|         this.rightAlign = false
 | |
|       }
 | |
|     },
 | |
|     isActive () {
 | |
|       if (this.activeUrl) {
 | |
|         return this.$route.path.indexOf(this.activeUrl) > -1
 | |
|       }
 | |
|       return false
 | |
|     },
 | |
|     showDropdown () {
 | |
|       this.toggle = !this.toggle
 | |
|     },
 | |
|     closeOnSelectDropdownItem () {
 | |
|       if (this.closeOnSelect === false) {
 | |
|         this.toggle = true
 | |
|       } else {
 | |
|         this.toggle = false
 | |
|       }
 | |
|     },
 | |
|     closeDropdown () {
 | |
|       this.toggle = false
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </script>
 | |
| <style>
 | |
|   .dropdown-item {
 | |
|     background: transparent;
 | |
|     transform-origin: top;
 | |
|     position: relative;
 | |
|     color:#040405;
 | |
|     animation-name: example;
 | |
|     animation-duration: 1s;
 | |
|     animation-iteration-count: 1;
 | |
|     animation-direction: alternate;
 | |
|   }
 | |
|   .bounce-enter-active {
 | |
|     /* zoom: 1; */
 | |
|     transform-origin: top right;
 | |
|     margin-top: 5px;
 | |
|     animation: bounce-in 0.4s;
 | |
|   }
 | |
|   .bounce-leave-active {
 | |
|      animation: bounce-in 1s reverse;
 | |
|   }
 | |
| 
 | |
| @keyframes example {
 | |
|  0% {color: #FFFFFF;}
 | |
|  100% {color:#040405;}
 | |
| }
 | |
| 
 | |
| @keyframes bounce-in {
 | |
|   from { transform: scale(0); }
 | |
|   to {  }
 | |
| }
 | |
| </style>
 |