text: /* @flow */
  
  import { enter, leave } from '../modules/transition'
  
  // recursively search for possible transition defined inside the component root
  function locateNode(vnode: VNode): VNodeWithData {
    return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
      ? locateNode(vnode.componentInstance._vnode)
      : vnode
  }
  
  export default {
    bind(el: any, { value }: VNodeDirective, vnode: VNodeWithData) {
      vnode = locateNode(vnode)
      const transition = vnode.data && vnode.data.transition
      const originalDisplay = (el.__vOriginalDisplay = el.style.display === 'none' ? '' : el.style.display)
      if (value && transition) {
        vnode.data.show = true
        enter(vnode, () => {
          el.style.display = originalDisplay
        })
      } else {
        el.style.display = value ? originalDisplay : 'none'
      }
    },
  
    update(el: any, { value, oldValue }: VNodeDirective, vnode: VNodeWithData) {
      /* istanbul ignore if */
      if (!value === !oldValue) return
      vnode = locateNode(vnode)
      const transition = vnode.data && vnode.data.transition
      if (transition) {
        vnode.data.show = true
        if (value) {
          enter(vnode, () => {
            el.style.display = el.__vOriginalDisplay
          })
        } else {
          leave(vnode, () => {
            el.style.display = 'none'
          })
        }
      } else {
        el.style.display = value ? el.__vOriginalDisplay : 'none'
      }
    },
  
    unbind(el: any, binding: VNodeDirective, vnode: VNodeWithData, oldVnode: VNodeWithData, isDestroy: boolean) {
      if (!isDestroy) {
        el.style.display = el.__vOriginalDisplay
      }
    },
  }
  