vuikit
Version:
A Vuejs component library based on UIkit
371 lines (358 loc) • 11.3 kB
JavaScript
/**
* Vuikit 0.7.0
* (c) 2018 Miljan Aleksic
* @license MIT
*/
import { warn } from 'vuikit/core/helpers/debug';
import css from 'vuikit/core/helpers/css';
import { height, width } from 'vuikit/core/helpers/dom/position';
import mergeData from 'vuikit/core/helpers/vue-data-merge';
import { addClass, removeClass } from 'vuikit/core/helpers/dom/class';
import { offAll, on, one } from 'vuikit/core/helpers/dom/event';
import { transitionend } from 'vuikit/core/helpers/dom/env';
var win$1 = window;
var body = document.body;
var doc$1 = document.documentElement;
var scroll;
var active;
var activeCount;
var scrollbarWidth;
function common (vm) { return ({
on: {
beforeEnter: function beforeEnter (el) {
scrollbarWidth = width(win$1) - doc$1.offsetWidth;
scroll = scroll || { x: win$1.pageXOffset, y: win$1.pageYOffset };
addClass(doc$1, 'uk-offcanvas-page');
addClass(body, 'uk-offcanvas-container');
if (vm.flip) {
addClass(body, 'uk-offcanvas-flip');
addClass(vm.$refs.bar, 'uk-offcanvas-bar-flip');
}
if (vm.overlay) {
addClass(el, 'uk-offcanvas-overlay');
addClass(body, 'uk-offcanvas-overlay');
}
},
afterEnter: function afterEnter (el) {
if (vm.overlay) {
width(vm.$refs.content, width(win$1) - scrollbarWidth);
height(vm.$refs.content, height(win$1));
if (scroll) {
vm.$refs.content.scrollTop = scroll.y;
}
}
if (!activeCount) {
setGlobalEvents();
}
active = vm;
activeCount++;
},
afterLeave: function afterLeave (el) {
if (!vm.overlay) {
scroll = { x: win$1.pageXOffset, y: win$1.pageYOffset };
} else if (!scroll) {
var ref = vm.$refs.content;
var x = ref.scrollLeft;
var y = ref.scrollTop;
scroll = { x: x, y: y };
}
removeClass(body, 'uk-offcanvas-flip');
removeClass(vm.$refs.bar, 'uk-offcanvas-bar-flip');
removeClass(doc$1, 'uk-offcanvas-page');
removeClass(body, 'uk-offcanvas-container');
removeClass(el, 'uk-offcanvas-overlay');
removeClass(body, 'uk-offcanvas-overlay');
body.scrollTop = scroll.y;
css(body, 'overflowY', '');
css(doc$1, 'overflowY', '');
width(vm.$refs.content, '');
height(vm.$refs.content, '');
win$1.scrollTo(scroll.x, scroll.y);
scroll = null;
activeCount--;
if (!activeCount) {
unsetGlobalEvents();
}
if (active === vm) {
active = null;
}
}
}
}); }
function unsetGlobalEvents () {
offAll('vk-offcanvas');
}
function setGlobalEvents () {
on(doc$1, 'click', function (e) {
var clickOut = !active.$el.contains(e.target);
var clickOnOverlay = e.target === active.$el && active.overlay;
if (clickOut || clickOnOverlay) {
active.hide();
}
}, 'vk-offcanvas');
on(doc$1, 'keyup', function (e) {
if (e.keyCode === 27 && active) {
e.preventDefault();
active.hide();
}
}, 'vk-offcanvas');
}
var win = window;
var doc = document.documentElement;
var VkOffcanvasTransitionNone = {
functional: true,
render: function render (h, ref) {
var vm = ref.parent;
var data = ref.data;
var children = ref.children;
var def = {
props: {
css: false
},
on: {
enter: function (el, done) { return done(); },
leave: function (el, done) { return done(); },
beforeEnter: function beforeEnter (el) {
var scrollbarWidth = width(win) - doc.offsetWidth;
css(doc, 'overflowY', scrollbarWidth && vm.overlay
? 'scroll'
: ''
);
addClass(el, 'uk-open');
addClass(vm.$refs.bar, 'uk-offcanvas-none');
},
afterLeave: function afterLeave (el) {
removeClass(el, 'uk-open');
removeClass(vm.$refs.bar, 'uk-offcanvas-none');
}
}
};
return h('transition', mergeData(data, def, common(vm)), children)
}
}
var win$2 = window;
var doc$2 = document.documentElement;
var VkOffcanvasTransitionPush = {
functional: true,
render: function render (h, ref) {
var vm = ref.parent;
var data = ref.data;
var children = ref.children;
var def = {
props: {
css: false
},
on: {
beforeEnter: function beforeEnter (el) {
var scrollbarWidth = width(win$2) - doc$2.offsetWidth;
css(doc$2, 'overflowY', vm.flip && scrollbarWidth && vm.overlay
? 'scroll'
: ''
);
addClass(vm.$refs.bar, 'uk-offcanvas-bar-animation uk-offcanvas-push');
},
enter: function enter (el, done) {
height(el);
addClass(el, 'uk-open');
addClass(vm.$refs.content, 'uk-offcanvas-content-animation');
one(el, transitionend, done, function (e) { return e.target === vm.$refs.bar; });
},
beforeLeave: function beforeLeave (el) {
removeClass(el, 'uk-open');
removeClass(vm.$refs.content, 'uk-offcanvas-content-animation');
},
leave: function leave (el, done) {
var bar = vm.$refs.bar;
one(el, transitionend, done, function (e) { return e.target === bar; });
},
afterLeave: function afterLeave (el) {
removeClass(vm.$refs.bar, 'uk-offcanvas-bar-animation uk-offcanvas-push');
}
}
};
return h('transition', mergeData(data, def, common(vm)), children)
}
}
var win$3 = window;
var doc$3 = document.documentElement;
var VkOffcanvasTransitionSlide = {
functional: true,
render: function render (h, ref) {
var vm = ref.parent;
var data = ref.data;
var children = ref.children;
var def = {
props: {
css: false
},
on: {
beforeEnter: function beforeEnter (el) {
var scrollbarWidth = width(win$3) - doc$3.offsetWidth;
css(doc$3, 'overflowY', scrollbarWidth && vm.overlay
? 'scroll'
: ''
);
addClass(vm.$refs.bar, 'uk-offcanvas-bar-animation uk-offcanvas-slide');
},
enter: function enter (el, done) {
height(el);
addClass(el, 'uk-open');
one(el, transitionend, done, function (e) { return e.target === vm.$refs.bar; });
},
beforeLeave: function beforeLeave (el) {
removeClass(el, 'uk-open');
},
leave: function leave (el, done) {
var bar = vm.$refs.bar;
one(el, transitionend, done, function (e) { return e.target === bar; });
},
afterLeave: function afterLeave (el) {
removeClass(vm.$refs.bar, 'uk-offcanvas-bar-animation uk-offcanvas-slide');
}
}
};
return h('transition', mergeData(data, def, common(vm)), children)
}
}
var win$4 = window;
var doc$4 = document.documentElement;
var VkOffcanvasTransitionReveal = {
functional: true,
render: function render (h, ref) {
var vm = ref.parent;
var data = ref.data;
var children = ref.children;
var wrapper = vm.$refs.wrapper;
var bar;
var def = {
props: {
css: false
},
on: {
beforeEnter: function beforeEnter (el) {
var scrollbarWidth = width(win$4) - doc$4.offsetWidth;
width(vm.$refs.content, width(win$4) - scrollbarWidth);
css(doc$4, 'overflowY', vm.flip && scrollbarWidth && vm.overlay
? 'scroll'
: ''
);
wrapper = document.createElement('div');
addClass(wrapper, 'uk-offcanvas-reveal');
el.appendChild(wrapper);
wrapper.appendChild(vm.$refs.bar);
vm.$refs.wrapper = wrapper;
},
enter: function enter (el, done) {
height(el);
addClass(el, 'uk-open');
addClass(vm.$refs.content, 'uk-offcanvas-content-animation');
one(el, transitionend, done, function (e) { return e.target === wrapper; });
},
beforeLeave: function beforeLeave (el) {
bar = vm.$refs.bar;
removeClass(el, 'uk-open');
removeClass(vm.$refs.content, 'uk-offcanvas-content-animation');
},
leave: function leave (el, done) {
one(el, transitionend, done, function (e) { return e.target === wrapper; });
},
afterLeave: function afterLeave (el) {
el.appendChild(bar);
el.removeChild(wrapper);
}
}
};
return h('transition', mergeData(data, def, common(vm)), children)
}
}
var offcanvas = {render: function(){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c(("vk-offcanvas-transition-" + (_vm.transition)),{tag:"component"},[(_vm.show)?_c('div',{staticClass:"uk-offcanvas",staticStyle:{"display":"block"}},[_c('div',{ref:"bar",staticClass:"uk-offcanvas-bar"},[_vm._t("default")],2)]):_vm._e()])},staticRenderFns: [],
name: 'Offcanvas',
components: {
VkOffcanvasTransitionNone: VkOffcanvasTransitionNone,
VkOffcanvasTransitionPush: VkOffcanvasTransitionPush,
VkOffcanvasTransitionSlide: VkOffcanvasTransitionSlide,
VkOffcanvasTransitionReveal: VkOffcanvasTransitionReveal
},
props: {
show: {
type: Boolean,
default: false
},
flip: {
type: Boolean,
default: false
},
overlay: {
type: Boolean,
default: false
},
transition: {
type: String,
default: 'slide',
validator: function (mode) { return mode.match(/none|slide|push|reveal/); }
}
},
methods: {
hide: function hide () {
this.$emit('update:show', false);
}
},
mounted: function mounted () {
this.$refs.content = document.body.querySelector(".uk-offcanvas-content");
if (!this.$refs.content) {
warn('Offcanvas content is not detected, make sure to wrap the content with VkOffcanvasContent or a custom div.uk-offcanvas-content.', this);
this.$destroy();
}
}
}
var offcanvasContent = {
functional: true,
render: function (h, ref) {
var children = ref.children;
return h('div', {
class: 'uk-offcanvas-content'
}, children);
}
}
var IconClose = {
functional: true,
render: function (h, ctx) {
var props = ctx.props;
var ratio = props.ratio || 1;
var width$$1 = props.width || 14;
var height$$1 = props.height || 14;
var viewBox = props.viewBox || '0 0 14 14';
if (ratio !== 1) {
width$$1 = width$$1 * ratio;
height$$1 = height$$1 * ratio;
}
return h('svg', {
attrs: {
version: '1.1',
meta: 'icon-close-icon ratio-' + ratio,
width: width$$1,
height: height$$1,
viewBox: viewBox
},
domProps: {
innerHTML: '<path fill="none" stroke="#000" stroke-width="1.1" d="M1 1l12 12M13 1L1 13"/>'
}
})
}
}
var offcanvasClose = {
functional: true,
render: function (h, ref) {
var data = ref.data;
return h('button', {
class: 'uk-offcanvas-close uk-close uk-icon',
attrs: {
type: 'button'
},
on: data.on
}, [
h(IconClose)
]);
}
}
export { offcanvas as Offcanvas, offcanvasContent as OffcanvasContent, offcanvasClose as OffcanvasClose };