vuikit
Version:
A Vuejs component library based on UIkit
77 lines (65 loc) • 2.15 kB
JavaScript
/**
* Vuikit 0.7.0
* (c) 2018 Miljan Aleksic
* @license MIT
*/
import css from 'vuikit/core/helpers/css'
import { one } from 'vuikit/core/helpers/dom/event'
import { transitionend } from 'vuikit/core/helpers/dom/env'
import mergeData from 'vuikit/core/helpers/vue-data-merge'
import { width, height } from 'vuikit/core/helpers/dom/position'
import { addClass, removeClass } from 'vuikit/core/helpers/dom/class'
import common from './_common'
const win = window
const doc = document.documentElement
export default {
functional: true,
render (h, { parent: vm, data, children }) {
let wrapper = vm.$refs.wrapper
let bar
const def = {
props: {
css: false
},
on: {
beforeEnter (el) {
const scrollbarWidth = width(win) - doc.offsetWidth
width(vm.$refs.content, width(win) - scrollbarWidth)
css(doc, 'overflowY', vm.flip && scrollbarWidth && vm.overlay
? 'scroll'
: ''
)
// wrap bar, required for this animation
wrapper = document.createElement('div')
addClass(wrapper, 'uk-offcanvas-reveal')
el.appendChild(wrapper)
wrapper.appendChild(vm.$refs.bar)
vm.$refs.wrapper = wrapper // save ref
},
enter (el, done) {
height(el) // force reflow
addClass(el, 'uk-open')
addClass(vm.$refs.content, 'uk-offcanvas-content-animation')
// indicate end of transition
one(el, transitionend, done, e => e.target === wrapper)
},
beforeLeave (el) {
// set bar, required at afterLeave
bar = vm.$refs.bar
removeClass(el, 'uk-open')
removeClass(vm.$refs.content, 'uk-offcanvas-content-animation')
},
leave (el, done) {
// indicate end of transition
one(el, transitionend, done, e => e.target === wrapper)
},
afterLeave (el) {
// remove wrapper
el.appendChild(bar)
el.removeChild(wrapper)
}
}
}
return h('transition', mergeData(data, def, common(vm)), children)
}
}