framework7-vue
Version:
Build full featured iOS & Android apps using Framework7 & Vue
1,693 lines (1,506 loc) • 341 kB
JavaScript
/**
* Framework7 Vue 4.0.0-beta.18
* Build full featured iOS & Android apps using Framework7 & Vue
* http://framework7.io/vue/
*
* Copyright 2014-2019 Vladimir Kharlampidi
*
* Released under the MIT License
*
* Released on: January 12, 2019
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('vue')) :
typeof define === 'function' && define.amd ? define(['vue'], factory) :
(global = global || self, global.Framework7Vue = factory(global.Vue));
}(this, function (Vue) { 'use strict';
Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue;
var Utils = {
noUndefinedProps: function noUndefinedProps(obj) {
var o = {};
Object.keys(obj).forEach(function (key) {
if (typeof obj[key] !== 'undefined') { o[key] = obj[key]; }
});
return o;
},
isTrueProp: function isTrueProp(val) {
return val === true || val === '';
},
isStringProp: function isStringProp(val) {
return typeof val === 'string' && val !== '';
},
isObject: function isObject(o) {
return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
},
now: function now() {
return Date.now();
},
extend: function extend() {
var assign, assign$1;
var args = [], len$1 = arguments.length;
while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
var deep = true;
var to;
var from;
if (typeof args[0] === 'boolean') {
(assign = args, deep = assign[0], to = assign[1]);
args.splice(0, 2);
from = args;
} else {
(assign$1 = args, to = assign$1[0]);
args.splice(0, 1);
from = args;
}
for (var i = 0; i < from.length; i += 1) {
var nextSource = args[i];
if (nextSource !== undefined && nextSource !== null) {
var keysArray = Object.keys(Object(nextSource));
for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
var nextKey = keysArray[nextIndex];
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
if (desc !== undefined && desc.enumerable) {
if (!deep) {
to[nextKey] = nextSource[nextKey];
} else if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
Utils.extend(to[nextKey], nextSource[nextKey]);
} else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
to[nextKey] = {};
Utils.extend(to[nextKey], nextSource[nextKey]);
} else {
to[nextKey] = nextSource[nextKey];
}
}
}
}
}
return to;
},
flattenArray: function flattenArray() {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var arr = [];
args.forEach(function (arg) {
if (Array.isArray(arg)) { arr.push.apply(arr, Utils.flattenArray.apply(Utils, arg)); }
else { arr.push(arg); }
});
return arr;
},
classNames: function classNames() {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var classes = [];
args.forEach(function (arg) {
if (typeof arg === 'object' && arg.constructor === Object) {
Object.keys(arg).forEach(function (key) {
if (arg[key]) { classes.push(key); }
});
} else if (arg) { classes.push(arg); }
});
var uniqueClasses = [];
classes.forEach(function (c) {
if (uniqueClasses.indexOf(c) < 0) { uniqueClasses.push(c); }
});
return uniqueClasses.join(' ');
},
bindMethods: function bindMethods(context, methods) {
if ( methods === void 0 ) methods = [];
for (var i = 0; i < methods.length; i += 1) {
if (context[methods[i]]) { context[methods[i]] = context[methods[i]].bind(context); }
}
},
};
var Mixins = {
colorProps: {
color: String,
colorTheme: String,
textColor: String,
bgColor: String,
borderColor: String,
rippleColor: String,
themeDark: Boolean,
},
colorClasses: function colorClasses(props) {
var obj;
var color = props.color;
var colorTheme = props.colorTheme;
var textColor = props.textColor;
var bgColor = props.bgColor;
var borderColor = props.borderColor;
var rippleColor = props.rippleColor;
var themeDark = props.themeDark;
return ( obj = {
'theme-dark': themeDark
}, obj[("color-" + color)] = color, obj[("color-theme-" + colorTheme)] = colorTheme, obj[("text-color-" + textColor)] = textColor, obj[("bg-color-" + bgColor)] = bgColor, obj[("border-color-" + borderColor)] = borderColor, obj[("ripple-color-" + rippleColor)] = rippleColor, obj );
},
linkIconProps: {
icon: String,
iconMaterial: String,
iconIon: String,
iconFa: String,
iconF7: String,
iconIfMd: String,
iconIfIos: String,
iconIos: String,
iconMd: String,
iconColor: String,
iconSize: [String, Number],
},
linkRouterProps: {
back: Boolean,
external: Boolean,
force: Boolean,
animate: {
type: Boolean,
default: undefined,
},
ignoreCache: Boolean,
reloadCurrent: Boolean,
reloadAll: Boolean,
reloadPrevious: Boolean,
routeTabId: String,
view: String,
routeProps: Object,
},
linkRouterAttrs: function linkRouterAttrs(props) {
var force = props.force;
var reloadCurrent = props.reloadCurrent;
var reloadPrevious = props.reloadPrevious;
var reloadAll = props.reloadAll;
var animate = props.animate;
var ignoreCache = props.ignoreCache;
var routeTabId = props.routeTabId;
var view = props.view;
var dataAnimate;
if ('animate' in props && typeof animate !== 'undefined') {
dataAnimate = animate.toString();
}
return {
'data-force': force || undefined,
'data-reload-current': reloadCurrent || undefined,
'data-reload-all': reloadAll || undefined,
'data-reload-previous': reloadPrevious || undefined,
'data-animate': dataAnimate,
'data-ignore-cache': ignoreCache || undefined,
'data-route-tab-id': routeTabId || undefined,
'data-view': Utils.isStringProp(view) ? view : undefined,
};
},
linkRouterClasses: function linkRouterClasses(props) {
var back = props.back;
var linkBack = props.linkBack;
var external = props.external;
return {
back: back || linkBack,
external: external,
};
},
linkActionsProps: {
searchbarEnable: [Boolean, String],
searchbarDisable: [Boolean, String],
searchbarClear: [Boolean, String],
searchbarToggle: [Boolean, String],
// Panel
panelOpen: [Boolean, String],
panelClose: [Boolean, String],
// Popup
popupOpen: [Boolean, String],
popupClose: [Boolean, String],
// Actions
actionsOpen: [Boolean, String],
actionsClose: [Boolean, String],
// Popover
popoverOpen: [Boolean, String],
popoverClose: [Boolean, String],
// Login Screen
loginScreenOpen: [Boolean, String],
loginScreenClose: [Boolean, String],
// Picker
sheetOpen: [Boolean, String],
sheetClose: [Boolean, String],
// Sortable
sortableEnable: [Boolean, String],
sortableDisable: [Boolean, String],
sortableToggle: [Boolean, String],
// Card
cardOpen: [Boolean, String],
cardClose: [Boolean, String],
// Menu
menuClose: {
type: [Boolean, String],
default: undefined,
},
},
linkActionsAttrs: function linkActionsAttrs(props) {
var searchbarEnable = props.searchbarEnable;
var searchbarDisable = props.searchbarDisable;
var searchbarClear = props.searchbarClear;
var searchbarToggle = props.searchbarToggle;
var panelOpen = props.panelOpen;
var panelClose = props.panelClose;
var popupOpen = props.popupOpen;
var popupClose = props.popupClose;
var actionsOpen = props.actionsOpen;
var actionsClose = props.actionsClose;
var popoverOpen = props.popoverOpen;
var popoverClose = props.popoverClose;
var loginScreenOpen = props.loginScreenOpen;
var loginScreenClose = props.loginScreenClose;
var sheetOpen = props.sheetOpen;
var sheetClose = props.sheetClose;
var sortableEnable = props.sortableEnable;
var sortableDisable = props.sortableDisable;
var sortableToggle = props.sortableToggle;
var cardOpen = props.cardOpen;
var cardClose = props.cardClose;
return {
'data-searchbar': (Utils.isStringProp(searchbarEnable) && searchbarEnable)
|| (Utils.isStringProp(searchbarDisable) && searchbarDisable)
|| (Utils.isStringProp(searchbarClear) && searchbarClear)
|| (Utils.isStringProp(searchbarToggle) && searchbarToggle) || undefined,
'data-panel': (Utils.isStringProp(panelOpen) && panelOpen)
|| (Utils.isStringProp(panelClose) && panelClose) || undefined,
'data-popup': (Utils.isStringProp(popupOpen) && popupOpen)
|| (Utils.isStringProp(popupClose) && popupClose) || undefined,
'data-actions': (Utils.isStringProp(actionsOpen) && actionsOpen)
|| (Utils.isStringProp(actionsClose) && actionsClose) || undefined,
'data-popover': (Utils.isStringProp(popoverOpen) && popoverOpen)
|| (Utils.isStringProp(popoverClose) && popoverClose) || undefined,
'data-sheet': (Utils.isStringProp(sheetOpen) && sheetOpen)
|| (Utils.isStringProp(sheetClose) && sheetClose) || undefined,
'data-login-screen': (Utils.isStringProp(loginScreenOpen) && loginScreenOpen)
|| (Utils.isStringProp(loginScreenClose) && loginScreenClose) || undefined,
'data-sortable': (Utils.isStringProp(sortableEnable) && sortableEnable)
|| (Utils.isStringProp(sortableDisable) && sortableDisable)
|| (Utils.isStringProp(sortableToggle) && sortableToggle) || undefined,
'data-card': (Utils.isStringProp(cardOpen) && cardOpen)
|| (Utils.isStringProp(cardClose) && cardClose) || undefined,
};
},
linkActionsClasses: function linkActionsClasses(props) {
var searchbarEnable = props.searchbarEnable;
var searchbarDisable = props.searchbarDisable;
var searchbarClear = props.searchbarClear;
var searchbarToggle = props.searchbarToggle;
var panelOpen = props.panelOpen;
var panelClose = props.panelClose;
var popupOpen = props.popupOpen;
var popupClose = props.popupClose;
var actionsClose = props.actionsClose;
var actionsOpen = props.actionsOpen;
var popoverOpen = props.popoverOpen;
var popoverClose = props.popoverClose;
var loginScreenOpen = props.loginScreenOpen;
var loginScreenClose = props.loginScreenClose;
var sheetOpen = props.sheetOpen;
var sheetClose = props.sheetClose;
var sortableEnable = props.sortableEnable;
var sortableDisable = props.sortableDisable;
var sortableToggle = props.sortableToggle;
var cardOpen = props.cardOpen;
var cardClose = props.cardClose;
var menuClose = props.menuClose;
return {
'searchbar-enable': searchbarEnable || searchbarEnable === '',
'searchbar-disable': searchbarDisable || searchbarDisable === '',
'searchbar-clear': searchbarClear || searchbarClear === '',
'searchbar-toggle': searchbarToggle || searchbarToggle === '',
'panel-close': panelClose || panelClose === '',
'panel-open': panelOpen || panelOpen === '',
'popup-close': popupClose || popupClose === '',
'popup-open': popupOpen || popupOpen === '',
'actions-close': actionsClose || actionsClose === '',
'actions-open': actionsOpen || actionsOpen === '',
'popover-close': popoverClose || popoverClose === '',
'popover-open': popoverOpen || popoverOpen === '',
'sheet-close': sheetClose || sheetClose === '',
'sheet-open': sheetOpen || sheetOpen === '',
'login-screen-close': loginScreenClose || loginScreenClose === '',
'login-screen-open': loginScreenOpen || loginScreenOpen === '',
'sortable-enable': sortableEnable || sortableEnable === '',
'sortable-disable': sortableDisable || sortableDisable === '',
'sortable-toggle': sortableToggle || sortableToggle === '',
'card-close': cardClose || cardClose === '',
'card-open': cardOpen || cardOpen === '',
'menu-close': menuClose || menuClose === '',
};
},
};
function __vueComponentProps (component) {
var props = {};
var $props = component.$props;
Object.keys($props).forEach(function (propKey) {
if (typeof $props[propKey] !== 'undefined') { props[propKey] = $props[propKey]; }
});
var children = [];
Object.keys(component.$slots).forEach(function (slotName) {
children.push.apply(children, component.$slots[slotName]);
});
props.children = children;
return props;
}
var f7AccordionContent = {
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
name: 'f7-accordion-content',
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'accordion-item-content', Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
function __vueComponentDispatchEvent (component, events) {
var args = [], len = arguments.length - 2;
while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ];
var self = component;
events.split(' ').forEach(function (event) {
self.$emit.apply(self, [ event ].concat( args ));
});
}
var f7AccordionItem = {
name: 'f7-accordion-item',
props: Object.assign({
id: [String, Number],
opened: Boolean
}, Mixins.colorProps),
created: function created() {
Utils.bindMethods(this, 'onBeforeOpen onOpen onOpened onBeforeClose onClose onClosed'.split(' '));
},
mounted: function mounted() {
var self = this;
var el = self.$refs.el;
if (!el) { return; }
el.addEventListener('accordion:beforeopen', self.onBeforeOpen);
el.addEventListener('accordion:open', self.onOpen);
el.addEventListener('accordion:opened', self.onOpened);
el.addEventListener('accordion:beforeclose', self.onBeforeClose);
el.addEventListener('accordion:close', self.onClose);
el.addEventListener('accordion:closed', self.onClosed);
},
beforeDestroy: function beforeDestroy() {
var self = this;
var el = self.$refs.el;
if (!el) { return; }
el.removeEventListener('accordion:beforeopen', self.onBeforeOpen);
el.removeEventListener('accordion:open', self.onOpen);
el.removeEventListener('accordion:opened', self.onOpened);
el.removeEventListener('accordion:beforeclose', self.onBeforeClose);
el.removeEventListener('accordion:close', self.onClose);
el.removeEventListener('accordion:closed', self.onClosed);
},
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var opened = props.opened;
var classes = Utils.classNames(className, 'accordion-item', {
'accordion-item-opened': opened
}, Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
ref: 'el',
attrs: {
id: id
}
}, [this.$slots['default']]);
},
methods: {
onBeforeOpen: function onBeforeOpen(event) {
this.dispatchEvent('accordionBeforeOpen accordion:beforeopen', event, event.detail.prevent);
},
onOpen: function onOpen(event) {
this.dispatchEvent('accordionOpen accordion:open', event);
},
onOpened: function onOpened(event) {
this.dispatchEvent('accordionOpened accordion:opened', event);
},
onBeforeClose: function onBeforeClose(event) {
this.dispatchEvent('accordionBeforeClose accordion:beforeclose', event, event.detail.prevent);
},
onClose: function onClose(event) {
this.dispatchEvent('accordionClose accordion:close', event);
},
onClosed: function onClosed(event) {
this.dispatchEvent('accordionClosed accordion:closed', event);
},
dispatchEvent: function dispatchEvent(events) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
__vueComponentDispatchEvent.apply(void 0, [ this, events ].concat( args ));
}
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7AccordionToggle = {
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
name: 'f7-accordion-toggle',
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'accordion-item-toggle', Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7Accordion = {
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
name: 'f7-accordion',
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'accordion-list', Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7ActionsButton = {
name: 'f7-actions-button',
props: Object.assign({
id: [String, Number],
bold: Boolean,
close: {
type: Boolean,
default: true
}
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var id = props.id;
var className = props.className;
var style = props.style;
var bold = props.bold;
var mediaEl;
if (self.$slots.media && self.$slots.media.length) {
mediaEl = _h('div', {
class: 'actions-button-media'
}, [this.$slots['media']]);
}
var classes = Utils.classNames(className, {
'actions-button': true,
'actions-button-bold': bold
}, Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
ref: 'el',
attrs: {
id: id
}
}, [mediaEl, _h('div', {
class: 'actions-button-text'
}, [this.$slots['default']])]);
},
created: function created() {
Utils.bindMethods(this, ['onClick']);
},
mounted: function mounted() {
this.$refs.el.addEventListener('click', this.onClick);
},
beforeDestroy: function beforeDestroy() {
this.$refs.el.removeEventListener('click', this.onClick);
},
methods: {
onClick: function onClick(event) {
var self = this;
var $$ = self.$$;
var el = self.$refs.el;
if (self.props.close && self.$f7 && el) {
self.$f7.actions.close($$(el).parents('.actions-modal'));
}
self.dispatchEvent('click', event);
},
dispatchEvent: function dispatchEvent(events) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
__vueComponentDispatchEvent.apply(void 0, [ this, events ].concat( args ));
}
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7ActionsGroup = {
name: 'f7-actions-group',
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'actions-group', Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7ActionsLabel = {
name: 'f7-actions-label',
props: Object.assign({
id: [String, Number],
bold: Boolean
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var className = props.className;
var id = props.id;
var style = props.style;
var bold = props.bold;
var classes = Utils.classNames(className, 'actions-label', {
'actions-button-bold': bold
}, Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
ref: 'el',
attrs: {
id: id
}
}, [this.$slots['default']]);
},
created: function created() {
Utils.bindMethods(this, ['onClick']);
},
mounted: function mounted() {
this.$refs.el.addEventListener('click', this.onClick);
},
beforeDestroy: function beforeDestroy() {
this.$refs.el.removeEventListener('click', this.onClick);
},
methods: {
onClick: function onClick(event) {
this.dispatchEvent('click', event);
},
dispatchEvent: function dispatchEvent(events) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
__vueComponentDispatchEvent.apply(void 0, [ this, events ].concat( args ));
}
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7Actions = {
name: 'f7-actions',
props: Object.assign({
id: [String, Number],
opened: Boolean,
grid: Boolean,
convertToPopover: Boolean,
forceToPopover: Boolean,
target: [String, Object],
closeByBackdropClick: Boolean,
closeByOutsideClick: Boolean
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var className = props.className;
var id = props.id;
var style = props.style;
var grid = props.grid;
var classes = Utils.classNames(className, 'actions-modal', {
'actions-grid': grid
}, Mixins.colorClasses(props));
return _h('div', {
style: style,
ref: 'el',
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
watch: {
'props.opened': function watchOpened(opened) {
var self = this;
if (!self.f7Actions) { return; }
if (opened) {
self.f7Actions.open();
} else {
self.f7Actions.close();
}
}
},
created: function created() {
Utils.bindMethods(this, ['onOpen', 'onOpened', 'onClose', 'onClosed']);
},
mounted: function mounted() {
var self = this;
var el = self.$refs.el;
if (!el) { return; }
el.addEventListener('actions:open', self.onOpen);
el.addEventListener('actions:opened', self.onOpened);
el.addEventListener('actions:close', self.onClose);
el.addEventListener('actions:closed', self.onClosed);
var props = self.props;
var grid = props.grid;
var target = props.target;
var convertToPopover = props.convertToPopover;
var forceToPopover = props.forceToPopover;
var opened = props.opened;
var closeByBackdropClick = props.closeByBackdropClick;
var closeByOutsideClick = props.closeByOutsideClick;
var actionsParams = {
el: self.$refs.el,
grid: grid
};
if (target) { actionsParams.targetEl = target; }
{
if (typeof self.$options.propsData.convertToPopover !== 'undefined') { actionsParams.convertToPopover = convertToPopover; }
if (typeof self.$options.propsData.forceToPopover !== 'undefined') { actionsParams.forceToPopover = forceToPopover; }
if (typeof self.$options.propsData.closeByBackdropClick !== 'undefined') { actionsParams.closeByBackdropClick = closeByBackdropClick; }
if (typeof self.$options.propsData.closeByOutsideClick !== 'undefined') { actionsParams.closeByOutsideClick = closeByOutsideClick; }
}
self.$f7ready(function () {
self.f7Actions = self.$f7.actions.create(actionsParams);
if (opened) {
self.f7Actions.open(false);
}
});
},
beforeDestroy: function beforeDestroy() {
var self = this;
if (self.f7Actions) { self.f7Actions.destroy(); }
var el = self.$refs.el;
if (!el) { return; }
el.removeEventListener('actions:open', self.onOpen);
el.removeEventListener('actions:opened', self.onOpened);
el.removeEventListener('actions:close', self.onClose);
el.removeEventListener('actions:closed', self.onClosed);
},
methods: {
onOpen: function onOpen(event) {
this.dispatchEvent('actions:open actionsOpen', event);
},
onOpened: function onOpened(event) {
this.dispatchEvent('actions:opened actionsOpened', event);
},
onClose: function onClose(event) {
this.dispatchEvent('actions:close actionsClose', event);
},
onClosed: function onClosed(event) {
this.dispatchEvent('actions:closed actionsClosed', event);
},
open: function open(animate) {
var self = this;
if (!self.$f7) { return undefined; }
return self.$f7.actions.open(self.$refs.el, animate);
},
close: function close(animate) {
var self = this;
if (!self.$f7) { return undefined; }
return self.$f7.actions.close(self.$refs.el, animate);
},
dispatchEvent: function dispatchEvent(events) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
__vueComponentDispatchEvent.apply(void 0, [ this, events ].concat( args ));
}
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var eventsEmitter = {
listeners: {},
on: function on(events, handler) {
events.split(' ').forEach(function (event) {
if (!eventsEmitter.listeners[event]) { eventsEmitter.listeners[event] = []; }
eventsEmitter.listeners[event].unshift(handler);
});
},
off: function off(events, handler) {
events.split(' ').forEach(function (event) {
if (!eventsEmitter.listeners[event]) { return; }
if (typeof handler === 'undefined') {
eventsEmitter.listeners[event] = [];
} else {
eventsEmitter.listeners[event].forEach(function (eventHandler, index) {
if (eventHandler === handler) {
eventsEmitter.listeners[event].splice(index, 1);
}
});
}
});
},
once: function once(events, handler) {
if (typeof handler !== 'function') { return; }
function onceHandler() {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
handler.apply(void 0, args);
eventsEmitter.off(events, onceHandler);
}
eventsEmitter.on(events, onceHandler);
},
emit: function emit(events) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
events.split(' ').forEach(function (event) {
if (eventsEmitter.listeners && eventsEmitter.listeners[event]) {
var handlers = [];
eventsEmitter.listeners[event].forEach(function (eventHandler) {
handlers.push(eventHandler);
});
handlers.forEach(function (eventHandler) {
eventHandler.apply(void 0, args);
});
}
});
},
};
var f7 = {
instance: null,
Framework7: null,
init: function init(rootEl, params, routes) {
if ( params === void 0 ) params = {};
var f7Params = Utils.extend({}, params, {
root: rootEl,
});
if (routes && routes.length && !f7Params.routes) { f7Params.routes = routes; }
f7.instance = new f7.Framework7(f7Params);
if (f7.instance.initialized) {
eventsEmitter.emit('ready', f7.instance);
} else {
f7.instance.on('init', function () {
eventsEmitter.emit('ready', f7.instance);
});
}
},
ready: function ready(callback) {
if (!callback) { return; }
if (f7.instance) { callback(f7.instance); }
else {
eventsEmitter.once('ready', callback);
}
},
routers: {
views: [],
tabs: [],
modals: null,
},
};
function __vueComponentSetState (component, updater, callback) {
var self = component;
var newState;
if (typeof updater === 'function') {
newState = updater(self.state, self.props);
} else {
newState = updater;
}
Object.keys(newState).forEach(function (key) {
self.$set(self.state, key, newState[key]);
});
if (typeof callback === 'function') { callback(); }
}
var RoutableModals = {
name: 'f7-routable-modals',
data: function data() {
var state = (function () {
return {
modals: []
};
})();
return {
state: state
};
},
render: function render() {
var _h = this.$createElement;
return _h('div', {
ref: 'el',
class: 'framework7-modals'
}, [this.state.modals.map(function (modal) {
var ModalComponent = modal.component;
{
return _h(ModalComponent, {
key: modal.id,
props: modal.props
});
}
})]);
},
updated: function updated() {
var self = this;
if (!self.routerData) { return; }
eventsEmitter.emit('modalsRouterDidUpdate', self.routerData);
},
beforeDestroy: function beforeDestroy() {
var self = this;
if (!self.routerData) { return; }
f7.routers.modals = null;
self.routerData = null;
delete self.routerData;
},
mounted: function mounted() {
var self = this;
var el = self.$refs.el;
self.setState({
modals: []
});
self.routerData = {
el: el,
component: self
};
f7.routers.modals = self.routerData;
},
methods: {
setState: function setState(updater, callback) {
__vueComponentSetState(this, updater, callback);
}
}
};
var f7App = {
name: 'f7-app',
props: Object.assign({
id: [String, Number],
params: Object,
routes: Array
}, Mixins.colorProps),
data: function data() {
var props = __vueComponentProps(this);
var state = (function () {
return {
modals: []
};
})();
return {
state: state
};
},
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var id = props.id;
var style = props.style;
var className = props.className;
var classes = Utils.classNames(className, 'framework7-root', Mixins.colorClasses(props));
return _h('div', {
ref: 'el',
style: style,
class: classes,
attrs: {
id: id || 'framework7-root'
}
}, [this.$slots['default'], _h(RoutableModals)]);
},
mounted: function mounted() {
var self = this;
var ref = self.props;
var params = ref.params; if ( params === void 0 ) params = {};
var routes = ref.routes;
var el = self.$refs.el;
var parentEl = el.parentNode;
if (parentEl && parentEl !== document.body && parentEl.parentNode === document.body) {
parentEl.style.height = '100%';
}
f7.init(el, params, routes);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var F7Badge = {
name: 'f7-badge',
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'badge', Mixins.colorClasses(props));
return _h('span', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7BlockFooter = {
name: 'f7-block-footer',
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'block-footer', Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7BlockHeader = {
name: 'f7-block-header',
props: Object.assign({
id: [String, Number]
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'block-header', Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7BlockTitle = {
name: 'f7-block-title',
props: Object.assign({
id: [String, Number],
large: Boolean,
medium: Boolean
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var props = this.props;
var className = props.className;
var id = props.id;
var style = props.style;
var large = props.large;
var medium = props.medium;
var classes = Utils.classNames(className, 'block-title', {
'block-title-large': large,
'block-title-medium': medium
}, Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
attrs: {
id: id
}
}, [this.$slots['default']]);
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var f7Block = {
name: 'f7-block',
props: Object.assign({
id: [String, Number],
inset: Boolean,
tabletInset: Boolean,
strong: Boolean,
tabs: Boolean,
tab: Boolean,
tabActive: Boolean,
accordionList: Boolean,
noHairlines: Boolean,
noHairlinesMd: Boolean,
noHairlinesIos: Boolean
}, Mixins.colorProps),
created: function created() {
Utils.bindMethods(this, ['onTabShow', 'onTabHide']);
},
mounted: function mounted() {
var el = this.$refs.el;
if (!el) { return; }
el.addEventListener('tab:show', this.onTabShow);
el.addEventListener('tab:hide', this.onTabHide);
},
beforeDestroy: function beforeDestroy() {
var el = this.$refs.el;
if (!el) { return; }
el.removeEventListener('tab:show', this.onTabShow);
el.removeEventListener('tab:hide', this.onTabHide);
},
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var className = props.className;
var inset = props.inset;
var strong = props.strong;
var accordionList = props.accordionList;
var tabletInset = props.tabletInset;
var tabs = props.tabs;
var tab = props.tab;
var tabActive = props.tabActive;
var noHairlines = props.noHairlines;
var noHairlinesIos = props.noHairlinesIos;
var noHairlinesMd = props.noHairlinesMd;
var id = props.id;
var style = props.style;
var classes = Utils.classNames(className, 'block', {
inset: inset,
'block-strong': strong,
'accordion-list': accordionList,
'tablet-inset': tabletInset,
tabs: tabs,
tab: tab,
'tab-active': tabActive,
'no-hairlines': noHairlines,
'no-hairlines-md': noHairlinesMd,
'no-hairlines-ios': noHairlinesIos
}, Mixins.colorClasses(props));
return _h('div', {
style: style,
class: classes,
ref: 'el',
attrs: {
id: id
}
}, [this.$slots['default']]);
},
methods: {
onTabShow: function onTabShow(event) {
this.dispatchEvent('tabShow tab:show', event);
},
onTabHide: function onTabHide(event) {
this.dispatchEvent('tabHide tab:hide', event);
},
dispatchEvent: function dispatchEvent(events) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
__vueComponentDispatchEvent.apply(void 0, [ this, events ].concat( args ));
}
},
computed: {
props: function props() {
return __vueComponentProps(this);
}
}
};
var F7Icon = {
name: 'f7-icon',
props: Object.assign({
id: [String, Number],
material: String,
f7: String,
ion: String,
fa: String,
icon: String,
ifMd: String,
ifIos: String,
ios: String,
md: String,
tooltip: String,
size: [String, Number]
}, Mixins.colorProps),
render: function render() {
var _h = this.$createElement;
var self = this;
var props = self.props;
var id = props.id;
var style = props.style;
return _h('i', {
ref: 'el',
style: Utils.extend({
fontSize: self.sizeComputed
}, style),
class: self.classes,
attrs: {
id: id
}
}, [self.iconTextComputed, this.$slots['default']]);
},
watch: {
'props.tooltip': function watchTooltip(newText) {
var self = this;
if (!newText || !self.f7Tooltip) { return; }
self.f7Tooltip.setText(newText);
}
},
mounted: function mounted() {
var self = this;
var el = self.$refs.el;
if (!el) { return; }
var ref = self.props;
var tooltip = ref.tooltip;
if (!tooltip) { return; }
self.$f7ready(function (f7) {
self.f7Tooltip = f7.tooltip.create({
targetEl: el,
text: tooltip
});
});
},
beforeDestroy: function beforeDestroy() {
var self = this;
if (self.f7Tooltip && self.f7Tooltip.destroy) {
self.f7Tooltip.destroy();
self.f7Tooltip = null;
delete self.f7Tooltip;
}
},
computed: {
sizeComputed: function sizeComputed() {
var self = this;
var size = self.props.size;
if (typeof size === 'number' || parseFloat(size) === size * 1) {
size = size + "px";
}
return size;
},
iconTextComputed: function iconTextComputed() {
var self = this;
var ref = self.props;
var material = ref.material;
var f7 = ref.f7;
var ifMd = ref.ifMd;
var ifIos = ref.ifIos;
var md = ref.md;
var ios = ref.ios;
var text = material || f7;
var mdIcon = ifMd || md;
var iosIcon = ifIos || ios;
if (mdIcon && self.$theme.md && (mdIcon.indexOf('material:') >= 0 || mdIcon.indexOf('f7:') >= 0)) {
text = mdIcon.split(':')[1];
} else if (iosIcon && self.$theme.ios && (iosIcon.indexOf('material:') >= 0 || iosIcon.indexOf('f7:') >= 0)) {
text = iosIcon.split(':')[1];
}
return text;
},
classes: function classes() {
var classes = {
icon: true
};
var self = this;
var props = self.props;
var ifMd = props.ifMd;
var ifIos = props.ifIos;
var material = props.material;
var f7 = props.f7;
var fa = props.fa;
var ion = props.ion;
var icon = props.icon;
var md = props.md;
var ios = props.ios;
var className = props.className;
var mdIcon = ifMd || md;
var iosIcon = ifIos || ios;
if (mdIcon || iosIcon) {
var parts = (self.$theme.md ? mdIcon : iosIcon).split(':');
var prop = parts[0];
var value = parts[1];
if (prop === 'material' || prop === 'fa' || prop === 'f7') {
classes.fa = prop === 'fa';
classes['material-icons'] = prop === 'material';
classes['f7-icons'] = prop === 'f7';
}
if (prop === 'fa' || prop === 'ion') {
classes[(prop + "-" + value)] = true;
}
if (prop === 'icon') {
classes[value] = true;
}
} else {
classes = {
icon: true,
'material-icons': material,
'f7-icons': f7,
fa: fa
};
if (ion) { classes[("ion-" + ion)] = true; }
if (fa) { classes[("fa-" + fa)] = true; }
if (icon) { classes[icon] = true; }
}
return Utils.classNames(className, classes, Mixins.colorClasses(props));
},
props: function props() {
return __vueComponentProps(this);
}
}
};
function __vueComponentTransformJSXProps (props) {
if (!props) { return props; }
var nestedPropsKeys = ('style class domProps slot key ref attrs on props').split(' ');
Object.keys(props).forEach(function (key) {
if (key === 'className') {
props.class = props.className;
delete props.className;
return;
} else if (key === 'dangerouslySetInnerHTML') {
if (!props.domProps) { props.domProps = {}; }
props.domProps.innerHTML = props[key];
if (props.domProps.innerHTML && props.domProps.innerHTML.__html) {
props.domProps.innerHTML = props.domProps.innerHTML.__html;
}
delete props.dangerouslySetInnerHTML;
return;
} else if (key.match(/^on?([A-Z])/)) {
if (!props.on) { props.on = {}; }
var newKey = key.replace(/(^on?)([A-Z])/, function (found, first, second) { return second.toLowerCase(); });
props.on[newKey] = props[key];
delete props[key];
return;
}
if (nestedPropsKeys.indexOf(key) >= 0) {
return;
}
if (!props.attrs) {
props.attrs = {};
}
if (!props.attrs[key]) {
props.attrs[key] = props[key];
delete props[key];
}
});
return props;
}
var f7Button = {
name: 'f7-button',
props: Object.assign({
id: [String, Number],
noFastclick: Boolean,
noFastClick: Boolean,
text: String,
tabLink: [Boolean, String],
tabLinkActive: Boolean,
href: {
type: [String, Boolean],
default: '#'
},
target: String,
round: Boolean,
roundMd: Boolean,
roundIos: Boolean,
fill: Boolean,
fillMd: Boolean,
fillIos: Boolean,
large: Boolean,
largeMd: Boolean,
largeIos: Boolean,
small: Boolean,
smallMd: Boolean,
smallIos: Boolean,
raised: Boolean,
raisedMd: Boolean,
raisedIos: Boolean,
outline: Boolean,
outlineMd: Boolean,
outlineIos: Boolean,
active: Boolean,
disabled: Boolean,
tooltip: String
}, Mixins.colorProps, Mixins.linkIconProps, Mixins.linkRouterProps, Mixins.linkActionsProps),
render: function render() {
var _h = this.$createElement;
var self = this;
var iconEl;
var textEl;
var props = self.props;
var text = props.text;
var icon = props.icon;
var iconMaterial = props.iconMaterial;
var iconIon = props.iconIon;
var iconFa = props.iconFa;
var iconF7 = props.iconF7;
var iconIfMd = props.iconIfMd;
var iconIfIos = props.iconIfIos;
var iconMd = props.iconMd;
var iconIos = props.iconIos;
var iconColor = props.iconColor;
var iconSize = props.iconSize;
var id = props.id;
var style = props.style;
if (text) {
textEl = _h('span', [text]);
}
var mdThemeIcon = iconIfMd || iconMd;
var iosThemeIcon = iconIfIos || iconIos;
if (icon || iconMaterial || iconIon || iconFa || iconF7 || mdThemeIcon || iosThemeIcon) {
iconEl = _h(F7Icon, {
attrs: {
material: iconMaterial,
ion: iconIon,
fa: iconFa,
f7: iconF7,
icon: icon,
md: mdThemeIcon,
ios: iosThemeIcon,
color: iconColor,
size: iconSize
}
});
}
return _h('a', __vueComponentTransformJSXProps(Object.assign({
ref: 'el',
style: style,
class: self.classes
}, self.attrs, {
attrs: {
id: id
}
})), [iconEl, textEl, this.$slots['default']]);
},
computed: {
attrs: function attrs() {
var self = this;
var props = self.props;
var href = props.href;
var target = props.target;
var tabLink = props.tabLink;
var hrefComputed = href;
if (href === true) { hrefComputed = '#'; }
if (href === false) { hrefComputed = undefined; }
return Utils.extend({
href: hrefComputed,
target: target,
'data-tab': Utils.isStringProp(tabLink) && tabLink || undefined
}, Mixins.linkRouterAttrs(props), Mixins.linkActionsAttrs(props));
},
classes: function classes() {
var self = this;
var props = self.props;
var noFastclick = props.noFastclick;
var noFastClick = props.noFastClick;
var tabLink = props.tabLink;
var tabLinkActive = props.tabLinkActive;
var round = props.round;
var roundIos = props.roundIos;
var roundMd = props.roundMd;
var fill = props.fill;
var fillIos = props.fillIos;
var fillMd = props.fillMd;
var large = props.large;
var largeIos = props.largeIos;
var largeMd = props.largeMd;
var small = props.small;
var smallIos = props.smallIos;
var smallMd = props.smallMd;
var raised = props.raised;
var raisedIos = props.raisedIos;
var raisedMd = props.raisedMd;
var active = props.active;
var outline = props.outline;
var outlineIos = props.outlineIos;
var outlineMd = props.outlineMd;
var disabled = props.disabled;
var className = props.className;
return Utils.classNames(className, 'button', {
'tab-link': tabLink || tabLink === '',
'tab-link-active': tabLinkActive,
'no-fastclick': noFastclick || noFastClick,
'button-round': round,
'button-round-ios': roundIos,
'button-round-md': roundMd,
'button-fill': fill,
'button-fill-ios': fillIos,
'button-fill-md': fillMd,
'button-large': large,
'button-large-ios': largeIos,
'button-large-md': largeMd,
'button-small': small,
'button-small-ios': smallIos,
'button-small-md': smallMd,
'button-raised': raised,
'button-raised-ios': raisedIos,
'button-raised-md': raisedMd,