vue-slim-modal
Version:
Slim modal component for Vue.js
130 lines (118 loc) • 3.02 kB
JavaScript
/*!
* vue-slim-modal v1.0.4
* (c) 2017-present EGOIST <0x142857@gmail.com> (github.com/egoist)
* Released under the MIT License.
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.SlimModal = factory());
}(this, (function () { 'use strict';
var nestRE = /^(attrs|props|on|nativeOn|class|style|hook)$/;
var index$1 = function mergeJSXProps(objs) {
return objs.reduce(function (a, b) {
var aa, bb, key, nestedKey, temp;
for (key in b) {
aa = a[key];
bb = b[key];
if (aa && nestRE.test(key)) {
// normalize class
if (key === 'class') {
if (typeof aa === 'string') {
temp = aa;
a[key] = aa = {};
aa[temp] = true;
}
if (typeof bb === 'string') {
temp = bb;
b[key] = bb = {};
bb[temp] = true;
}
}
if (key === 'on' || key === 'nativeOn' || key === 'hook') {
// merge functions
for (nestedKey in bb) {
aa[nestedKey] = mergeFn(aa[nestedKey], bb[nestedKey]);
}
} else if (Array.isArray(aa)) {
a[key] = aa.concat(bb);
} else if (Array.isArray(bb)) {
a[key] = [aa].concat(bb);
} else {
for (nestedKey in bb) {
aa[nestedKey] = bb[nestedKey];
}
}
} else {
a[key] = b[key];
}
}
return a;
}, {});
};
function mergeFn(a, b) {
return function () {
a.apply(this, arguments);
b.apply(this, arguments);
};
}
var index = {
name: 'slim-modal',
functional: true,
props: {
isOpen: {
type: Boolean,
required: true
},
clickOutside: {
type: Function,
default: function _default() {
return function () {
return null;
};
}
},
isCenter: {
type: Boolean,
default: false
},
overlayClass: {
type: String
}
},
render: function render(h, ctx) {
var _ctx$props = ctx.props,
isOpen = _ctx$props.isOpen,
isCenter = _ctx$props.isCenter,
clickOutside = _ctx$props.clickOutside,
overlayClass = _ctx$props.overlayClass;
if (!isOpen) return;
var contentClassNames = 'modal' + (isCenter ? ' modal__center' : '');
var overlayClassNames = 'modal-overlay' + (overlayClass ? ' ' + overlayClass : '');
return h(
'div',
{ 'class': 'modal-wrapper' },
[h(
'div',
{ 'class': overlayClassNames, on: {
'click': clickOutside
}
},
[]
), h(
'div',
index$1([{
'class': contentClassNames,
on: {
'click': function click(e) {
return e.stopPropagation();
}
}
}, ctx.data]),
[ctx.children]
)]
);
}
};
return index;
})));