module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"5c89b42d-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/Scope.vue?vue&type=template&id=4c74502b&scoped=true&": /*!***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"5c89b42d-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/Scope.vue?vue&type=template&id=4c74502b&scoped=true& ***! \***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); var render = function() { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c( "svg", { staticClass: "thumbViewClass", on: { click: _vm.updateMainViewPan, mousemove: _vm.updateMainViewPan } }, [ _c("rect", { staticClass: "scope", attrs: { x: _vm.x, y: _vm.y, width: _vm.width, height: _vm.height } }) ] ) } var staticRenderFns = [] render._withStripped = true /***/ }), /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"5c89b42d-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/SvgPanZoom.vue?vue&type=template&id=806a3476&": /*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"5c89b42d-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/SvgPanZoom.vue?vue&type=template&id=806a3476& ***! \****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); var render = function() { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c( "div", [ _vm._t("default"), _vm._v(" "), _vm.has_thumbnail ? _c( "SvgPanZoomThumbnail", { attrs: { onThumbnailShown: _vm.onThumbnailShown, mainSPZ: _vm.spz, bus: _vm.bus } }, [_vm._t("thumbnail")], 2 ) : _vm._e() ], 2 ) } var staticRenderFns = [] render._withStripped = true /***/ }), /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"5c89b42d-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/SvgPanZoomThumbnail.vue?vue&type=template&id=4cd02652&": /*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"5c89b42d-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/SvgPanZoomThumbnail.vue?vue&type=template&id=4cd02652& ***! \*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; }); var render = function() { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c( "div", { on: { wheel: _vm.zoomMain } }, [ _c( "SPZ", { staticClass: "thumbnail", attrs: { zoomEnabled: false, panEnabled: false, controlIconsEnabled: false, dblClickZoomEnabled: false, preventMouseEventsDefault: true }, on: { svgpanzoom: _vm.thumbnailSPZcreated } }, [_vm._t("default")], 2 ), _vm._v(" "), _c("Scope", { attrs: { bus: _vm.bus, mainSPZ: _vm.mainSPZ, thumbnailSPZ: _vm.thumbnailSPZ } }) ], 1 ) } var staticRenderFns = [] render._withStripped = true /***/ }), /***/ "./node_modules/poi/lib/webpack/babel-loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/Scope.vue?vue&type=script&lang=js&": /*!*************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/poi/lib/webpack/babel-loader.js??ref--1-0!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/Scope.vue?vue&type=script&lang=js& ***! \*************************************************************************************************************************************************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); // // // // // // function updateScope() { var main = this.mainSPZ; var thumb = this.thumbnailSPZ; if (!main || !thumb) return; var mainPanX = main.getPan().x, mainPanY = main.getPan().y, mainWidth = main.getSizes().width, mainHeight = main.getSizes().height, mainZoom = main.getSizes().realZoom, thumbPanX = thumb.getPan().x, thumbPanY = thumb.getPan().y, thumbZoom = thumb.getSizes().realZoom; var thumByMainZoomRatio = thumbZoom / mainZoom; var scopeX = thumbPanX - mainPanX * thumByMainZoomRatio; var scopeY = thumbPanY - mainPanY * thumByMainZoomRatio; var scopeWidth = mainWidth * thumByMainZoomRatio; var scopeHeight = mainHeight * thumByMainZoomRatio; this.x = scopeX + 1; this.y = scopeY + 1; this.width = scopeWidth - 2; this.height = scopeHeight - 2; } ; function updateMainViewPan(evt) { if (evt.which == 0 && evt.button == 0) { return false; } var main = this.mainSPZ; var thumb = this.thumbnailSPZ; var dim = this.$el.getBoundingClientRect(), mainWidth = main.getSizes().width, mainHeight = main.getSizes().height, mainZoom = main.getSizes().realZoom, thumbWidth = thumb.getSizes().width, thumbHeight = thumb.getSizes().height, thumbZoom = thumb.getSizes().realZoom; var thumbPanX = evt.clientX - dim.left - thumbWidth / 2; var thumbPanY = evt.clientY - dim.top - thumbHeight / 2; var mainPanX = -thumbPanX * mainZoom / thumbZoom; var mainPanY = -thumbPanY * mainZoom / thumbZoom; main.pan({ x: mainPanX, y: mainPanY }); } /* harmony default export */ __webpack_exports__["default"] = ({ props: ['bus', 'mainSPZ', 'thumbnailSPZ'], data: function data() { return { x: 0, y: 0, width: 0, height: 0 }; }, watch: { mainSPZ: function mainSPZ() { updateScope.call(this); }, thumbnailSPZ: function thumbnailSPZ() { updateScope.call(this); } }, mounted: function mounted() { var _this = this; var up = updateScope.bind(this); ['mainZoom', 'mainPan', 'thumbnailCreated'].forEach(function (event) { return _this.bus.$on(event, up); }); up(); }, methods: { updateMainViewPan: updateMainViewPan } }); /***/ }), /***/ "./node_modules/poi/lib/webpack/babel-loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/SvgPanZoom.vue?vue&type=script&lang=js&": /*!******************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/poi/lib/webpack/babel-loader.js??ref--1-0!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/SvgPanZoom.vue?vue&type=script&lang=js& ***! \******************************************************************************************************************************************************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var svg_pan_zoom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! svg-pan-zoom */ "./node_modules/svg-pan-zoom/src/svg-pan-zoom.js"); /* harmony import */ var svg_pan_zoom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(svg_pan_zoom__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./props */ "./src/props.js"); /* harmony import */ var _EventBus__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./EventBus */ "./src/EventBus.js"); /* harmony import */ var _SvgPanZoomThumbnail_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./SvgPanZoomThumbnail.vue */ "./src/SvgPanZoomThumbnail.vue"); // // // // // // // // // // // // // // // // /* harmony default export */ __webpack_exports__["default"] = ({ props: _props__WEBPACK_IMPORTED_MODULE_1__["default"], components: { SvgPanZoomThumbnail: _SvgPanZoomThumbnail_vue__WEBPACK_IMPORTED_MODULE_3__["default"] }, computed: { has_thumbnail: function has_thumbnail() { return this.$slots.thumbnail; }, options: function options() { var _this = this; var options = {}; var is_defined = function is_defined(k) { return _this[k] !== undefined; }; Object.keys(_props__WEBPACK_IMPORTED_MODULE_1__["default"]).filter(is_defined).forEach(function (k) { return options[k] = _this[k]; }); return options; } }, mounted: function mounted() { var _this2 = this; var options = {}; Object.keys(_props__WEBPACK_IMPORTED_MODULE_1__["default"]).filter(function (k) { return _this2[k] !== undefined; }).forEach(function (k) { return options[k] = _this2[k]; }); options.onZoom = function () { _this2.bus.$emit('mainZoom'); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (_this2.onZoom) _this2.onZoom(args); }; options.onPan = function () { _this2.bus.$emit('mainPan'); for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } if (_this2.onPan) _this2.onPan(args); }; this.spz = svg_pan_zoom__WEBPACK_IMPORTED_MODULE_0___default()(this.$slots["default"][0].elm, options); this.$emit('svgpanzoom', this.spz); }, data: function data() { return { spz: null, bus: Object(_EventBus__WEBPACK_IMPORTED_MODULE_2__["EventBus"])() }; } }); /***/ }), /***/ "./node_modules/poi/lib/webpack/babel-loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/SvgPanZoomThumbnail.vue?vue&type=script&lang=js&": /*!***************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/poi/lib/webpack/babel-loader.js??ref--1-0!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/SvgPanZoomThumbnail.vue?vue&type=script&lang=js& ***! \***************************************************************************************************************************************************************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Scope_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Scope.vue */ "./src/Scope.vue"); // // // // // // // // // // // // // // // // /* harmony default export */ __webpack_exports__["default"] = ({ props: ['onThumbnailShown', 'mainSPZ', 'bus'], beforeCreate: function beforeCreate() { this.$options.components.SPZ = __webpack_require__(/*! ./SvgPanZoom.vue */ "./src/SvgPanZoom.vue")["default"]; }, methods: { zoomMain: function zoomMain(evt) { this.mainSPZ[event.deltaY < 0 ? 'zoomIn' : 'zoomOut'](); }, thumbnailSPZcreated: function thumbnailSPZcreated(spz) { this.thumbnailSPZ = spz; this.bus.$emit('thumbnailCreated', spz); } }, mounted: function mounted() { if (this.onThumbnailShown) { this.onThumbnailShown(); } }, components: { Scope: _Scope_vue__WEBPACK_IMPORTED_MODULE_0__["default"] }, data: function data() { return { thumbnailSPZ: null }; } }); /***/ }), /***/ "./node_modules/poi/node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/Scope.vue?vue&type=style&index=0&id=4c74502b&scoped=true&lang=css&": /*!**********************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/poi/node_modules/css-loader??ref--3-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/Scope.vue?vue&type=style&index=0&id=4c74502b&scoped=true&lang=css& ***! \**********************************************************************************************************************************************************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(/*! ../node_modules/poi/node_modules/css-loader/lib/css-base.js */ "./node_modules/poi/node_modules/css-loader/lib/css-base.js")(true); // imports // module exports.push([module.i, "\n.scope[data-v-4c74502b] {\n fill: red;\n fill-opacity: 0.1;\n stroke: red;\n stroke-width: 2px;\n}\nsvg.thumbViewClass[data-v-4c74502b] {\n border: 1px solid black;\n position: absolute;\n bottom: 5px;\n left: 5px;\n width: 20%;\n height: 30%;\n margin: 3px;\n padding: 3px;\n overflow: hidden;\n z-index: 120;\n}\n", "", {"version":3,"sources":["/home/yanick/work/javascript/vue-svg-pan-zoom/src/src/Scope.vue"],"names":[],"mappings":";AAiFA;IACA,UAAA;IACA,kBAAA;IACA,YAAA;IACA,kBAAA;CACA;AAEA;IACA,wBAAA;IACA,mBAAA;IACA,YAAA;IACA,UAAA;IACA,WAAA;IACA,YAAA;IACA,YAAA;IACA,aAAA;IACA,iBAAA;IACA,aAAA;CACA","file":"Scope.vue?vue&type=style&index=0&id=4c74502b&scoped=true&lang=css&","sourcesContent":["\n\n\n\n\n"],"sourceRoot":""}]); // exports /***/ }), /***/ "./node_modules/poi/node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/SvgPanZoomThumbnail.vue?vue&type=style&index=0&lang=css&": /*!************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/poi/node_modules/css-loader??ref--3-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/SvgPanZoomThumbnail.vue?vue&type=style&index=0&lang=css& ***! \************************************************************************************************************************************************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(/*! ../node_modules/poi/node_modules/css-loader/lib/css-base.js */ "./node_modules/poi/node_modules/css-loader/lib/css-base.js")(true); // imports // module exports.push([module.i, "\n.thumbView {\n z-index: 110;\n background: white;\n}\n.thumbnail {\n position: absolute;\n bottom: 5px;\n left: 5px;\n width: 20%;\n height: 30%;\n margin: 3px;\n padding: 3px;\n overflow: hidden;\n z-index: 120;\n}\n.thumbnail svg {\n width: 100% !important;\n height: 100% !important;\n}\n\n", "", {"version":3,"sources":["/home/yanick/work/javascript/vue-svg-pan-zoom/src/src/SvgPanZoomThumbnail.vue"],"names":[],"mappings":";AA8CA;IACA,aAAA;IACA,kBAAA;CACA;AAEA;IACA,mBAAA;IACA,YAAA;IACA,UAAA;IACA,WAAA;IACA,YAAA;IACA,YAAA;IACA,aAAA;IACA,iBAAA;IACA,aAAA;CACA;AAEA;MACA,uBAAA;MACA,wBAAA;CACA","file":"SvgPanZoomThumbnail.vue?vue&type=style&index=0&lang=css&","sourcesContent":["\n\n\n\n\n"],"sourceRoot":""}]); // exports /***/ }), /***/ "./node_modules/poi/node_modules/css-loader/lib/css-base.js": /*!******************************************************************!*\ !*** ./node_modules/poi/node_modules/css-loader/lib/css-base.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ // css base code, injected by the css-loader module.exports = function(useSourceMap) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = cssWithMappingToString(item, useSourceMap); if(item[2]) { return "@media " + item[2] + "{" + content + "}"; } else { return content; } }).join(""); }; // import a list of modules into the list list.i = function(modules, mediaQuery) { if(typeof modules === "string") modules = [[null, modules, ""]]; var alreadyImportedModules = {}; for(var i = 0; i < this.length; i++) { var id = this[i][0]; if(typeof id === "number") alreadyImportedModules[id] = true; } for(i = 0; i < modules.length; i++) { var item = modules[i]; // skip already imported module // this implementation is not 100% perfect for weird media query combinations // when a module is imported multiple times with different media queries. // I hope this will never occur (Hey this way we have smaller bundles) if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { if(mediaQuery && !item[2]) { item[2] = mediaQuery; } else if(mediaQuery) { item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; } list.push(item); } } }; return list; }; function cssWithMappingToString(item, useSourceMap) { var content = item[1] || ''; var cssMapping = item[3]; if (!cssMapping) { return content; } if (useSourceMap && typeof btoa === 'function') { var sourceMapping = toComment(cssMapping); var sourceURLs = cssMapping.sources.map(function (source) { return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' }); return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); } return [content].join('\n'); } // Adapted from convert-source-map (MIT) function toComment(sourceMap) { // eslint-disable-next-line no-undef var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; return '/*# ' + data + ' */'; } /***/ }), /***/ "./node_modules/svg-pan-zoom/src/control-icons.js": /*!********************************************************!*\ !*** ./node_modules/svg-pan-zoom/src/control-icons.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var SvgUtils = __webpack_require__(/*! ./svg-utilities */ "./node_modules/svg-pan-zoom/src/svg-utilities.js"); module.exports = { enable: function(instance) { // Select (and create if necessary) defs var defs = instance.svg.querySelector('defs') if (!defs) { defs = document.createElementNS(SvgUtils.svgNS, 'defs') instance.svg.appendChild(defs) } // Check for style element, and create it if it doesn't exist var styleEl = defs.querySelector('style#svg-pan-zoom-controls-styles'); if (!styleEl) { var style = document.createElementNS(SvgUtils.svgNS, 'style') style.setAttribute('id', 'svg-pan-zoom-controls-styles') style.setAttribute('type', 'text/css') style.textContent = '.svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }' defs.appendChild(style) } // Zoom Group var zoomGroup = document.createElementNS(SvgUtils.svgNS, 'g'); zoomGroup.setAttribute('id', 'svg-pan-zoom-controls'); zoomGroup.setAttribute('transform', 'translate(' + ( instance.width - 70 ) + ' ' + ( instance.height - 76 ) + ') scale(0.75)'); zoomGroup.setAttribute('class', 'svg-pan-zoom-control'); // Control elements zoomGroup.appendChild(this._createZoomIn(instance)) zoomGroup.appendChild(this._createZoomReset(instance)) zoomGroup.appendChild(this._createZoomOut(instance)) // Finally append created element instance.svg.appendChild(zoomGroup) // Cache control instance instance.controlIcons = zoomGroup } , _createZoomIn: function(instance) { var zoomIn = document.createElementNS(SvgUtils.svgNS, 'g'); zoomIn.setAttribute('id', 'svg-pan-zoom-zoom-in'); zoomIn.setAttribute('transform', 'translate(30.5 5) scale(0.015)'); zoomIn.setAttribute('class', 'svg-pan-zoom-control'); zoomIn.addEventListener('click', function() {instance.getPublicInstance().zoomIn()}, false) zoomIn.addEventListener('touchstart', function() {instance.getPublicInstance().zoomIn()}, false) var zoomInBackground = document.createElementNS(SvgUtils.svgNS, 'rect'); // TODO change these background space fillers to rounded rectangles so they look prettier zoomInBackground.setAttribute('x', '0'); zoomInBackground.setAttribute('y', '0'); zoomInBackground.setAttribute('width', '1500'); // larger than expected because the whole group is transformed to scale down zoomInBackground.setAttribute('height', '1400'); zoomInBackground.setAttribute('class', 'svg-pan-zoom-control-background'); zoomIn.appendChild(zoomInBackground); var zoomInShape = document.createElementNS(SvgUtils.svgNS, 'path'); zoomInShape.setAttribute('d', 'M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z'); zoomInShape.setAttribute('class', 'svg-pan-zoom-control-element'); zoomIn.appendChild(zoomInShape); return zoomIn } , _createZoomReset: function(instance){ // reset var resetPanZoomControl = document.createElementNS(SvgUtils.svgNS, 'g'); resetPanZoomControl.setAttribute('id', 'svg-pan-zoom-reset-pan-zoom'); resetPanZoomControl.setAttribute('transform', 'translate(5 35) scale(0.4)'); resetPanZoomControl.setAttribute('class', 'svg-pan-zoom-control'); resetPanZoomControl.addEventListener('click', function() {instance.getPublicInstance().reset()}, false); resetPanZoomControl.addEventListener('touchstart', function() {instance.getPublicInstance().reset()}, false); var resetPanZoomControlBackground = document.createElementNS(SvgUtils.svgNS, 'rect'); // TODO change these background space fillers to rounded rectangles so they look prettier resetPanZoomControlBackground.setAttribute('x', '2'); resetPanZoomControlBackground.setAttribute('y', '2'); resetPanZoomControlBackground.setAttribute('width', '182'); // larger than expected because the whole group is transformed to scale down resetPanZoomControlBackground.setAttribute('height', '58'); resetPanZoomControlBackground.setAttribute('class', 'svg-pan-zoom-control-background'); resetPanZoomControl.appendChild(resetPanZoomControlBackground); var resetPanZoomControlShape1 = document.createElementNS(SvgUtils.svgNS, 'path'); resetPanZoomControlShape1.setAttribute('d', 'M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z'); resetPanZoomControlShape1.setAttribute('class', 'svg-pan-zoom-control-element'); resetPanZoomControl.appendChild(resetPanZoomControlShape1); var resetPanZoomControlShape2 = document.createElementNS(SvgUtils.svgNS, 'path'); resetPanZoomControlShape2.setAttribute('d', 'M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z'); resetPanZoomControlShape2.setAttribute('class', 'svg-pan-zoom-control-element'); resetPanZoomControl.appendChild(resetPanZoomControlShape2); return resetPanZoomControl } , _createZoomOut: function(instance){ // zoom out var zoomOut = document.createElementNS(SvgUtils.svgNS, 'g'); zoomOut.setAttribute('id', 'svg-pan-zoom-zoom-out'); zoomOut.setAttribute('transform', 'translate(30.5 70) scale(0.015)'); zoomOut.setAttribute('class', 'svg-pan-zoom-control'); zoomOut.addEventListener('click', function() {instance.getPublicInstance().zoomOut()}, false); zoomOut.addEventListener('touchstart', function() {instance.getPublicInstance().zoomOut()}, false); var zoomOutBackground = document.createElementNS(SvgUtils.svgNS, 'rect'); // TODO change these background space fillers to rounded rectangles so they look prettier zoomOutBackground.setAttribute('x', '0'); zoomOutBackground.setAttribute('y', '0'); zoomOutBackground.setAttribute('width', '1500'); // larger than expected because the whole group is transformed to scale down zoomOutBackground.setAttribute('height', '1400'); zoomOutBackground.setAttribute('class', 'svg-pan-zoom-control-background'); zoomOut.appendChild(zoomOutBackground); var zoomOutShape = document.createElementNS(SvgUtils.svgNS, 'path'); zoomOutShape.setAttribute('d', 'M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z'); zoomOutShape.setAttribute('class', 'svg-pan-zoom-control-element'); zoomOut.appendChild(zoomOutShape); return zoomOut } , disable: function(instance) { if (instance.controlIcons) { instance.controlIcons.parentNode.removeChild(instance.controlIcons) instance.controlIcons = null } } } /***/ }), /***/ "./node_modules/svg-pan-zoom/src/shadow-viewport.js": /*!**********************************************************!*\ !*** ./node_modules/svg-pan-zoom/src/shadow-viewport.js ***! \**********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var SvgUtils = __webpack_require__(/*! ./svg-utilities */ "./node_modules/svg-pan-zoom/src/svg-utilities.js") , Utils = __webpack_require__(/*! ./utilities */ "./node_modules/svg-pan-zoom/src/utilities.js") ; var ShadowViewport = function(viewport, options){ this.init(viewport, options) } /** * Initialization * * @param {SVGElement} viewport * @param {Object} options */ ShadowViewport.prototype.init = function(viewport, options) { // DOM Elements this.viewport = viewport this.options = options // State cache this.originalState = {zoom: 1, x: 0, y: 0} this.activeState = {zoom: 1, x: 0, y: 0} this.updateCTMCached = Utils.proxy(this.updateCTM, this) // Create a custom requestAnimationFrame taking in account refreshRate this.requestAnimationFrame = Utils.createRequestAnimationFrame(this.options.refreshRate) // ViewBox this.viewBox = {x: 0, y: 0, width: 0, height: 0} this.cacheViewBox() // Process CTM var newCTM = this.processCTM() // Update viewport CTM and cache zoom and pan this.setCTM(newCTM) // Update CTM in this frame this.updateCTM() } /** * Cache initial viewBox value * If no viewBox is defined, then use viewport size/position instead for viewBox values */ ShadowViewport.prototype.cacheViewBox = function() { var svgViewBox = this.options.svg.getAttribute('viewBox') if (svgViewBox) { var viewBoxValues = svgViewBox.split(/[\s\,]/).filter(function(v){return v}).map(parseFloat) // Cache viewbox x and y offset this.viewBox.x = viewBoxValues[0] this.viewBox.y = viewBoxValues[1] this.viewBox.width = viewBoxValues[2] this.viewBox.height = viewBoxValues[3] var zoom = Math.min(this.options.width / this.viewBox.width, this.options.height / this.viewBox.height) // Update active state this.activeState.zoom = zoom this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2 this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2 // Force updating CTM this.updateCTMOnNextFrame() this.options.svg.removeAttribute('viewBox') } else { this.simpleViewBoxCache() } } /** * Recalculate viewport sizes and update viewBox cache */ ShadowViewport.prototype.simpleViewBoxCache = function() { var bBox = this.viewport.getBBox() this.viewBox.x = bBox.x this.viewBox.y = bBox.y this.viewBox.width = bBox.width this.viewBox.height = bBox.height } /** * Returns a viewbox object. Safe to alter * * @return {Object} viewbox object */ ShadowViewport.prototype.getViewBox = function() { return Utils.extend({}, this.viewBox) } /** * Get initial zoom and pan values. Save them into originalState * Parses viewBox attribute to alter initial sizes * * @return {CTM} CTM object based on options */ ShadowViewport.prototype.processCTM = function() { var newCTM = this.getCTM() if (this.options.fit || this.options.contain) { var newScale; if (this.options.fit) { newScale = Math.min(this.options.width/this.viewBox.width, this.options.height/this.viewBox.height); } else { newScale = Math.max(this.options.width/this.viewBox.width, this.options.height/this.viewBox.height); } newCTM.a = newScale; //x-scale newCTM.d = newScale; //y-scale newCTM.e = -this.viewBox.x * newScale; //x-transform newCTM.f = -this.viewBox.y * newScale; //y-transform } if (this.options.center) { var offsetX = (this.options.width - (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) * 0.5 , offsetY = (this.options.height - (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) * 0.5 newCTM.e = offsetX newCTM.f = offsetY } // Cache initial values. Based on activeState and fix+center opitons this.originalState.zoom = newCTM.a this.originalState.x = newCTM.e this.originalState.y = newCTM.f return newCTM } /** * Return originalState object. Safe to alter * * @return {Object} */ ShadowViewport.prototype.getOriginalState = function() { return Utils.extend({}, this.originalState) } /** * Return actualState object. Safe to alter * * @return {Object} */ ShadowViewport.prototype.getState = function() { return Utils.extend({}, this.activeState) } /** * Get zoom scale * * @return {Float} zoom scale */ ShadowViewport.prototype.getZoom = function() { return this.activeState.zoom } /** * Get zoom scale for pubilc usage * * @return {Float} zoom scale */ ShadowViewport.prototype.getRelativeZoom = function() { return this.activeState.zoom / this.originalState.zoom } /** * Compute zoom scale for pubilc usage * * @return {Float} zoom scale */ ShadowViewport.prototype.computeRelativeZoom = function(scale) { return scale / this.originalState.zoom } /** * Get pan * * @return {Object} */ ShadowViewport.prototype.getPan = function() { return {x: this.activeState.x, y: this.activeState.y} } /** * Return cached viewport CTM value that can be safely modified * * @return {SVGMatrix} */ ShadowViewport.prototype.getCTM = function() { var safeCTM = this.options.svg.createSVGMatrix() // Copy values manually as in FF they are not itterable safeCTM.a = this.activeState.zoom safeCTM.b = 0 safeCTM.c = 0 safeCTM.d = this.activeState.zoom safeCTM.e = this.activeState.x safeCTM.f = this.activeState.y return safeCTM } /** * Set a new CTM * * @param {SVGMatrix} newCTM */ ShadowViewport.prototype.setCTM = function(newCTM) { var willZoom = this.isZoomDifferent(newCTM) , willPan = this.isPanDifferent(newCTM) if (willZoom || willPan) { // Before zoom if (willZoom) { // If returns false then cancel zooming if (this.options.beforeZoom(this.getRelativeZoom(), this.computeRelativeZoom(newCTM.a)) === false) { newCTM.a = newCTM.d = this.activeState.zoom willZoom = false } else { this.updateCache(newCTM); this.options.onZoom(this.getRelativeZoom()) } } // Before pan if (willPan) { var preventPan = this.options.beforePan(this.getPan(), {x: newCTM.e, y: newCTM.f}) // If prevent pan is an object , preventPanX = false , preventPanY = false // If prevent pan is Boolean false if (preventPan === false) { // Set x and y same as before newCTM.e = this.getPan().x newCTM.f = this.getPan().y preventPanX = preventPanY = true } else if (Utils.isObject(preventPan)) { // Check for X axes attribute if (preventPan.x === false) { // Prevent panning on x axes newCTM.e = this.getPan().x preventPanX = true } else if (Utils.isNumber(preventPan.x)) { // Set a custom pan value newCTM.e = preventPan.x } // Check for Y axes attribute if (preventPan.y === false) { // Prevent panning on x axes newCTM.f = this.getPan().y preventPanY = true } else if (Utils.isNumber(preventPan.y)) { // Set a custom pan value newCTM.f = preventPan.y } } // Update willPan flag // Check if newCTM is still different if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) { willPan = false } else { this.updateCache(newCTM); this.options.onPan(this.getPan()); } } // Check again if should zoom or pan if (willZoom || willPan) { this.updateCTMOnNextFrame() } } } ShadowViewport.prototype.isZoomDifferent = function(newCTM) { return this.activeState.zoom !== newCTM.a } ShadowViewport.prototype.isPanDifferent = function(newCTM) { return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f } /** * Update cached CTM and active state * * @param {SVGMatrix} newCTM */ ShadowViewport.prototype.updateCache = function(newCTM) { this.activeState.zoom = newCTM.a this.activeState.x = newCTM.e this.activeState.y = newCTM.f } ShadowViewport.prototype.pendingUpdate = false /** * Place a request to update CTM on next Frame */ ShadowViewport.prototype.updateCTMOnNextFrame = function() { if (!this.pendingUpdate) { // Lock this.pendingUpdate = true // Throttle next update this.requestAnimationFrame.call(window, this.updateCTMCached) } } /** * Update viewport CTM with cached CTM */ ShadowViewport.prototype.updateCTM = function() { var ctm = this.getCTM() // Updates SVG element SvgUtils.setCTM(this.viewport, ctm, this.defs) // Free the lock this.pendingUpdate = false // Notify about the update if(this.options.onUpdatedCTM) { this.options.onUpdatedCTM(ctm) } } module.exports = function(viewport, options){ return new ShadowViewport(viewport, options) } /***/ }), /***/ "./node_modules/svg-pan-zoom/src/svg-pan-zoom.js": /*!*******************************************************!*\ !*** ./node_modules/svg-pan-zoom/src/svg-pan-zoom.js ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Wheel = __webpack_require__(/*! ./uniwheel */ "./node_modules/svg-pan-zoom/src/uniwheel.js") , ControlIcons = __webpack_require__(/*! ./control-icons */ "./node_modules/svg-pan-zoom/src/control-icons.js") , Utils = __webpack_require__(/*! ./utilities */ "./node_modules/svg-pan-zoom/src/utilities.js") , SvgUtils = __webpack_require__(/*! ./svg-utilities */ "./node_modules/svg-pan-zoom/src/svg-utilities.js") , ShadowViewport = __webpack_require__(/*! ./shadow-viewport */ "./node_modules/svg-pan-zoom/src/shadow-viewport.js") var SvgPanZoom = function(svg, options) { this.init(svg, options) } var optionsDefaults = { viewportSelector: '.svg-pan-zoom_viewport' // Viewport selector. Can be querySelector string or SVGElement , panEnabled: true // enable or disable panning (default enabled) , controlIconsEnabled: false // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled) , zoomEnabled: true // enable or disable zooming (default enabled) , dblClickZoomEnabled: true // enable or disable zooming by double clicking (default enabled) , mouseWheelZoomEnabled: true // enable or disable zooming by mouse wheel (default enabled) , preventMouseEventsDefault: true // enable or disable preventDefault for mouse events , zoomScaleSensitivity: 0.1 // Zoom sensitivity , minZoom: 0.5 // Minimum Zoom level , maxZoom: 10 // Maximum Zoom level , fit: true // enable or disable viewport fit in SVG (default true) , contain: false // enable or disable viewport contain the svg (default false) , center: true // enable or disable viewport centering in SVG (default true) , refreshRate: 'auto' // Maximum number of frames per second (altering SVG's viewport) , beforeZoom: null , onZoom: null , beforePan: null , onPan: null , customEventsHandler: null , eventsListenerElement: null , onUpdatedCTM: null } var passiveListenerOption = {passive: true}; SvgPanZoom.prototype.init = function(svg, options) { var that = this this.svg = svg this.defs = svg.querySelector('defs') // Add default attributes to SVG SvgUtils.setupSvgAttributes(this.svg) // Set options this.options = Utils.extend(Utils.extend({}, optionsDefaults), options) // Set default state this.state = 'none' // Get dimensions var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(svg) this.width = boundingClientRectNormalized.width this.height = boundingClientRectNormalized.height // Init shadow viewport this.viewport = ShadowViewport(SvgUtils.getOrCreateViewport(this.svg, this.options.viewportSelector), { svg: this.svg , width: this.width , height: this.height , fit: this.options.fit , contain: this.options.contain , center: this.options.center , refreshRate: this.options.refreshRate // Put callbacks into functions as they can change through time , beforeZoom: function(oldScale, newScale) { if (that.viewport && that.options.beforeZoom) {return that.options.beforeZoom(oldScale, newScale)} } , onZoom: function(scale) { if (that.viewport && that.options.onZoom) {return that.options.onZoom(scale)} } , beforePan: function(oldPoint, newPoint) { if (that.viewport && that.options.beforePan) {return that.options.beforePan(oldPoint, newPoint)} } , onPan: function(point) { if (that.viewport && that.options.onPan) {return that.options.onPan(point)} } , onUpdatedCTM: function(ctm) { if (that.viewport && that.options.onUpdatedCTM) {return that.options.onUpdatedCTM(ctm)} } }) // Wrap callbacks into public API context var publicInstance = this.getPublicInstance() publicInstance.setBeforeZoom(this.options.beforeZoom) publicInstance.setOnZoom(this.options.onZoom) publicInstance.setBeforePan(this.options.beforePan) publicInstance.setOnPan(this.options.onPan) publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM) if (this.options.controlIconsEnabled) { ControlIcons.enable(this) } // Init events handlers this.lastMouseWheelEventTime = Date.now() this.setupHandlers() } /** * Register event handlers */ SvgPanZoom.prototype.setupHandlers = function() { var that = this , prevEvt = null // use for touchstart event to detect double tap ; this.eventListeners = { // Mouse down group mousedown: function(evt) { var result = that.handleMouseDown(evt, prevEvt); prevEvt = evt return result; } , touchstart: function(evt) { var result = that.handleMouseDown(evt, prevEvt); prevEvt = evt return result; } // Mouse up group , mouseup: function(evt) { return that.handleMouseUp(evt); } , touchend: function(evt) { return that.handleMouseUp(evt); } // Mouse move group , mousemove: function(evt) { return that.handleMouseMove(evt); } , touchmove: function(evt) { return that.handleMouseMove(evt); } // Mouse leave group , mouseleave: function(evt) { return that.handleMouseUp(evt); } , touchleave: function(evt) { return that.handleMouseUp(evt); } , touchcancel: function(evt) { return that.handleMouseUp(evt); } } // Init custom events handler if available if (this.options.customEventsHandler != null) { // jshint ignore:line this.options.customEventsHandler.init({ svgElement: this.svg , eventsListenerElement: this.options.eventsListenerElement , instance: this.getPublicInstance() }) // Custom event handler may halt builtin listeners var haltEventListeners = this.options.customEventsHandler.haltEventListeners if (haltEventListeners && haltEventListeners.length) { for (var i = haltEventListeners.length - 1; i >= 0; i--) { if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) { delete this.eventListeners[haltEventListeners[i]] } } } } // Bind eventListeners for (var event in this.eventListeners) { // Attach event to eventsListenerElement or SVG if not available (this.options.eventsListenerElement || this.svg) .addEventListener(event, this.eventListeners[event], !this.options.preventMouseEventsDefault ? passiveListenerOption : false) } // Zoom using mouse wheel if (this.options.mouseWheelZoomEnabled) { this.options.mouseWheelZoomEnabled = false // set to false as enable will set it back to true this.enableMouseWheelZoom() } } /** * Enable ability to zoom using mouse wheel */ SvgPanZoom.prototype.enableMouseWheelZoom = function() { if (!this.options.mouseWheelZoomEnabled) { var that = this // Mouse wheel listener this.wheelListener = function(evt) { return that.handleMouseWheel(evt); } // Bind wheelListener var isPassiveListener = !this.options.preventMouseEventsDefault Wheel.on(this.options.eventsListenerElement || this.svg, this.wheelListener, isPassiveListener) this.options.mouseWheelZoomEnabled = true } } /** * Disable ability to zoom using mouse wheel */ SvgPanZoom.prototype.disableMouseWheelZoom = function() { if (this.options.mouseWheelZoomEnabled) { var isPassiveListener = !this.options.preventMouseEventsDefault Wheel.off(this.options.eventsListenerElement || this.svg, this.wheelListener, isPassiveListener) this.options.mouseWheelZoomEnabled = false } } /** * Handle mouse wheel event * * @param {Event} evt */ SvgPanZoom.prototype.handleMouseWheel = function(evt) { if (!this.options.zoomEnabled || this.state !== 'none') { return; } if (this.options.preventMouseEventsDefault){ if (evt.preventDefault) { evt.preventDefault(); } else { evt.returnValue = false; } } // Default delta in case that deltaY is not available var delta = evt.deltaY || 1 , timeDelta = Date.now() - this.lastMouseWheelEventTime , divider = 3 + Math.max(0, 30 - timeDelta) // Update cache this.lastMouseWheelEventTime = Date.now() // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0) if ('deltaMode' in evt && evt.deltaMode === 0 && evt.wheelDelta) { delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY } delta = -0.3 < delta && delta < 0.3 ? delta : (delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10) / divider var inversedScreenCTM = this.svg.getScreenCTM().inverse() , relativeMousePoint = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(inversedScreenCTM) , zoom = Math.pow(1 + this.options.zoomScaleSensitivity, (-1) * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior this.zoomAtPoint(zoom, relativeMousePoint) } /** * Zoom in at a SVG point * * @param {SVGPoint} point * @param {Float} zoomScale Number representing how much to zoom * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value. * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%) */ SvgPanZoom.prototype.zoomAtPoint = function(zoomScale, point, zoomAbsolute) { var originalState = this.viewport.getOriginalState() if (!zoomAbsolute) { // Fit zoomScale in set bounds if (this.getZoom() * zoomScale < this.options.minZoom * originalState.zoom) { zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom() } else if (this.getZoom() * zoomScale > this.options.maxZoom * originalState.zoom) { zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom() } } else { // Fit zoomScale in set bounds zoomScale = Math.max(this.options.minZoom * originalState.zoom, Math.min(this.options.maxZoom * originalState.zoom, zoomScale)) // Find relative scale to achieve desired scale zoomScale = zoomScale/this.getZoom() } var oldCTM = this.viewport.getCTM() , relativePoint = point.matrixTransform(oldCTM.inverse()) , modifier = this.svg.createSVGMatrix().translate(relativePoint.x, relativePoint.y).scale(zoomScale).translate(-relativePoint.x, -relativePoint.y) , newCTM = oldCTM.multiply(modifier) if (newCTM.a !== oldCTM.a) { this.viewport.setCTM(newCTM) } } /** * Zoom at center point * * @param {Float} scale * @param {Boolean} absolute Marks zoom scale as relative or absolute */ SvgPanZoom.prototype.zoom = function(scale, absolute) { this.zoomAtPoint(scale, SvgUtils.getSvgCenterPoint(this.svg, this.width, this.height), absolute) } /** * Zoom used by public instance * * @param {Float} scale * @param {Boolean} absolute Marks zoom scale as relative or absolute */ SvgPanZoom.prototype.publicZoom = function(scale, absolute) { if (absolute) { scale = this.computeFromRelativeZoom(scale) } this.zoom(scale, absolute) } /** * Zoom at point used by public instance * * @param {Float} scale * @param {SVGPoint|Object} point An object that has x and y attributes * @param {Boolean} absolute Marks zoom scale as relative or absolute */ SvgPanZoom.prototype.publicZoomAtPoint = function(scale, point, absolute) { if (absolute) { // Transform zoom into a relative value scale = this.computeFromRelativeZoom(scale) } // If not a SVGPoint but has x and y then create a SVGPoint if (Utils.getType(point) !== 'SVGPoint') { if('x' in point && 'y' in point) { point = SvgUtils.createSVGPoint(this.svg, point.x, point.y) } else { throw new Error('Given point is invalid') } } this.zoomAtPoint(scale, point, absolute) } /** * Get zoom scale * * @return {Float} zoom scale */ SvgPanZoom.prototype.getZoom = function() { return this.viewport.getZoom() } /** * Get zoom scale for public usage * * @return {Float} zoom scale */ SvgPanZoom.prototype.getRelativeZoom = function() { return this.viewport.getRelativeZoom() } /** * Compute actual zoom from public zoom * * @param {Float} zoom * @return {Float} zoom scale */ SvgPanZoom.prototype.computeFromRelativeZoom = function(zoom) { return zoom * this.viewport.getOriginalState().zoom } /** * Set zoom to initial state */ SvgPanZoom.prototype.resetZoom = function() { var originalState = this.viewport.getOriginalState() this.zoom(originalState.zoom, true); } /** * Set pan to initial state */ SvgPanZoom.prototype.resetPan = function() { this.pan(this.viewport.getOriginalState()); } /** * Set pan and zoom to initial state */ SvgPanZoom.prototype.reset = function() { this.resetZoom() this.resetPan() } /** * Handle double click event * See handleMouseDown() for alternate detection method * * @param {Event} evt */ SvgPanZoom.prototype.handleDblClick = function(evt) { if (this.options.preventMouseEventsDefault) { if (evt.preventDefault) { evt.preventDefault() } else { evt.returnValue = false } } // Check if target was a control button if (this.options.controlIconsEnabled) { var targetClass = evt.target.getAttribute('class') || '' if (targetClass.indexOf('svg-pan-zoom-control') > -1) { return false } } var zoomFactor if (evt.shiftKey) { zoomFactor = 1/((1 + this.options.zoomScaleSensitivity) * 2) // zoom out when shift key pressed } else { zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2 } var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(this.svg.getScreenCTM().inverse()) this.zoomAtPoint(zoomFactor, point) } /** * Handle click event * * @param {Event} evt */ SvgPanZoom.prototype.handleMouseDown = function(evt, prevEvt) { if (this.options.preventMouseEventsDefault) { if (evt.preventDefault) { evt.preventDefault() } else { evt.returnValue = false } } Utils.mouseAndTouchNormalize(evt, this.svg) // Double click detection; more consistent than ondblclick if (this.options.dblClickZoomEnabled && Utils.isDblClick(evt, prevEvt)){ this.handleDblClick(evt) } else { // Pan mode this.state = 'pan' this.firstEventCTM = this.viewport.getCTM() this.stateOrigin = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(this.firstEventCTM.inverse()) } } /** * Handle mouse move event * * @param {Event} evt */ SvgPanZoom.prototype.handleMouseMove = function(evt) { if (this.options.preventMouseEventsDefault) { if (evt.preventDefault) { evt.preventDefault() } else { evt.returnValue = false } } if (this.state === 'pan' && this.options.panEnabled) { // Pan mode var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(this.firstEventCTM.inverse()) , viewportCTM = this.firstEventCTM.translate(point.x - this.stateOrigin.x, point.y - this.stateOrigin.y) this.viewport.setCTM(viewportCTM) } } /** * Handle mouse button release event * * @param {Event} evt */ SvgPanZoom.prototype.handleMouseUp = function(evt) { if (this.options.preventMouseEventsDefault) { if (evt.preventDefault) { evt.preventDefault() } else { evt.returnValue = false } } if (this.state === 'pan') { // Quit pan mode this.state = 'none' } } /** * Adjust viewport size (only) so it will fit in SVG * Does not center image */ SvgPanZoom.prototype.fit = function() { var viewBox = this.viewport.getViewBox() , newScale = Math.min(this.width/viewBox.width, this.height/viewBox.height) this.zoom(newScale, true) } /** * Adjust viewport size (only) so it will contain the SVG * Does not center image */ SvgPanZoom.prototype.contain = function() { var viewBox = this.viewport.getViewBox() , newScale = Math.max(this.width/viewBox.width, this.height/viewBox.height) this.zoom(newScale, true) } /** * Adjust viewport pan (only) so it will be centered in SVG * Does not zoom/fit/contain image */ SvgPanZoom.prototype.center = function() { var viewBox = this.viewport.getViewBox() , offsetX = (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5 , offsetY = (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5 this.getPublicInstance().pan({x: offsetX, y: offsetY}) } /** * Update content cached BorderBox * Use when viewport contents change */ SvgPanZoom.prototype.updateBBox = function() { this.viewport.simpleViewBoxCache() } /** * Pan to a rendered position * * @param {Object} point {x: 0, y: 0} */ SvgPanZoom.prototype.pan = function(point) { var viewportCTM = this.viewport.getCTM() viewportCTM.e = point.x viewportCTM.f = point.y this.viewport.setCTM(viewportCTM) } /** * Relatively pan the graph by a specified rendered position vector * * @param {Object} point {x: 0, y: 0} */ SvgPanZoom.prototype.panBy = function(point) { var viewportCTM = this.viewport.getCTM() viewportCTM.e += point.x viewportCTM.f += point.y this.viewport.setCTM(viewportCTM) } /** * Get pan vector * * @return {Object} {x: 0, y: 0} */ SvgPanZoom.prototype.getPan = function() { var state = this.viewport.getState() return {x: state.x, y: state.y} } /** * Recalculates cached svg dimensions and controls position */ SvgPanZoom.prototype.resize = function() { // Get dimensions var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(this.svg) this.width = boundingClientRectNormalized.width this.height = boundingClientRectNormalized.height // Recalculate original state var viewport = this.viewport viewport.options.width = this.width viewport.options.height = this.height viewport.processCTM() // Reposition control icons by re-enabling them if (this.options.controlIconsEnabled) { this.getPublicInstance().disableControlIcons() this.getPublicInstance().enableControlIcons() } } /** * Unbind mouse events, free callbacks and destroy public instance */ SvgPanZoom.prototype.destroy = function() { var that = this // Free callbacks this.beforeZoom = null this.onZoom = null this.beforePan = null this.onPan = null this.onUpdatedCTM = null // Destroy custom event handlers if (this.options.customEventsHandler != null) { // jshint ignore:line this.options.customEventsHandler.destroy({ svgElement: this.svg , eventsListenerElement: this.options.eventsListenerElement , instance: this.getPublicInstance() }) } // Unbind eventListeners for (var event in this.eventListeners) { (this.options.eventsListenerElement || this.svg) .removeEventListener(event, this.eventListeners[event], !this.options.preventMouseEventsDefault ? passiveListenerOption : false) } // Unbind wheelListener this.disableMouseWheelZoom() // Remove control icons this.getPublicInstance().disableControlIcons() // Reset zoom and pan this.reset() // Remove instance from instancesStore instancesStore = instancesStore.filter(function(instance){ return instance.svg !== that.svg }) // Delete options and its contents delete this.options // Delete viewport to make public shadow viewport functions uncallable delete this.viewport // Destroy public instance and rewrite getPublicInstance delete this.publicInstance delete this.pi this.getPublicInstance = function(){ return null } } /** * Returns a public instance object * * @return {Object} Public instance object */ SvgPanZoom.prototype.getPublicInstance = function() { var that = this // Create cache if (!this.publicInstance) { this.publicInstance = this.pi = { // Pan enablePan: function() {that.options.panEnabled = true; return that.pi} , disablePan: function() {that.options.panEnabled = false; return that.pi} , isPanEnabled: function() {return !!that.options.panEnabled} , pan: function(point) {that.pan(point); return that.pi} , panBy: function(point) {that.panBy(point); return that.pi} , getPan: function() {return that.getPan()} // Pan event , setBeforePan: function(fn) {that.options.beforePan = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi} , setOnPan: function(fn) {that.options.onPan = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi} // Zoom and Control Icons , enableZoom: function() {that.options.zoomEnabled = true; return that.pi} , disableZoom: function() {that.options.zoomEnabled = false; return that.pi} , isZoomEnabled: function() {return !!that.options.zoomEnabled} , enableControlIcons: function() { if (!that.options.controlIconsEnabled) { that.options.controlIconsEnabled = true ControlIcons.enable(that) } return that.pi } , disableControlIcons: function() { if (that.options.controlIconsEnabled) { that.options.controlIconsEnabled = false; ControlIcons.disable(that) } return that.pi } , isControlIconsEnabled: function() {return !!that.options.controlIconsEnabled} // Double click zoom , enableDblClickZoom: function() {that.options.dblClickZoomEnabled = true; return that.pi} , disableDblClickZoom: function() {that.options.dblClickZoomEnabled = false; return that.pi} , isDblClickZoomEnabled: function() {return !!that.options.dblClickZoomEnabled} // Mouse wheel zoom , enableMouseWheelZoom: function() {that.enableMouseWheelZoom(); return that.pi} , disableMouseWheelZoom: function() {that.disableMouseWheelZoom(); return that.pi} , isMouseWheelZoomEnabled: function() {return !!that.options.mouseWheelZoomEnabled} // Zoom scale and bounds , setZoomScaleSensitivity: function(scale) {that.options.zoomScaleSensitivity = scale; return that.pi} , setMinZoom: function(zoom) {that.options.minZoom = zoom; return that.pi} , setMaxZoom: function(zoom) {that.options.maxZoom = zoom; return that.pi} // Zoom event , setBeforeZoom: function(fn) {that.options.beforeZoom = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi} , setOnZoom: function(fn) {that.options.onZoom = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi} // Zooming , zoom: function(scale) {that.publicZoom(scale, true); return that.pi} , zoomBy: function(scale) {that.publicZoom(scale, false); return that.pi} , zoomAtPoint: function(scale, point) {that.publicZoomAtPoint(scale, point, true); return that.pi} , zoomAtPointBy: function(scale, point) {that.publicZoomAtPoint(scale, point, false); return that.pi} , zoomIn: function() {this.zoomBy(1 + that.options.zoomScaleSensitivity); return that.pi} , zoomOut: function() {this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity)); return that.pi} , getZoom: function() {return that.getRelativeZoom()} // CTM update , setOnUpdatedCTM: function(fn) {that.options.onUpdatedCTM = fn === null ? null : Utils.proxy(fn, that.publicInstance); return that.pi} // Reset , resetZoom: function() {that.resetZoom(); return that.pi} , resetPan: function() {that.resetPan(); return that.pi} , reset: function() {that.reset(); return that.pi} // Fit, Contain and Center , fit: function() {that.fit(); return that.pi} , contain: function() {that.contain(); return that.pi} , center: function() {that.center(); return that.pi} // Size and Resize , updateBBox: function() {that.updateBBox(); return that.pi} , resize: function() {that.resize(); return that.pi} , getSizes: function() { return { width: that.width , height: that.height , realZoom: that.getZoom() , viewBox: that.viewport.getViewBox() } } // Destroy , destroy: function() {that.destroy(); return that.pi} } } return this.publicInstance } /** * Stores pairs of instances of SvgPanZoom and SVG * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom} * * @type {Array} */ var instancesStore = [] var svgPanZoom = function(elementOrSelector, options){ var svg = Utils.getSvg(elementOrSelector) if (svg === null) { return null } else { // Look for existent instance for(var i = instancesStore.length - 1; i >= 0; i--) { if (instancesStore[i].svg === svg) { return instancesStore[i].instance.getPublicInstance() } } // If instance not found - create one instancesStore.push({ svg: svg , instance: new SvgPanZoom(svg, options) }) // Return just pushed instance return instancesStore[instancesStore.length - 1].instance.getPublicInstance() } } module.exports = svgPanZoom; /***/ }), /***/ "./node_modules/svg-pan-zoom/src/svg-utilities.js": /*!********************************************************!*\ !*** ./node_modules/svg-pan-zoom/src/svg-utilities.js ***! \********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Utils = __webpack_require__(/*! ./utilities */ "./node_modules/svg-pan-zoom/src/utilities.js") , _browser = 'unknown' ; // http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser if (/*@cc_on!@*/ false || !!document.documentMode) { // internet explorer _browser = 'ie'; } module.exports = { svgNS: 'http://www.w3.org/2000/svg' , xmlNS: 'http://www.w3.org/XML/1998/namespace' , xmlnsNS: 'http://www.w3.org/2000/xmlns/' , xlinkNS: 'http://www.w3.org/1999/xlink' , evNS: 'http://www.w3.org/2001/xml-events' /** * Get svg dimensions: width and height * * @param {SVGSVGElement} svg * @return {Object} {width: 0, height: 0} */ , getBoundingClientRectNormalized: function(svg) { if (svg.clientWidth && svg.clientHeight) { return {width: svg.clientWidth, height: svg.clientHeight} } else if (!!svg.getBoundingClientRect()) { return svg.getBoundingClientRect(); } else { throw new Error('Cannot get BoundingClientRect for SVG.'); } } /** * Gets g element with class of "viewport" or creates it if it doesn't exist * * @param {SVGSVGElement} svg * @return {SVGElement} g (group) element */ , getOrCreateViewport: function(svg, selector) { var viewport = null if (Utils.isElement(selector)) { viewport = selector } else { viewport = svg.querySelector(selector) } // Check if there is just one main group in SVG if (!viewport) { var childNodes = Array.prototype.slice.call(svg.childNodes || svg.children).filter(function(el){ return el.nodeName !== 'defs' && el.nodeName !== '#text' }) // Node name should be SVGGElement and should have no transform attribute // Groups with transform are not used as viewport because it involves parsing of all transform possibilities if (childNodes.length === 1 && childNodes[0].nodeName === 'g' && childNodes[0].getAttribute('transform') === null) { viewport = childNodes[0] } } // If no favorable group element exists then create one if (!viewport) { var viewportId = 'viewport-' + new Date().toISOString().replace(/\D/g, ''); viewport = document.createElementNS(this.svgNS, 'g'); viewport.setAttribute('id', viewportId); // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes var svgChildren = svg.childNodes || svg.children; if (!!svgChildren && svgChildren.length > 0) { for (var i = svgChildren.length; i > 0; i--) { // Move everything into viewport except defs if (svgChildren[svgChildren.length - i].nodeName !== 'defs') { viewport.appendChild(svgChildren[svgChildren.length - i]); } } } svg.appendChild(viewport); } // Parse class names var classNames = []; if (viewport.getAttribute('class')) { classNames = viewport.getAttribute('class').split(' ') } // Set class (if not set already) if (!~classNames.indexOf('svg-pan-zoom_viewport')) { classNames.push('svg-pan-zoom_viewport') viewport.setAttribute('class', classNames.join(' ')) } return viewport } /** * Set SVG attributes * * @param {SVGSVGElement} svg */ , setupSvgAttributes: function(svg) { // Setting default attributes svg.setAttribute('xmlns', this.svgNS); svg.setAttributeNS(this.xmlnsNS, 'xmlns:xlink', this.xlinkNS); svg.setAttributeNS(this.xmlnsNS, 'xmlns:ev', this.evNS); // Needed for Internet Explorer, otherwise the viewport overflows if (svg.parentNode !== null) { var style = svg.getAttribute('style') || ''; if (style.toLowerCase().indexOf('overflow') === -1) { svg.setAttribute('style', 'overflow: hidden; ' + style); } } } /** * How long Internet Explorer takes to finish updating its display (ms). */ , internetExplorerRedisplayInterval: 300 /** * Forces the browser to redisplay all SVG elements that rely on an * element defined in a 'defs' section. It works globally, for every * available defs element on the page. * The throttling is intentionally global. * * This is only needed for IE. It is as a hack to make markers (and 'use' elements?) * visible after pan/zoom when there are multiple SVGs on the page. * See bug report: https://connect.microsoft.com/IE/feedback/details/781964/ * also see svg-pan-zoom issue: https://github.com/ariutta/svg-pan-zoom/issues/62 */ , refreshDefsGlobal: Utils.throttle(function() { var allDefs = document.querySelectorAll('defs'); var allDefsCount = allDefs.length; for (var i = 0; i < allDefsCount; i++) { var thisDefs = allDefs[i]; thisDefs.parentNode.insertBefore(thisDefs, thisDefs); } }, this ? this.internetExplorerRedisplayInterval : null) /** * Sets the current transform matrix of an element * * @param {SVGElement} element * @param {SVGMatrix} matrix CTM * @param {SVGElement} defs */ , setCTM: function(element, matrix, defs) { var that = this , s = 'matrix(' + matrix.a + ',' + matrix.b + ',' + matrix.c + ',' + matrix.d + ',' + matrix.e + ',' + matrix.f + ')'; element.setAttributeNS(null, 'transform', s); if ('transform' in element.style) { element.style.transform = s; } else if ('-ms-transform' in element.style) { element.style['-ms-transform'] = s; } else if ('-webkit-transform' in element.style) { element.style['-webkit-transform'] = s; } // IE has a bug that makes markers disappear on zoom (when the matrix "a" and/or "d" elements change) // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10 // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/ if (_browser === 'ie' && !!defs) { // this refresh is intended for redisplaying the SVG during zooming defs.parentNode.insertBefore(defs, defs); // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that // are located under any other element(s). window.setTimeout(function() { that.refreshDefsGlobal(); }, that.internetExplorerRedisplayInterval); } } /** * Instantiate an SVGPoint object with given event coordinates * * @param {Event} evt * @param {SVGSVGElement} svg * @return {SVGPoint} point */ , getEventPoint: function(evt, svg) { var point = svg.createSVGPoint() Utils.mouseAndTouchNormalize(evt, svg) point.x = evt.clientX point.y = evt.clientY return point } /** * Get SVG center point * * @param {SVGSVGElement} svg * @return {SVGPoint} */ , getSvgCenterPoint: function(svg, width, height) { return this.createSVGPoint(svg, width / 2, height / 2) } /** * Create a SVGPoint with given x and y * * @param {SVGSVGElement} svg * @param {Number} x * @param {Number} y * @return {SVGPoint} */ , createSVGPoint: function(svg, x, y) { var point = svg.createSVGPoint() point.x = x point.y = y return point } } /***/ }), /***/ "./node_modules/svg-pan-zoom/src/uniwheel.js": /*!***************************************************!*\ !*** ./node_modules/svg-pan-zoom/src/uniwheel.js ***! \***************************************************/ /*! no static exports found */ /***/ (function(module, exports) { // uniwheel 0.1.2 (customized) // A unified cross browser mouse wheel event handler // https://github.com/teemualap/uniwheel module.exports = (function(){ //Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel var prefix = "", _addEventListener, _removeEventListener, support, fns = []; var passiveOption = {passive: true}; // detect event model if ( window.addEventListener ) { _addEventListener = "addEventListener"; _removeEventListener = "removeEventListener"; } else { _addEventListener = "attachEvent"; _removeEventListener = "detachEvent"; prefix = "on"; } // detect available wheel event support = "onwheel" in document.createElement("div") ? "wheel" : // Modern browsers support "wheel" document.onmousewheel !== undefined ? "mousewheel" : // Webkit and IE support at least "mousewheel" "DOMMouseScroll"; // let's assume that remaining browsers are older Firefox function createCallback(element,callback) { var fn = function(originalEvent) { !originalEvent && ( originalEvent = window.event ); // create a normalized event object var event = { // keep a ref to the original event object originalEvent: originalEvent, target: originalEvent.target || originalEvent.srcElement, type: "wheel", deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1, deltaX: 0, delatZ: 0, preventDefault: function() { originalEvent.preventDefault ? originalEvent.preventDefault() : originalEvent.returnValue = false; } }; // calculate deltaY (and deltaX) according to the event if ( support == "mousewheel" ) { event.deltaY = - 1/40 * originalEvent.wheelDelta; // Webkit also support wheelDeltaX originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX ); } else { event.deltaY = originalEvent.detail; } // it's time to fire the callback return callback( event ); }; fns.push({ element: element, fn: fn, }); return fn; } function getCallback(element) { for (var i = 0; i < fns.length; i++) { if (fns[i].element === element) { return fns[i].fn; } } return function(){}; } function removeCallback(element) { for (var i = 0; i < fns.length; i++) { if (fns[i].element === element) { return fns.splice(i,1); } } } function _addWheelListener(elem, eventName, callback, isPassiveListener ) { var cb; if (support === "wheel") { cb = callback; } else { cb = createCallback(elem, callback); } elem[_addEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false); } function _removeWheelListener(elem, eventName, callback, isPassiveListener ) { var cb; if (support === "wheel") { cb = callback; } else { cb = getCallback(elem); } elem[_removeEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false); removeCallback(elem); } function addWheelListener( elem, callback, isPassiveListener ) { _addWheelListener(elem, support, callback, isPassiveListener ); // handle MozMousePixelScroll in older Firefox if( support == "DOMMouseScroll" ) { _addWheelListener(elem, "MozMousePixelScroll", callback, isPassiveListener ); } } function removeWheelListener(elem, callback, isPassiveListener){ _removeWheelListener(elem, support, callback, isPassiveListener); // handle MozMousePixelScroll in older Firefox if( support == "DOMMouseScroll" ) { _removeWheelListener(elem, "MozMousePixelScroll", callback, isPassiveListener); } } return { on: addWheelListener, off: removeWheelListener }; })(); /***/ }), /***/ "./node_modules/svg-pan-zoom/src/utilities.js": /*!****************************************************!*\ !*** ./node_modules/svg-pan-zoom/src/utilities.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = { /** * Extends an object * * @param {Object} target object to extend * @param {Object} source object to take properties from * @return {Object} extended object */ extend: function(target, source) { target = target || {}; for (var prop in source) { // Go recursively if (this.isObject(source[prop])) { target[prop] = this.extend(target[prop], source[prop]) } else { target[prop] = source[prop] } } return target; } /** * Checks if an object is a DOM element * * @param {Object} o HTML element or String * @return {Boolean} returns true if object is a DOM element */ , isElement: function(o){ return ( o instanceof HTMLElement || o instanceof SVGElement || o instanceof SVGSVGElement || //DOM2 (o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string') ); } /** * Checks if an object is an Object * * @param {Object} o Object * @return {Boolean} returns true if object is an Object */ , isObject: function(o){ return Object.prototype.toString.call(o) === '[object Object]'; } /** * Checks if variable is Number * * @param {Integer|Float} n * @return {Boolean} returns true if variable is Number */ , isNumber: function(n) { return !isNaN(parseFloat(n)) && isFinite(n); } /** * Search for an SVG element * * @param {Object|String} elementOrSelector DOM Element or selector String * @return {Object|Null} SVG or null */ , getSvg: function(elementOrSelector) { var element , svg; if (!this.isElement(elementOrSelector)) { // If selector provided if (typeof elementOrSelector === 'string' || elementOrSelector instanceof String) { // Try to find the element element = document.querySelector(elementOrSelector) if (!element) { throw new Error('Provided selector did not find any elements. Selector: ' + elementOrSelector) return null } } else { throw new Error('Provided selector is not an HTML object nor String') return null } } else { element = elementOrSelector } if (element.tagName.toLowerCase() === 'svg') { svg = element; } else { if (element.tagName.toLowerCase() === 'object') { svg = element.contentDocument.documentElement; } else { if (element.tagName.toLowerCase() === 'embed') { svg = element.getSVGDocument().documentElement; } else { if (element.tagName.toLowerCase() === 'img') { throw new Error('Cannot script an SVG in an "img" element. Please use an "object" element or an in-line SVG.'); } else { throw new Error('Cannot get SVG.'); } return null } } } return svg } /** * Attach a given context to a function * @param {Function} fn Function * @param {Object} context Context * @return {Function} Function with certain context */ , proxy: function(fn, context) { return function() { return fn.apply(context, arguments) } } /** * Returns object type * Uses toString that returns [object SVGPoint] * And than parses object type from string * * @param {Object} o Any object * @return {String} Object type */ , getType: function(o) { return Object.prototype.toString.apply(o).replace(/^\[object\s/, '').replace(/\]$/, '') } /** * If it is a touch event than add clientX and clientY to event object * * @param {Event} evt * @param {SVGSVGElement} svg */ , mouseAndTouchNormalize: function(evt, svg) { // If no clientX then fallback if (evt.clientX === void 0 || evt.clientX === null) { // Fallback evt.clientX = 0 evt.clientY = 0 // If it is a touch event if (evt.touches !== void 0 && evt.touches.length) { if (evt.touches[0].clientX !== void 0) { evt.clientX = evt.touches[0].clientX evt.clientY = evt.touches[0].clientY } else if (evt.touches[0].pageX !== void 0) { var rect = svg.getBoundingClientRect(); evt.clientX = evt.touches[0].pageX - rect.left evt.clientY = evt.touches[0].pageY - rect.top } // If it is a custom event } else if (evt.originalEvent !== void 0) { if (evt.originalEvent.clientX !== void 0) { evt.clientX = evt.originalEvent.clientX evt.clientY = evt.originalEvent.clientY } } } } /** * Check if an event is a double click/tap * TODO: For touch gestures use a library (hammer.js) that takes in account other events * (touchmove and touchend). It should take in account tap duration and traveled distance * * @param {Event} evt * @param {Event} prevEvt Previous Event * @return {Boolean} */ , isDblClick: function(evt, prevEvt) { // Double click detected by browser if (evt.detail === 2) { return true; } // Try to compare events else if (prevEvt !== void 0 && prevEvt !== null) { var timeStampDiff = evt.timeStamp - prevEvt.timeStamp // should be lower than 250 ms , touchesDistance = Math.sqrt(Math.pow(evt.clientX - prevEvt.clientX, 2) + Math.pow(evt.clientY - prevEvt.clientY, 2)) return timeStampDiff < 250 && touchesDistance < 10 } // Nothing found return false; } /** * Returns current timestamp as an integer * * @return {Number} */ , now: Date.now || function() { return new Date().getTime(); } // From underscore. // Returns a function, that, when invoked, will only be triggered at most once // during a given window of time. Normally, the throttled function will run // as much as it can, without ever going more than once per `wait` duration; // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. // jscs:disable // jshint ignore:start , throttle: function(func, wait, options) { var that = this; var context, args, result; var timeout = null; var previous = 0; if (!options) options = {}; var later = function() { previous = options.leading === false ? 0 : that.now(); timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; return function() { var now = that.now(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; } // jshint ignore:end // jscs:enable /** * Create a requestAnimationFrame simulation * * @param {Number|String} refreshRate * @return {Function} */ , createRequestAnimationFrame: function(refreshRate) { var timeout = null // Convert refreshRate to timeout if (refreshRate !== 'auto' && refreshRate < 60 && refreshRate > 1) { timeout = Math.floor(1000 / refreshRate) } if (timeout === null) { return window.requestAnimationFrame || requestTimeout(33) } else { return requestTimeout(timeout) } } } /** * Create a callback that will execute after a given timeout * * @param {Function} timeout * @return {Function} */ function requestTimeout(timeout) { return function(callback) { window.setTimeout(callback, timeout) } } /***/ }), /***/ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js": /*!********************************************************************!*\ !*** ./node_modules/vue-loader/lib/runtime/componentNormalizer.js ***! \********************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return normalizeComponent; }); /* globals __VUE_SSR_CONTEXT__ */ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules). // This module is a runtime utility for cleaner component module output and will // be included in the final webpack user bundle. function normalizeComponent ( scriptExports, render, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier, /* server only */ shadowMode /* vue-cli only */ ) { // Vue.extend constructor export interop var options = typeof scriptExports === 'function' ? scriptExports.options : scriptExports // render functions if (render) { options.render = render options.staticRenderFns = staticRenderFns options._compiled = true } // functional template if (functionalTemplate) { options.functional = true } // scopedId if (scopeId) { options._scopeId = 'data-v-' + scopeId } var hook if (moduleIdentifier) { // server build hook = function (context) { // 2.3 injection context = context || // cached call (this.$vnode && this.$vnode.ssrContext) || // stateful (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__ } // inject component styles if (injectStyles) { injectStyles.call(this, context) } // register component module identifier for async chunk inferrence if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier) } } // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook } else if (injectStyles) { hook = shadowMode ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) } : injectStyles } if (hook) { if (options.functional) { // for template-only hot-reload because in that case the render fn doesn't // go through the normalizer options._injectStyles = hook // register for functioal component in vue file var originalRender = options.render options.render = function renderWithStyleInjection (h, context) { hook.call(context) return originalRender(h, context) } } else { // inject component registration as beforeCreate hook var existing = options.beforeCreate options.beforeCreate = existing ? [].concat(existing, hook) : [hook] } } return { exports: scriptExports, options: options } } /***/ }), /***/ "./node_modules/vue-style-loader/index.js?!./node_modules/poi/node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/Scope.vue?vue&type=style&index=0&id=4c74502b&scoped=true&lang=css&": /*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-style-loader??ref--3-oneOf-1-0!./node_modules/poi/node_modules/css-loader??ref--3-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/cache-loader/dist/cjs.js??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./src/Scope.vue?vue&type=style&index=0&id=4c74502b&scoped=true&lang=css& ***! \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // style-loader: Adds some css to the DOM by adding a ' } return css } /***/ }), /***/ "./node_modules/vue-style-loader/lib/listToStyles.js": /*!***********************************************************!*\ !*** ./node_modules/vue-style-loader/lib/listToStyles.js ***! \***********************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return listToStyles; }); /** * Translates the list format produced by css-loader into something * easier to manipulate. */ function listToStyles (parentId, list) { var styles = [] var newStyles = {} for (var i = 0; i < list.length; i++) { var item = list[i] var id = item[0] var css = item[1] var media = item[2] var sourceMap = item[3] var part = { id: parentId + ':' + i, css: css, media: media, sourceMap: sourceMap } if (!newStyles[id]) { styles.push(newStyles[id] = { id: id, parts: [part] }) } else { newStyles[id].parts.push(part) } } return styles } /***/ }), /***/ "./node_modules/vue/dist/vue.runtime.esm.js": /*!**************************************************!*\ !*** ./node_modules/vue/dist/vue.runtime.esm.js ***! \**************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /*! * Vue.js v2.6.10 * (c) 2014-2019 Evan You * Released under the MIT License. */ /* */ var emptyObject = Object.freeze({}); // These helpers produce better VM code in JS engines due to their // explicitness and function inlining. function isUndef (v) { return v === undefined || v === null } function isDef (v) { return v !== undefined && v !== null } function isTrue (v) { return v === true } function isFalse (v) { return v === false } /** * Check if value is primitive. */ function isPrimitive (value) { return ( typeof value === 'string' || typeof value === 'number' || // $flow-disable-line typeof value === 'symbol' || typeof value === 'boolean' ) } /** * Quick object check - this is primarily used to tell * Objects from primitive values when we know the value * is a JSON-compliant type. */ function isObject (obj) { return obj !== null && typeof obj === 'object' } /** * Get the raw type string of a value, e.g., [object Object]. */ var _toString = Object.prototype.toString; function toRawType (value) { return _toString.call(value).slice(8, -1) } /** * Strict object type check. Only returns true * for plain JavaScript objects. */ function isPlainObject (obj) { return _toString.call(obj) === '[object Object]' } function isRegExp (v) { return _toString.call(v) === '[object RegExp]' } /** * Check if val is a valid array index. */ function isValidArrayIndex (val) { var n = parseFloat(String(val)); return n >= 0 && Math.floor(n) === n && isFinite(val) } function isPromise (val) { return ( isDef(val) && typeof val.then === 'function' && typeof val.catch === 'function' ) } /** * Convert a value to a string that is actually rendered. */ function toString (val) { return val == null ? '' : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) ? JSON.stringify(val, null, 2) : String(val) } /** * Convert an input value to a number for persistence. * If the conversion fails, return original string. */ function toNumber (val) { var n = parseFloat(val); return isNaN(n) ? val : n } /** * Make a map and return a function for checking if a key * is in that map. */ function makeMap ( str, expectsLowerCase ) { var map = Object.create(null); var list = str.split(','); for (var i = 0; i < list.length; i++) { map[list[i]] = true; } return expectsLowerCase ? function (val) { return map[val.toLowerCase()]; } : function (val) { return map[val]; } } /** * Check if a tag is a built-in tag. */ var isBuiltInTag = makeMap('slot,component', true); /** * Check if an attribute is a reserved attribute. */ var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); /** * Remove an item from an array. */ function remove (arr, item) { if (arr.length) { var index = arr.indexOf(item); if (index > -1) { return arr.splice(index, 1) } } } /** * Check whether an object has the property. */ var hasOwnProperty = Object.prototype.hasOwnProperty; function hasOwn (obj, key) { return hasOwnProperty.call(obj, key) } /** * Create a cached version of a pure function. */ function cached (fn) { var cache = Object.create(null); return (function cachedFn (str) { var hit = cache[str]; return hit || (cache[str] = fn(str)) }) } /** * Camelize a hyphen-delimited string. */ var camelizeRE = /-(\w)/g; var camelize = cached(function (str) { return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) }); /** * Capitalize a string. */ var capitalize = cached(function (str) { return str.charAt(0).toUpperCase() + str.slice(1) }); /** * Hyphenate a camelCase string. */ var hyphenateRE = /\B([A-Z])/g; var hyphenate = cached(function (str) { return str.replace(hyphenateRE, '-$1').toLowerCase() }); /** * Simple bind polyfill for environments that do not support it, * e.g., PhantomJS 1.x. Technically, we don't need this anymore * since native bind is now performant enough in most browsers. * But removing it would mean breaking code that was able to run in * PhantomJS 1.x, so this must be kept for backward compatibility. */ /* istanbul ignore next */ function polyfillBind (fn, ctx) { function boundFn (a) { var l = arguments.length; return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx) } boundFn._length = fn.length; return boundFn } function nativeBind (fn, ctx) { return fn.bind(ctx) } var bind = Function.prototype.bind ? nativeBind : polyfillBind; /** * Convert an Array-like object to a real Array. */ function toArray (list, start) { start = start || 0; var i = list.length - start; var ret = new Array(i); while (i--) { ret[i] = list[i + start]; } return ret } /** * Mix properties into target object. */ function extend (to, _from) { for (var key in _from) { to[key] = _from[key]; } return to } /** * Merge an Array of Objects into a single Object. */ function toObject (arr) { var res = {}; for (var i = 0; i < arr.length; i++) { if (arr[i]) { extend(res, arr[i]); } } return res } /* eslint-disable no-unused-vars */ /** * Perform no operation. * Stubbing args to make Flow happy without leaving useless transpiled code * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). */ function noop (a, b, c) {} /** * Always return false. */ var no = function (a, b, c) { return false; }; /* eslint-enable no-unused-vars */ /** * Return the same value. */ var identity = function (_) { return _; }; /** * Check if two values are loosely equal - that is, * if they are plain objects, do they have the same shape? */ function looseEqual (a, b) { if (a === b) { return true } var isObjectA = isObject(a); var isObjectB = isObject(b); if (isObjectA && isObjectB) { try { var isArrayA = Array.isArray(a); var isArrayB = Array.isArray(b); if (isArrayA && isArrayB) { return a.length === b.length && a.every(function (e, i) { return looseEqual(e, b[i]) }) } else if (a instanceof Date && b instanceof Date) { return a.getTime() === b.getTime() } else if (!isArrayA && !isArrayB) { var keysA = Object.keys(a); var keysB = Object.keys(b); return keysA.length === keysB.length && keysA.every(function (key) { return looseEqual(a[key], b[key]) }) } else { /* istanbul ignore next */ return false } } catch (e) { /* istanbul ignore next */ return false } } else if (!isObjectA && !isObjectB) { return String(a) === String(b) } else { return false } } /** * Return the first index at which a loosely equal value can be * found in the array (if value is a plain object, the array must * contain an object of the same shape), or -1 if it is not present. */ function looseIndexOf (arr, val) { for (var i = 0; i < arr.length; i++) { if (looseEqual(arr[i], val)) { return i } } return -1 } /** * Ensure a function is called only once. */ function once (fn) { var called = false; return function () { if (!called) { called = true; fn.apply(this, arguments); } } } var SSR_ATTR = 'data-server-rendered'; var ASSET_TYPES = [ 'component', 'directive', 'filter' ]; var LIFECYCLE_HOOKS = [ 'beforeCreate', 'created', 'beforeMount', 'mounted', 'beforeUpdate', 'updated', 'beforeDestroy', 'destroyed', 'activated', 'deactivated', 'errorCaptured', 'serverPrefetch' ]; /* */ var config = ({ /** * Option merge strategies (used in core/util/options) */ // $flow-disable-line optionMergeStrategies: Object.create(null), /** * Whether to suppress warnings. */ silent: false, /** * Show production mode tip message on boot? */ productionTip: "development" !== 'production', /** * Whether to enable devtools */ devtools: "development" !== 'production', /** * Whether to record perf */ performance: false, /** * Error handler for watcher errors */ errorHandler: null, /** * Warn handler for watcher warns */ warnHandler: null, /** * Ignore certain custom elements */ ignoredElements: [], /** * Custom user key aliases for v-on */ // $flow-disable-line keyCodes: Object.create(null), /** * Check if a tag is reserved so that it cannot be registered as a * component. This is platform-dependent and may be overwritten. */ isReservedTag: no, /** * Check if an attribute is reserved so that it cannot be used as a component * prop. This is platform-dependent and may be overwritten. */ isReservedAttr: no, /** * Check if a tag is an unknown element. * Platform-dependent. */ isUnknownElement: no, /** * Get the namespace of an element */ getTagNamespace: noop, /** * Parse the real tag name for the specific platform. */ parsePlatformTagName: identity, /** * Check if an attribute must be bound using property, e.g. value * Platform-dependent. */ mustUseProp: no, /** * Perform updates asynchronously. Intended to be used by Vue Test Utils * This will significantly reduce performance if set to false. */ async: true, /** * Exposed for legacy reasons */ _lifecycleHooks: LIFECYCLE_HOOKS }); /* */ /** * unicode letters used for parsing html tags, component names and property paths. * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname * skipping \u10000-\uEFFFF due to it freezing up PhantomJS */ var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/; /** * Check if a string starts with $ or _ */ function isReserved (str) { var c = (str + '').charCodeAt(0); return c === 0x24 || c === 0x5F } /** * Define a property. */ function def (obj, key, val, enumerable) { Object.defineProperty(obj, key, { value: val, enumerable: !!enumerable, writable: true, configurable: true }); } /** * Parse simple path. */ var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]")); function parsePath (path) { if (bailRE.test(path)) { return } var segments = path.split('.'); return function (obj) { for (var i = 0; i < segments.length; i++) { if (!obj) { return } obj = obj[segments[i]]; } return obj } } /* */ // can we use __proto__? var hasProto = '__proto__' in {}; // Browser environment sniffing var inBrowser = typeof window !== 'undefined'; var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); var UA = inBrowser && window.navigator.userAgent.toLowerCase(); var isIE = UA && /msie|trident/.test(UA); var isIE9 = UA && UA.indexOf('msie 9.0') > 0; var isEdge = UA && UA.indexOf('edge/') > 0; var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android'); var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios'); var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; var isPhantomJS = UA && /phantomjs/.test(UA); var isFF = UA && UA.match(/firefox\/(\d+)/); // Firefox has a "watch" function on Object.prototype... var nativeWatch = ({}).watch; var supportsPassive = false; if (inBrowser) { try { var opts = {}; Object.defineProperty(opts, 'passive', ({ get: function get () { /* istanbul ignore next */ supportsPassive = true; } })); // https://github.com/facebook/flow/issues/285 window.addEventListener('test-passive', null, opts); } catch (e) {} } // this needs to be lazy-evaled because vue may be required before // vue-server-renderer can set VUE_ENV var _isServer; var isServerRendering = function () { if (_isServer === undefined) { /* istanbul ignore if */ if (!inBrowser && !inWeex && typeof global !== 'undefined') { // detect presence of vue-server-renderer and avoid // Webpack shimming the process _isServer = global['process'] && global['process'].env.VUE_ENV === 'server'; } else { _isServer = false; } } return _isServer }; // detect devtools var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; /* istanbul ignore next */ function isNative (Ctor) { return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) } var hasSymbol = typeof Symbol !== 'undefined' && isNative(Symbol) && typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); var _Set; /* istanbul ignore if */ // $flow-disable-line if (typeof Set !== 'undefined' && isNative(Set)) { // use native Set when available. _Set = Set; } else { // a non-standard Set polyfill that only works with primitive keys. _Set = /*@__PURE__*/(function () { function Set () { this.set = Object.create(null); } Set.prototype.has = function has (key) { return this.set[key] === true }; Set.prototype.add = function add (key) { this.set[key] = true; }; Set.prototype.clear = function clear () { this.set = Object.create(null); }; return Set; }()); } /* */ var warn = noop; var tip = noop; var generateComponentTrace = (noop); // work around flow check var formatComponentName = (noop); if (true) { var hasConsole = typeof console !== 'undefined'; var classifyRE = /(?:^|[-_])(\w)/g; var classify = function (str) { return str .replace(classifyRE, function (c) { return c.toUpperCase(); }) .replace(/[-_]/g, ''); }; warn = function (msg, vm) { var trace = vm ? generateComponentTrace(vm) : ''; if (config.warnHandler) { config.warnHandler.call(null, msg, vm, trace); } else if (hasConsole && (!config.silent)) { console.error(("[Vue warn]: " + msg + trace)); } }; tip = function (msg, vm) { if (hasConsole && (!config.silent)) { console.warn("[Vue tip]: " + msg + ( vm ? generateComponentTrace(vm) : '' )); } }; formatComponentName = function (vm, includeFile) { if (vm.$root === vm) { return '' } var options = typeof vm === 'function' && vm.cid != null ? vm.options : vm._isVue ? vm.$options || vm.constructor.options : vm; var name = options.name || options._componentTag; var file = options.__file; if (!name && file) { var match = file.match(/([^/\\]+)\.vue$/); name = match && match[1]; } return ( (name ? ("<" + (classify(name)) + ">") : "") + (file && includeFile !== false ? (" at " + file) : '') ) }; var repeat = function (str, n) { var res = ''; while (n) { if (n % 2 === 1) { res += str; } if (n > 1) { str += str; } n >>= 1; } return res }; generateComponentTrace = function (vm) { if (vm._isVue && vm.$parent) { var tree = []; var currentRecursiveSequence = 0; while (vm) { if (tree.length > 0) { var last = tree[tree.length - 1]; if (last.constructor === vm.constructor) { currentRecursiveSequence++; vm = vm.$parent; continue } else if (currentRecursiveSequence > 0) { tree[tree.length - 1] = [last, currentRecursiveSequence]; currentRecursiveSequence = 0; } } tree.push(vm); vm = vm.$parent; } return '\n\nfound in\n\n' + tree .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm) ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)") : formatComponentName(vm))); }) .join('\n') } else { return ("\n\n(found in " + (formatComponentName(vm)) + ")") } }; } /* */ var uid = 0; /** * A dep is an observable that can have multiple * directives subscribing to it. */ var Dep = function Dep () { this.id = uid++; this.subs = []; }; Dep.prototype.addSub = function addSub (sub) { this.subs.push(sub); }; Dep.prototype.removeSub = function removeSub (sub) { remove(this.subs, sub); }; Dep.prototype.depend = function depend () { if (Dep.target) { Dep.target.addDep(this); } }; Dep.prototype.notify = function notify () { // stabilize the subscriber list first var subs = this.subs.slice(); if ( true && !config.async) { // subs aren't sorted in scheduler if not running async // we need to sort them now to make sure they fire in correct // order subs.sort(function (a, b) { return a.id - b.id; }); } for (var i = 0, l = subs.length; i < l; i++) { subs[i].update(); } }; // The current target watcher being evaluated. // This is globally unique because only one watcher // can be evaluated at a time. Dep.target = null; var targetStack = []; function pushTarget (target) { targetStack.push(target); Dep.target = target; } function popTarget () { targetStack.pop(); Dep.target = targetStack[targetStack.length - 1]; } /* */ var VNode = function VNode ( tag, data, children, text, elm, context, componentOptions, asyncFactory ) { this.tag = tag; this.data = data; this.children = children; this.text = text; this.elm = elm; this.ns = undefined; this.context = context; this.fnContext = undefined; this.fnOptions = undefined; this.fnScopeId = undefined; this.key = data && data.key; this.componentOptions = componentOptions; this.componentInstance = undefined; this.parent = undefined; this.raw = false; this.isStatic = false; this.isRootInsert = true; this.isComment = false; this.isCloned = false; this.isOnce = false; this.asyncFactory = asyncFactory; this.asyncMeta = undefined; this.isAsyncPlaceholder = false; }; var prototypeAccessors = { child: { configurable: true } }; // DEPRECATED: alias for componentInstance for backwards compat. /* istanbul ignore next */ prototypeAccessors.child.get = function () { return this.componentInstance }; Object.defineProperties( VNode.prototype, prototypeAccessors ); var createEmptyVNode = function (text) { if ( text === void 0 ) text = ''; var node = new VNode(); node.text = text; node.isComment = true; return node }; function createTextVNode (val) { return new VNode(undefined, undefined, undefined, String(val)) } // optimized shallow clone // used for static nodes and slot nodes because they may be reused across // multiple renders, cloning them avoids errors when DOM manipulations rely // on their elm reference. function cloneVNode (vnode) { var cloned = new VNode( vnode.tag, vnode.data, // #7975 // clone children array to avoid mutating original in case of cloning // a child. vnode.children && vnode.children.slice(), vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory ); cloned.ns = vnode.ns; cloned.isStatic = vnode.isStatic; cloned.key = vnode.key; cloned.isComment = vnode.isComment; cloned.fnContext = vnode.fnContext; cloned.fnOptions = vnode.fnOptions; cloned.fnScopeId = vnode.fnScopeId; cloned.asyncMeta = vnode.asyncMeta; cloned.isCloned = true; return cloned } /* * not type checking this file because flow doesn't play well with * dynamically accessing methods on Array prototype */ var arrayProto = Array.prototype; var arrayMethods = Object.create(arrayProto); var methodsToPatch = [ 'push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse' ]; /** * Intercept mutating methods and emit events */ methodsToPatch.forEach(function (method) { // cache original method var original = arrayProto[method]; def(arrayMethods, method, function mutator () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var result = original.apply(this, args); var ob = this.__ob__; var inserted; switch (method) { case 'push': case 'unshift': inserted = args; break case 'splice': inserted = args.slice(2); break } if (inserted) { ob.observeArray(inserted); } // notify change ob.dep.notify(); return result }); }); /* */ var arrayKeys = Object.getOwnPropertyNames(arrayMethods); /** * In some cases we may want to disable observation inside a component's * update computation. */ var shouldObserve = true; function toggleObserving (value) { shouldObserve = value; } /** * Observer class that is attached to each observed * object. Once attached, the observer converts the target * object's property keys into getter/setters that * collect dependencies and dispatch updates. */ var Observer = function Observer (value) { this.value = value; this.dep = new Dep(); this.vmCount = 0; def(value, '__ob__', this); if (Array.isArray(value)) { if (hasProto) { protoAugment(value, arrayMethods); } else { copyAugment(value, arrayMethods, arrayKeys); } this.observeArray(value); } else { this.walk(value); } }; /** * Walk through all properties and convert them into * getter/setters. This method should only be called when * value type is Object. */ Observer.prototype.walk = function walk (obj) { var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { defineReactive$$1(obj, keys[i]); } }; /** * Observe a list of Array items. */ Observer.prototype.observeArray = function observeArray (items) { for (var i = 0, l = items.length; i < l; i++) { observe(items[i]); } }; // helpers /** * Augment a target Object or Array by intercepting * the prototype chain using __proto__ */ function protoAugment (target, src) { /* eslint-disable no-proto */ target.__proto__ = src; /* eslint-enable no-proto */ } /** * Augment a target Object or Array by defining * hidden properties. */ /* istanbul ignore next */ function copyAugment (target, src, keys) { for (var i = 0, l = keys.length; i < l; i++) { var key = keys[i]; def(target, key, src[key]); } } /** * Attempt to create an observer instance for a value, * returns the new observer if successfully observed, * or the existing observer if the value already has one. */ function observe (value, asRootData) { if (!isObject(value) || value instanceof VNode) { return } var ob; if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { ob = value.__ob__; } else if ( shouldObserve && !isServerRendering() && (Array.isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue ) { ob = new Observer(value); } if (asRootData && ob) { ob.vmCount++; } return ob } /** * Define a reactive property on an Object. */ function defineReactive$$1 ( obj, key, val, customSetter, shallow ) { var dep = new Dep(); var property = Object.getOwnPropertyDescriptor(obj, key); if (property && property.configurable === false) { return } // cater for pre-defined getter/setters var getter = property && property.get; var setter = property && property.set; if ((!getter || setter) && arguments.length === 2) { val = obj[key]; } var childOb = !shallow && observe(val); Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: function reactiveGetter () { var value = getter ? getter.call(obj) : val; if (Dep.target) { dep.depend(); if (childOb) { childOb.dep.depend(); if (Array.isArray(value)) { dependArray(value); } } } return value }, set: function reactiveSetter (newVal) { var value = getter ? getter.call(obj) : val; /* eslint-disable no-self-compare */ if (newVal === value || (newVal !== newVal && value !== value)) { return } /* eslint-enable no-self-compare */ if ( true && customSetter) { customSetter(); } // #7981: for accessor properties without setter if (getter && !setter) { return } if (setter) { setter.call(obj, newVal); } else { val = newVal; } childOb = !shallow && observe(newVal); dep.notify(); } }); } /** * Set a property on an object. Adds the new property and * triggers change notification if the property doesn't * already exist. */ function set (target, key, val) { if ( true && (isUndef(target) || isPrimitive(target)) ) { warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target)))); } if (Array.isArray(target) && isValidArrayIndex(key)) { target.length = Math.max(target.length, key); target.splice(key, 1, val); return val } if (key in target && !(key in Object.prototype)) { target[key] = val; return val } var ob = (target).__ob__; if (target._isVue || (ob && ob.vmCount)) { true && warn( 'Avoid adding reactive properties to a Vue instance or its root $data ' + 'at runtime - declare it upfront in the data option.' ); return val } if (!ob) { target[key] = val; return val } defineReactive$$1(ob.value, key, val); ob.dep.notify(); return val } /** * Delete a property and trigger change if necessary. */ function del (target, key) { if ( true && (isUndef(target) || isPrimitive(target)) ) { warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target)))); } if (Array.isArray(target) && isValidArrayIndex(key)) { target.splice(key, 1); return } var ob = (target).__ob__; if (target._isVue || (ob && ob.vmCount)) { true && warn( 'Avoid deleting properties on a Vue instance or its root $data ' + '- just set it to null.' ); return } if (!hasOwn(target, key)) { return } delete target[key]; if (!ob) { return } ob.dep.notify(); } /** * Collect dependencies on array elements when the array is touched, since * we cannot intercept array element access like property getters. */ function dependArray (value) { for (var e = (void 0), i = 0, l = value.length; i < l; i++) { e = value[i]; e && e.__ob__ && e.__ob__.dep.depend(); if (Array.isArray(e)) { dependArray(e); } } } /* */ /** * Option overwriting strategies are functions that handle * how to merge a parent option value and a child option * value into the final value. */ var strats = config.optionMergeStrategies; /** * Options with restrictions */ if (true) { strats.el = strats.propsData = function (parent, child, vm, key) { if (!vm) { warn( "option \"" + key + "\" can only be used during instance " + 'creation with the `new` keyword.' ); } return defaultStrat(parent, child) }; } /** * Helper that recursively merges two data objects together. */ function mergeData (to, from) { if (!from) { return to } var key, toVal, fromVal; var keys = hasSymbol ? Reflect.ownKeys(from) : Object.keys(from); for (var i = 0; i < keys.length; i++) { key = keys[i]; // in case the object is already observed... if (key === '__ob__') { continue } toVal = to[key]; fromVal = from[key]; if (!hasOwn(to, key)) { set(to, key, fromVal); } else if ( toVal !== fromVal && isPlainObject(toVal) && isPlainObject(fromVal) ) { mergeData(toVal, fromVal); } } return to } /** * Data */ function mergeDataOrFn ( parentVal, childVal, vm ) { if (!vm) { // in a Vue.extend merge, both should be functions if (!childVal) { return parentVal } if (!parentVal) { return childVal } // when parentVal & childVal are both present, // we need to return a function that returns the // merged result of both functions... no need to // check if parentVal is a function here because // it has to be a function to pass previous merges. return function mergedDataFn () { return mergeData( typeof childVal === 'function' ? childVal.call(this, this) : childVal, typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal ) } } else { return function mergedInstanceDataFn () { // instance merge var instanceData = typeof childVal === 'function' ? childVal.call(vm, vm) : childVal; var defaultData = typeof parentVal === 'function' ? parentVal.call(vm, vm) : parentVal; if (instanceData) { return mergeData(instanceData, defaultData) } else { return defaultData } } } } strats.data = function ( parentVal, childVal, vm ) { if (!vm) { if (childVal && typeof childVal !== 'function') { true && warn( 'The "data" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.', vm ); return parentVal } return mergeDataOrFn(parentVal, childVal) } return mergeDataOrFn(parentVal, childVal, vm) }; /** * Hooks and props are merged as arrays. */ function mergeHook ( parentVal, childVal ) { var res = childVal ? parentVal ? parentVal.concat(childVal) : Array.isArray(childVal) ? childVal : [childVal] : parentVal; return res ? dedupeHooks(res) : res } function dedupeHooks (hooks) { var res = []; for (var i = 0; i < hooks.length; i++) { if (res.indexOf(hooks[i]) === -1) { res.push(hooks[i]); } } return res } LIFECYCLE_HOOKS.forEach(function (hook) { strats[hook] = mergeHook; }); /** * Assets * * When a vm is present (instance creation), we need to do * a three-way merge between constructor options, instance * options and parent options. */ function mergeAssets ( parentVal, childVal, vm, key ) { var res = Object.create(parentVal || null); if (childVal) { true && assertObjectType(key, childVal, vm); return extend(res, childVal) } else { return res } } ASSET_TYPES.forEach(function (type) { strats[type + 's'] = mergeAssets; }); /** * Watchers. * * Watchers hashes should not overwrite one * another, so we merge them as arrays. */ strats.watch = function ( parentVal, childVal, vm, key ) { // work around Firefox's Object.prototype.watch... if (parentVal === nativeWatch) { parentVal = undefined; } if (childVal === nativeWatch) { childVal = undefined; } /* istanbul ignore if */ if (!childVal) { return Object.create(parentVal || null) } if (true) { assertObjectType(key, childVal, vm); } if (!parentVal) { return childVal } var ret = {}; extend(ret, parentVal); for (var key$1 in childVal) { var parent = ret[key$1]; var child = childVal[key$1]; if (parent && !Array.isArray(parent)) { parent = [parent]; } ret[key$1] = parent ? parent.concat(child) : Array.isArray(child) ? child : [child]; } return ret }; /** * Other object hashes. */ strats.props = strats.methods = strats.inject = strats.computed = function ( parentVal, childVal, vm, key ) { if (childVal && "development" !== 'production') { assertObjectType(key, childVal, vm); } if (!parentVal) { return childVal } var ret = Object.create(null); extend(ret, parentVal); if (childVal) { extend(ret, childVal); } return ret }; strats.provide = mergeDataOrFn; /** * Default strategy. */ var defaultStrat = function (parentVal, childVal) { return childVal === undefined ? parentVal : childVal }; /** * Validate component names */ function checkComponents (options) { for (var key in options.components) { validateComponentName(key); } } function validateComponentName (name) { if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) { warn( 'Invalid component name: "' + name + '". Component names ' + 'should conform to valid custom element name in html5 specification.' ); } if (isBuiltInTag(name) || config.isReservedTag(name)) { warn( 'Do not use built-in or reserved HTML elements as component ' + 'id: ' + name ); } } /** * Ensure all props option syntax are normalized into the * Object-based format. */ function normalizeProps (options, vm) { var props = options.props; if (!props) { return } var res = {}; var i, val, name; if (Array.isArray(props)) { i = props.length; while (i--) { val = props[i]; if (typeof val === 'string') { name = camelize(val); res[name] = { type: null }; } else if (true) { warn('props must be strings when using array syntax.'); } } } else if (isPlainObject(props)) { for (var key in props) { val = props[key]; name = camelize(key); res[name] = isPlainObject(val) ? val : { type: val }; } } else if (true) { warn( "Invalid value for option \"props\": expected an Array or an Object, " + "but got " + (toRawType(props)) + ".", vm ); } options.props = res; } /** * Normalize all injections into Object-based format */ function normalizeInject (options, vm) { var inject = options.inject; if (!inject) { return } var normalized = options.inject = {}; if (Array.isArray(inject)) { for (var i = 0; i < inject.length; i++) { normalized[inject[i]] = { from: inject[i] }; } } else if (isPlainObject(inject)) { for (var key in inject) { var val = inject[key]; normalized[key] = isPlainObject(val) ? extend({ from: key }, val) : { from: val }; } } else if (true) { warn( "Invalid value for option \"inject\": expected an Array or an Object, " + "but got " + (toRawType(inject)) + ".", vm ); } } /** * Normalize raw function directives into object format. */ function normalizeDirectives (options) { var dirs = options.directives; if (dirs) { for (var key in dirs) { var def$$1 = dirs[key]; if (typeof def$$1 === 'function') { dirs[key] = { bind: def$$1, update: def$$1 }; } } } } function assertObjectType (name, value, vm) { if (!isPlainObject(value)) { warn( "Invalid value for option \"" + name + "\": expected an Object, " + "but got " + (toRawType(value)) + ".", vm ); } } /** * Merge two option objects into a new one. * Core utility used in both instantiation and inheritance. */ function mergeOptions ( parent, child, vm ) { if (true) { checkComponents(child); } if (typeof child === 'function') { child = child.options; } normalizeProps(child, vm); normalizeInject(child, vm); normalizeDirectives(child); // Apply extends and mixins on the child options, // but only if it is a raw options object that isn't // the result of another mergeOptions call. // Only merged options has the _base property. if (!child._base) { if (child.extends) { parent = mergeOptions(parent, child.extends, vm); } if (child.mixins) { for (var i = 0, l = child.mixins.length; i < l; i++) { parent = mergeOptions(parent, child.mixins[i], vm); } } } var options = {}; var key; for (key in parent) { mergeField(key); } for (key in child) { if (!hasOwn(parent, key)) { mergeField(key); } } function mergeField (key) { var strat = strats[key] || defaultStrat; options[key] = strat(parent[key], child[key], vm, key); } return options } /** * Resolve an asset. * This function is used because child instances need access * to assets defined in its ancestor chain. */ function resolveAsset ( options, type, id, warnMissing ) { /* istanbul ignore if */ if (typeof id !== 'string') { return } var assets = options[type]; // check local registration variations first if (hasOwn(assets, id)) { return assets[id] } var camelizedId = camelize(id); if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } var PascalCaseId = capitalize(camelizedId); if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } // fallback to prototype chain var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; if ( true && warnMissing && !res) { warn( 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, options ); } return res } /* */ function validateProp ( key, propOptions, propsData, vm ) { var prop = propOptions[key]; var absent = !hasOwn(propsData, key); var value = propsData[key]; // boolean casting var booleanIndex = getTypeIndex(Boolean, prop.type); if (booleanIndex > -1) { if (absent && !hasOwn(prop, 'default')) { value = false; } else if (value === '' || value === hyphenate(key)) { // only cast empty string / same name to boolean if // boolean has higher priority var stringIndex = getTypeIndex(String, prop.type); if (stringIndex < 0 || booleanIndex < stringIndex) { value = true; } } } // check default value if (value === undefined) { value = getPropDefaultValue(vm, prop, key); // since the default value is a fresh copy, // make sure to observe it. var prevShouldObserve = shouldObserve; toggleObserving(true); observe(value); toggleObserving(prevShouldObserve); } if ( true ) { assertProp(prop, key, value, vm, absent); } return value } /** * Get the default value of a prop. */ function getPropDefaultValue (vm, prop, key) { // no default, return undefined if (!hasOwn(prop, 'default')) { return undefined } var def = prop.default; // warn against non-factory defaults for Object & Array if ( true && isObject(def)) { warn( 'Invalid default value for prop "' + key + '": ' + 'Props with type Object/Array must use a factory function ' + 'to return the default value.', vm ); } // the raw prop value was also undefined from previous render, // return previous default value to avoid unnecessary watcher trigger if (vm && vm.$options.propsData && vm.$options.propsData[key] === undefined && vm._props[key] !== undefined ) { return vm._props[key] } // call factory function for non-Function types // a value is Function if its prototype is function even across different execution context return typeof def === 'function' && getType(prop.type) !== 'Function' ? def.call(vm) : def } /** * Assert whether a prop is valid. */ function assertProp ( prop, name, value, vm, absent ) { if (prop.required && absent) { warn( 'Missing required prop: "' + name + '"', vm ); return } if (value == null && !prop.required) { return } var type = prop.type; var valid = !type || type === true; var expectedTypes = []; if (type) { if (!Array.isArray(type)) { type = [type]; } for (var i = 0; i < type.length && !valid; i++) { var assertedType = assertType(value, type[i]); expectedTypes.push(assertedType.expectedType || ''); valid = assertedType.valid; } } if (!valid) { warn( getInvalidTypeMessage(name, value, expectedTypes), vm ); return } var validator = prop.validator; if (validator) { if (!validator(value)) { warn( 'Invalid prop: custom validator check failed for prop "' + name + '".', vm ); } } } var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/; function assertType (value, type) { var valid; var expectedType = getType(type); if (simpleCheckRE.test(expectedType)) { var t = typeof value; valid = t === expectedType.toLowerCase(); // for primitive wrapper objects if (!valid && t === 'object') { valid = value instanceof type; } } else if (expectedType === 'Object') { valid = isPlainObject(value); } else if (expectedType === 'Array') { valid = Array.isArray(value); } else { valid = value instanceof type; } return { valid: valid, expectedType: expectedType } } /** * Use function string name to check built-in types, * because a simple equality check will fail when running * across different vms / iframes. */ function getType (fn) { var match = fn && fn.toString().match(/^\s*function (\w+)/); return match ? match[1] : '' } function isSameType (a, b) { return getType(a) === getType(b) } function getTypeIndex (type, expectedTypes) { if (!Array.isArray(expectedTypes)) { return isSameType(expectedTypes, type) ? 0 : -1 } for (var i = 0, len = expectedTypes.length; i < len; i++) { if (isSameType(expectedTypes[i], type)) { return i } } return -1 } function getInvalidTypeMessage (name, value, expectedTypes) { var message = "Invalid prop: type check failed for prop \"" + name + "\"." + " Expected " + (expectedTypes.map(capitalize).join(', ')); var expectedType = expectedTypes[0]; var receivedType = toRawType(value); var expectedValue = styleValue(value, expectedType); var receivedValue = styleValue(value, receivedType); // check if we need to specify expected value if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) { message += " with value " + expectedValue; } message += ", got " + receivedType + " "; // check if we need to specify received value if (isExplicable(receivedType)) { message += "with value " + receivedValue + "."; } return message } function styleValue (value, type) { if (type === 'String') { return ("\"" + value + "\"") } else if (type === 'Number') { return ("" + (Number(value))) } else { return ("" + value) } } function isExplicable (value) { var explicitTypes = ['string', 'number', 'boolean']; return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; }) } function isBoolean () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; }) } /* */ function handleError (err, vm, info) { // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. // See: https://github.com/vuejs/vuex/issues/1505 pushTarget(); try { if (vm) { var cur = vm; while ((cur = cur.$parent)) { var hooks = cur.$options.errorCaptured; if (hooks) { for (var i = 0; i < hooks.length; i++) { try { var capture = hooks[i].call(cur, err, vm, info) === false; if (capture) { return } } catch (e) { globalHandleError(e, cur, 'errorCaptured hook'); } } } } } globalHandleError(err, vm, info); } finally { popTarget(); } } function invokeWithErrorHandling ( handler, context, args, vm, info ) { var res; try { res = args ? handler.apply(context, args) : handler.call(context); if (res && !res._isVue && isPromise(res) && !res._handled) { res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); }); // issue #9511 // avoid catch triggering multiple times when nested calls res._handled = true; } } catch (e) { handleError(e, vm, info); } return res } function globalHandleError (err, vm, info) { if (config.errorHandler) { try { return config.errorHandler.call(null, err, vm, info) } catch (e) { // if the user intentionally throws the original error in the handler, // do not log it twice if (e !== err) { logError(e, null, 'config.errorHandler'); } } } logError(err, vm, info); } function logError (err, vm, info) { if (true) { warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); } /* istanbul ignore else */ if ((inBrowser || inWeex) && typeof console !== 'undefined') { console.error(err); } else { throw err } } /* */ var isUsingMicroTask = false; var callbacks = []; var pending = false; function flushCallbacks () { pending = false; var copies = callbacks.slice(0); callbacks.length = 0; for (var i = 0; i < copies.length; i++) { copies[i](); } } // Here we have async deferring wrappers using microtasks. // In 2.5 we used (macro) tasks (in combination with microtasks). // However, it has subtle problems when state is changed right before repaint // (e.g. #6813, out-in transitions). // Also, using (macro) tasks in event handler would cause some weird behaviors // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109). // So we now use microtasks everywhere, again. // A major drawback of this tradeoff is that there are some scenarios // where microtasks have too high a priority and fire in between supposedly // sequential events (e.g. #4521, #6690, which have workarounds) // or even between bubbling of the same event (#6566). var timerFunc; // The nextTick behavior leverages the microtask queue, which can be accessed // via either native Promise.then or MutationObserver. // MutationObserver has wider support, however it is seriously bugged in // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It // completely stops working after triggering a few times... so, if native // Promise is available, we will use it: /* istanbul ignore next, $flow-disable-line */ if (typeof Promise !== 'undefined' && isNative(Promise)) { var p = Promise.resolve(); timerFunc = function () { p.then(flushCallbacks); // In problematic UIWebViews, Promise.then doesn't completely break, but // it can get stuck in a weird state where callbacks are pushed into the // microtask queue but the queue isn't being flushed, until the browser // needs to do some other work, e.g. handle a timer. Therefore we can // "force" the microtask queue to be flushed by adding an empty timer. if (isIOS) { setTimeout(noop); } }; isUsingMicroTask = true; } else if (!isIE && typeof MutationObserver !== 'undefined' && ( isNative(MutationObserver) || // PhantomJS and iOS 7.x MutationObserver.toString() === '[object MutationObserverConstructor]' )) { // Use MutationObserver where native Promise is not available, // e.g. PhantomJS, iOS7, Android 4.4 // (#6466 MutationObserver is unreliable in IE11) var counter = 1; var observer = new MutationObserver(flushCallbacks); var textNode = document.createTextNode(String(counter)); observer.observe(textNode, { characterData: true }); timerFunc = function () { counter = (counter + 1) % 2; textNode.data = String(counter); }; isUsingMicroTask = true; } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { // Fallback to setImmediate. // Techinically it leverages the (macro) task queue, // but it is still a better choice than setTimeout. timerFunc = function () { setImmediate(flushCallbacks); }; } else { // Fallback to setTimeout. timerFunc = function () { setTimeout(flushCallbacks, 0); }; } function nextTick (cb, ctx) { var _resolve; callbacks.push(function () { if (cb) { try { cb.call(ctx); } catch (e) { handleError(e, ctx, 'nextTick'); } } else if (_resolve) { _resolve(ctx); } }); if (!pending) { pending = true; timerFunc(); } // $flow-disable-line if (!cb && typeof Promise !== 'undefined') { return new Promise(function (resolve) { _resolve = resolve; }) } } /* */ /* not type checking this file because flow doesn't play well with Proxy */ var initProxy; if (true) { var allowedGlobals = makeMap( 'Infinity,undefined,NaN,isFinite,isNaN,' + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + 'require' // for Webpack/Browserify ); var warnNonPresent = function (target, key) { warn( "Property or method \"" + key + "\" is not defined on the instance but " + 'referenced during render. Make sure that this property is reactive, ' + 'either in the data option, or for class-based components, by ' + 'initializing the property. ' + 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.', target ); }; var warnReservedPrefix = function (target, key) { warn( "Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " + 'properties starting with "$" or "_" are not proxied in the Vue instance to ' + 'prevent conflicts with Vue internals' + 'See: https://vuejs.org/v2/api/#data', target ); }; var hasProxy = typeof Proxy !== 'undefined' && isNative(Proxy); if (hasProxy) { var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact'); config.keyCodes = new Proxy(config.keyCodes, { set: function set (target, key, value) { if (isBuiltInModifier(key)) { warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key)); return false } else { target[key] = value; return true } } }); } var hasHandler = { has: function has (target, key) { var has = key in target; var isAllowed = allowedGlobals(key) || (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data)); if (!has && !isAllowed) { if (key in target.$data) { warnReservedPrefix(target, key); } else { warnNonPresent(target, key); } } return has || !isAllowed } }; var getHandler = { get: function get (target, key) { if (typeof key === 'string' && !(key in target)) { if (key in target.$data) { warnReservedPrefix(target, key); } else { warnNonPresent(target, key); } } return target[key] } }; initProxy = function initProxy (vm) { if (hasProxy) { // determine which proxy handler to use var options = vm.$options; var handlers = options.render && options.render._withStripped ? getHandler : hasHandler; vm._renderProxy = new Proxy(vm, handlers); } else { vm._renderProxy = vm; } }; } /* */ var seenObjects = new _Set(); /** * Recursively traverse an object to evoke all converted * getters, so that every nested property inside the object * is collected as a "deep" dependency. */ function traverse (val) { _traverse(val, seenObjects); seenObjects.clear(); } function _traverse (val, seen) { var i, keys; var isA = Array.isArray(val); if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) { return } if (val.__ob__) { var depId = val.__ob__.dep.id; if (seen.has(depId)) { return } seen.add(depId); } if (isA) { i = val.length; while (i--) { _traverse(val[i], seen); } } else { keys = Object.keys(val); i = keys.length; while (i--) { _traverse(val[keys[i]], seen); } } } var mark; var measure; if (true) { var perf = inBrowser && window.performance; /* istanbul ignore if */ if ( perf && perf.mark && perf.measure && perf.clearMarks && perf.clearMeasures ) { mark = function (tag) { return perf.mark(tag); }; measure = function (name, startTag, endTag) { perf.measure(name, startTag, endTag); perf.clearMarks(startTag); perf.clearMarks(endTag); // perf.clearMeasures(name) }; } } /* */ var normalizeEvent = cached(function (name) { var passive = name.charAt(0) === '&'; name = passive ? name.slice(1) : name; var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first name = once$$1 ? name.slice(1) : name; var capture = name.charAt(0) === '!'; name = capture ? name.slice(1) : name; return { name: name, once: once$$1, capture: capture, passive: passive } }); function createFnInvoker (fns, vm) { function invoker () { var arguments$1 = arguments; var fns = invoker.fns; if (Array.isArray(fns)) { var cloned = fns.slice(); for (var i = 0; i < cloned.length; i++) { invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler"); } } else { // return handler return value for single handlers return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler") } } invoker.fns = fns; return invoker } function updateListeners ( on, oldOn, add, remove$$1, createOnceHandler, vm ) { var name, def$$1, cur, old, event; for (name in on) { def$$1 = cur = on[name]; old = oldOn[name]; event = normalizeEvent(name); if (isUndef(cur)) { true && warn( "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), vm ); } else if (isUndef(old)) { if (isUndef(cur.fns)) { cur = on[name] = createFnInvoker(cur, vm); } if (isTrue(event.once)) { cur = on[name] = createOnceHandler(event.name, cur, event.capture); } add(event.name, cur, event.capture, event.passive, event.params); } else if (cur !== old) { old.fns = cur; on[name] = old; } } for (name in oldOn) { if (isUndef(on[name])) { event = normalizeEvent(name); remove$$1(event.name, oldOn[name], event.capture); } } } /* */ function mergeVNodeHook (def, hookKey, hook) { if (def instanceof VNode) { def = def.data.hook || (def.data.hook = {}); } var invoker; var oldHook = def[hookKey]; function wrappedHook () { hook.apply(this, arguments); // important: remove merged hook to ensure it's called only once // and prevent memory leak remove(invoker.fns, wrappedHook); } if (isUndef(oldHook)) { // no existing hook invoker = createFnInvoker([wrappedHook]); } else { /* istanbul ignore if */ if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { // already a merged invoker invoker = oldHook; invoker.fns.push(wrappedHook); } else { // existing plain hook invoker = createFnInvoker([oldHook, wrappedHook]); } } invoker.merged = true; def[hookKey] = invoker; } /* */ function extractPropsFromVNodeData ( data, Ctor, tag ) { // we are only extracting raw values here. // validation and default values are handled in the child // component itself. var propOptions = Ctor.options.props; if (isUndef(propOptions)) { return } var res = {}; var attrs = data.attrs; var props = data.props; if (isDef(attrs) || isDef(props)) { for (var key in propOptions) { var altKey = hyphenate(key); if (true) { var keyInLowerCase = key.toLowerCase(); if ( key !== keyInLowerCase && attrs && hasOwn(attrs, keyInLowerCase) ) { tip( "Prop \"" + keyInLowerCase + "\" is passed to component " + (formatComponentName(tag || Ctor)) + ", but the declared prop name is" + " \"" + key + "\". " + "Note that HTML attributes are case-insensitive and camelCased " + "props need to use their kebab-case equivalents when using in-DOM " + "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"." ); } } checkProp(res, props, key, altKey, true) || checkProp(res, attrs, key, altKey, false); } } return res } function checkProp ( res, hash, key, altKey, preserve ) { if (isDef(hash)) { if (hasOwn(hash, key)) { res[key] = hash[key]; if (!preserve) { delete hash[key]; } return true } else if (hasOwn(hash, altKey)) { res[key] = hash[altKey]; if (!preserve) { delete hash[altKey]; } return true } } return false } /* */ // The template compiler attempts to minimize the need for normalization by // statically analyzing the template at compile time. // // For plain HTML markup, normalization can be completely skipped because the // generated render function is guaranteed to return Array. There are // two cases where extra normalization is needed: // 1. When the children contains components - because a functional component // may return an Array instead of a single root. In this case, just a simple // normalization is needed - if any child is an Array, we flatten the whole // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep // because functional components already normalize their own children. function simpleNormalizeChildren (children) { for (var i = 0; i < children.length; i++) { if (Array.isArray(children[i])) { return Array.prototype.concat.apply([], children) } } return children } // 2. When the children contains constructs that always generated nested Arrays, // e.g.