vuetify
Version:
Vue.js 2 Semantic Component Framework
70 lines (56 loc) • 1.5 kB
text/typescript
// Mixins
import Delayable from '../../mixins/delayable'
import Toggleable from '../../mixins/toggleable'
// Utilities
import mixins from '../../util/mixins'
import { consoleWarn } from '../../util/console'
// Types
import { VNode, VNodeChildrenArrayContents } from 'vue'
export default mixins(
Delayable,
Toggleable
/* @vue/component */
).extend({
name: 'v-hover',
props: {
disabled: {
type: Boolean,
default: false
},
value: {
type: Boolean,
default: undefined
}
},
methods: {
onMouseEnter () {
this.runDelay('open')
},
onMouseLeave () {
this.runDelay('close')
}
},
render (): VNode {
if (!this.$scopedSlots.default && this.value === undefined) {
consoleWarn('v-hover is missing a default scopedSlot or bound value', this)
return null as any
}
let element: VNode | VNodeChildrenArrayContents | string | undefined
if (this.$scopedSlots.default) {
element = this.$scopedSlots.default({ hover: this.isActive })
} else if (this.$slots.default.length === 1) {
element = this.$slots.default[0]
}
if (!element || typeof element === 'string' || Array.isArray(element)) {
consoleWarn('v-hover should only contain a single element', this)
return element as any
}
if (!this.disabled) {
this._g(element.data!, {
mouseenter: this.onMouseEnter,
mouseleave: this.onMouseLeave
})
}
return element
}
})