UNPKG

framework7-vue

Version:

Build full featured iOS & Android apps using Framework7 & Vue

1,693 lines (1,506 loc) 341 kB
/** * 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,