From 367491f8aaa37b4392fae6080fa0c850862a60d6 Mon Sep 17 00:00:00 2001 From: zhongjin Date: Fri, 28 Sep 2018 09:18:42 +0800 Subject: [PATCH] Initial commit --- .gitignore | 2 + .npmignore | 6 + .travis.yml | 7 + Gruntfile.js | 193 ++++++ LICENSE | 22 + README.md | 39 ++ admin/vis-canvas-gauges.png | Bin 0 -> 1950 bytes img/logo.svg | 1 + img/widgets.png | Bin 0 -> 47672 bytes io-package.json | 70 ++ package.json | 49 ++ tasks/jscs.js | 17 + tasks/jscsRules.js | 36 ++ tasks/jshint.js | 17 + test/testPackageFiles.js | 91 +++ widgets/canvas-gauges.html | 606 ++++++++++++++++++ .../canvas-gauges/img/prev/Prev_cgCompas.png | Bin 0 -> 6104 bytes .../canvas-gauges/img/prev/Prev_cgFlat.png | Bin 0 -> 1602 bytes .../canvas-gauges/img/prev/Prev_cgLinear.png | Bin 0 -> 3635 bytes .../canvas-gauges/img/prev/Prev_cgRadial.png | Bin 0 -> 6756 bytes widgets/canvas-gauges/js/gauge.min.js | 28 + widgets/canvas-gauges/js/gauge.min.js.map | 1 + 22 files changed, 1185 insertions(+) create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .travis.yml create mode 100644 Gruntfile.js create mode 100644 LICENSE create mode 100644 README.md create mode 100644 admin/vis-canvas-gauges.png create mode 100644 img/logo.svg create mode 100644 img/widgets.png create mode 100644 io-package.json create mode 100644 package.json create mode 100644 tasks/jscs.js create mode 100644 tasks/jscsRules.js create mode 100644 tasks/jshint.js create mode 100644 test/testPackageFiles.js create mode 100644 widgets/canvas-gauges.html create mode 100644 widgets/canvas-gauges/img/prev/Prev_cgCompas.png create mode 100644 widgets/canvas-gauges/img/prev/Prev_cgFlat.png create mode 100644 widgets/canvas-gauges/img/prev/Prev_cgLinear.png create mode 100644 widgets/canvas-gauges/img/prev/Prev_cgRadial.png create mode 100644 widgets/canvas-gauges/js/gauge.min.js create mode 100644 widgets/canvas-gauges/js/gauge.min.js.map diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a0f2b01 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/.idea diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..7e1b51c --- /dev/null +++ b/.npmignore @@ -0,0 +1,6 @@ +Gruntfile.js +tasks +node_modules +test +.travis.yml +appveyor.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c05adf9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +os: + - linux +language: node_js +node_js: + - '4' + - '8' + - '10' diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..7a3daf9 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,193 @@ +// To use this file in WebStorm, right click on the file name in the Project Panel (normally left) and select "Open Grunt Console" + +/** @namespace __dirname */ +/* jshint -W097 */// jshint strict:false +/*jslint node: true */ +"use strict"; + +function getAppName() { + var parts = __dirname.replace(/\\/g, '/').split('/'); + return parts[parts.length - 1].split('.')[0].toLowerCase(); +} + +module.exports = function (grunt) { + + var srcDir = __dirname + '/'; + var pkg = grunt.file.readJSON('package.json'); + var iopackage = grunt.file.readJSON('io-package.json'); + var version = (pkg && pkg.version) ? pkg.version : iopackage.common.version; + var appName = getAppName(); + + // Project configuration. + grunt.initConfig({ + pkg: pkg, + replace: { + core: { + options: { + patterns: [ + { + match: /var version = *'[\.0-9]*';/g, + replacement: "var version = '" + version + "';" + }, + { + match: /"version"\: *"[\.0-9]*",/g, + replacement: '"version": "' + version + '",' + } + ] + }, + files: [ + { + expand: true, + flatten: true, + src: [ + srcDir + 'controller.js', + srcDir + 'package.json', + srcDir + 'io-package.json' + ], + dest: srcDir + } + ] + }, + name: { + options: { + patterns: [ + { + match: /yunkong2/gi, + replacement: appName + } + ] + }, + files: [ + { + expand: true, + flatten: true, + src: [ + srcDir + '*.*', + srcDir + '.travis.yml' + ], + dest: srcDir + }, + { + expand: true, + flatten: true, + src: [ + srcDir + 'admin/*.*', + '!' + srcDir + 'admin/*.png' + ], + dest: srcDir + 'admin' + }, + { + expand: true, + flatten: true, + src: [ + srcDir + 'lib/*.*' + ], + dest: srcDir + 'lib' + }, + { + expand: true, + flatten: true, + src: [ + srcDir + 'example/*.*' + ], + dest: srcDir + 'example' + }, + { + expand: true, + flatten: true, + src: [ + srcDir + 'www/*.*' + ], + dest: srcDir + 'www' + } + ] + } + }, + // Javascript code styler + jscs: require(__dirname + '/tasks/jscs.js'), + // Lint + jshint: require(__dirname + '/tasks/jshint.js'), + http: { + get_hjscs: { + options: { + url: 'https://raw.githubusercontent.com/' + appName + '/' + appName + '.js-controller/master/tasks/jscs.js' + }, + dest: 'tasks/jscs.js' + }, + get_jshint: { + options: { + url: 'https://raw.githubusercontent.com/' + appName + '/' + appName + '.js-controller/master/tasks/jshint.js' + }, + dest: 'tasks/jshint.js' + }, + get_gruntfile: { + options: { + url: 'https://raw.githubusercontent.com/' + appName + '/' + appName + '.build/master/adapters/Gruntfile.js' + }, + dest: 'Gruntfile.js' + }, + get_utilsfile: { + options: { + url: 'https://raw.githubusercontent.com/' + appName + '/' + appName + '.build/master/adapters/utils.js' + }, + dest: 'lib/utils.js' + }, + get_jscsRules: { + options: { + url: 'https://raw.githubusercontent.com/' + appName + '/' + appName + '.js-controller/master/tasks/jscsRules.js' + }, + dest: 'tasks/jscsRules.js' + } + } + }); + + grunt.registerTask('updateReadme', function () { + var readme = grunt.file.read('README.md'); + var pos = readme.indexOf('## Changelog\n'); + if (pos != -1) { + var readmeStart = readme.substring(0, pos + '## Changelog\n'.length); + var readmeEnd = readme.substring(pos + '## Changelog\n'.length); + + if (readme.indexOf(version) == -1) { + var timestamp = new Date(); + var date = timestamp.getFullYear() + '-' + + ('0' + (timestamp.getMonth() + 1).toString(10)).slice(-2) + '-' + + ('0' + (timestamp.getDate()).toString(10)).slice(-2); + + var news = ""; + if (iopackage.common.whatsNew) { + for (var i = 0; i < iopackage.common.whatsNew.length; i++) { + if (typeof iopackage.common.whatsNew[i] == 'string') { + news += '* ' + iopackage.common.whatsNew[i] + '\n'; + } else { + news += '* ' + iopackage.common.whatsNew[i].en + '\n'; + } + } + } + + grunt.file.write('README.md', readmeStart + '### ' + version + ' (' + date + ')\n' + (news ? news + '\n\n' : '\n') + readmeEnd); + } + } + }); + + grunt.loadNpmTasks('grunt-replace'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-jscs'); + grunt.loadNpmTasks('grunt-http'); + + grunt.registerTask('default', [ + 'http', + 'replace:core', + 'updateReadme', + 'jshint', + 'jscs' + ]); + + grunt.registerTask('p', [ + 'replace:core', + 'updateReadme' + ]); + grunt.registerTask('rename', [ + 'replace:name' + ]); +}; \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e388075 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 bluefox + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..037ef26 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +![Logo](admin/vis-canvas-gauges.png) +yunkong2.vis-canvas-gauges +============ +![Logo](img/logo.svg) + +[![NPM version](http://img.shields.io/npm/v/yunkong2.vis-canvas-gauges.svg)](https://www.npmjs.com/package/yunkong2.vis-canvas-gauges) +[![Downloads](https://img.shields.io/npm/dm/yunkong2.vis-canvas-gauges.svg)](https://www.npmjs.com/package/yunkong2.vis-canvas-gauges) + +[![NPM](https://nodei.co/npm/yunkong2.vis-canvas-gauges.png?downloads=true)](https://nodei.co/npm/yunkong2.vis-canvas-gauges/) + +canvas-gauges - Canvas gauges for yunkong2.vis +![Example](img/widgets.png) + +Very detailed canvas library from Mikhus is used in this widget set. Thank you Mikhus. + +You can find description of used library here: [https://canvas-gauges.com](https://canvas-gauges.com) + +And on github [here](https://git.spacen.net/Mikhus/canvas-gauges) + +## Changelog + +### 0.1.5 (2016-11-24) +- (bluefox) do not scan DOM at start + +### 0.1.4 (2016-11-18) +- (bluefox) fix destroy of widgets + +### 0.1.3 (2016-10-06) +- (bluefox) fix highlights if min not zero + +### 0.1.2 (2016-09-30) +- (bluefox) translate english + +### 0.1.0 (2016-09-26) +- (bluefox) initial checkin + +## License + Copyright (c) 2016 bluefox https://git.spacen.net/GermanBluefox + MIT diff --git a/admin/vis-canvas-gauges.png b/admin/vis-canvas-gauges.png new file mode 100644 index 0000000000000000000000000000000000000000..52fb9ce2fa3cbacd5c0353bae1284a3db8c83210 GIT binary patch literal 1950 zcmV;P2VwY$P)N2bZe?^J zG%heMF)`W=I#vJx2OCL5K~#8N?VS5p6Gs%s{hMl`Xi+Gw^#C4U$49Hu!_i`kqO_-q z)Tm$}$U}%BJmevV_d{xrhzGGhsRZRAF9E4m|CZai!Ho&oWbe$*EJ@fO_LpRKcJ61t zGjr$8o!tfi+w6;b?^g-$HTh<%Z0F8;RdZ~9Aj<}~G`Py?sI7aaF{!eBwbDQVD zGxlB@$V~%xxo<@n5-KaB>;+_3`ry#*mvF)}1^F$raJ6R+9KG{U+&vGc>Zkp`A7uaU zt?AQ2L0a^;K_VIuIE{KNnDhKcRxp4~ajV+rpy0Bx;4-vb5df9|Bk;b{wp=H?P@M&81{ z>Q`LPR0i(A?I|vWZD%v)rH&b{#s|a7X?zV?RWF6_$GV!v>63?aa8-}q!Pm?kppIcl zY^*70nKorG8lA*uWOPH!D39k}so-)N=g7cNVcEBQ(hS8Hm2FaSn*#1z7vJDtGdwR1 z8XAn?cnmjNR*K@N-4e^~uac*-VB^!A;;w}VL{s2APd<>lCPFJ{H9wZ=8R-~Yfr1Wx zmqG-Xc8@SPTqaQ+*<`lXbU#pM*vW?1mUdHwCj_qQ(R;Gec9%W}@54pQ4Kt%A%Dvp+ z>N&b6Dvi>Jcr3#WjvB$(#grD0K&Wlz0!N)aQ?4hj(zqvwY_^u8f@^!c6s9(Gc&TqQ z9?Fpvce-Vs46R}yJeuJcT=mbuxD=~=xRwwAN#Lk%N3J(|gy917wNh9t?A$$du8CD@ zH3UcPo+%tN=y4XA%_vv1f`|!lMSaWUE-KRCD}8U`w%bNk993;Ux~&a7io7J*_e2Dj zRYjXc({5T91CwpMnffAv!@W$3;vC)9uM^D}EbCrfaD`n}Lp z?#}^wYN={tHmm*%?X$2mXrjT$cciuiz@2AdZ8Or{EMrwXH@|g#^>nZ%vfC8^cd>KP z1{ajt?|mFS)jt5PxSt*-ZyyWyYgD}XSgtbwu7qQ9DCsv|r~c8y&Mw@Uf$vz}oc9Sm zMKqRS1-DJe9XZSVB0U4owylqoIH(?VPeIGm!~>?;9RiLT8PQ8YZTjb<|LnlNYI6z9 zajCczmMTw~SraXtLF8qHC~i*$J&*U72;Ehr5%G9W2)NqOe@Ti%RpKeVcr;j6o5Lc& z)b5J#>K>XqS0&4c&8Q~~-0xjs zV$a2im;$kj<%Cd`hyI&NczC{4W&I*`OUYJ3!0C!kwxpI$z$vfVJ&wz46NndHRB%^% zX*ndCG7r`Ao%y6R7S-(NSC>bJ8}O8NY%CKM92P!O$9L{j=F!LcPw5z*Q8jtPX1oGJ za0oB6lD?uq_3geXCp{vKeF8(pslYRAUlz}|iYQHYksqz1oQ4_lWP!$_@|rnL97lR~ zgTzl>;4^SpDZ>*WDNZx$6x-CGrhsYV-r?FQQ*YLcDuVC5_$lX4mIuHE4jWR`P2Zc) z;NeF1(K~96TpEF`9)0g0I@WuEx$YVKEN*bx&1p`$pQi!D0Ozl5)@1?UmmRccXR&eG z2r|$A!r<^BCp@g{3VeJ8jlokkH6!w8%ksb1ST4!umx@CRehr5Q3Z<+maM}aDVV~=v zt}-^3!zAs@%9oJWDz3!K?9efOu0t>P#iJ;KBLy4+Y#U#Lqjj_texxIlLO^J z8_N`RvgAMZ{WlC5VYkNgf4tCT(Jt*b4CiAqOb!E89wSMOmMKmIZYV8FptN;K207*qoM6N<$g6s>YtpET3 literal 0 HcmV?d00001 diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 0000000..c2f8401 --- /dev/null +++ b/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/widgets.png b/img/widgets.png new file mode 100644 index 0000000000000000000000000000000000000000..91f2567bc98192cd2f7a26c0b9e06d2ceebeea50 GIT binary patch literal 47672 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" + ], + "localLink": "%web_protocol%://%ip%:%web_port%/vis/edit.html", + "license": "MIT", + "dependencies": [ + "vis" + ], + "onlyWWW": true, + "singleton": true, + "type": "visualization-widgets", + "restartAdapters": [ + "vis" + ], + "noConfig": true + }, + "native": {}, + "instanceObjects": [] +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..92a0d0d --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "yunkong2.vis-canvas-gauges", + "description": "canvas-gauges Widgets for yunkong2.vis", + "version": "0.1.5", + "author": { + "name": "bluefox", + "email": "dogafox@gmail.com" + }, + "contributors": [ + "bluefox " + ], + "homepage": "https://git.spacen.net/yunkong2/yunkong2.vis-canvas-gauges", + "repository": { + "type": "git", + "url": "https://git.spacen.net/yunkong2/yunkong2.vis-canvas-gauges" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://git.spacen.net/yunkong2/yunkong2.vis-canvas-gauges/blob/master/LICENSE" + } + ], + "keywords": [ + "yunkong2", + "GUI", + "DashUI", + "web interface", + "home automation", + "SCADA", + "canvas-gauges GUI" + ], + "devDependencies": { + "grunt": "^1.0.1", + "grunt-replace": "^1.0.1", + "grunt-contrib-jshint": "^1.1.0", + "grunt-jscs": "^3.0.1", + "grunt-http": "^2.2.0", + "mocha": "^4.1.0", + "chai": "^4.1.2" + }, + "bugs": { + "url": "https://git.spacen.net/yunkong2/yunkong2.vis-canvas-gauges/issues" + }, + "main": "widgets/canvas-gauges.html", + "scripts": { + "test": "node node_modules/mocha/bin/mocha --exit" + }, + "license": "MIT" +} \ No newline at end of file diff --git a/tasks/jscs.js b/tasks/jscs.js new file mode 100644 index 0000000..588b6f2 --- /dev/null +++ b/tasks/jscs.js @@ -0,0 +1,17 @@ +var srcDir = __dirname + "/../"; + +module.exports = { + all: { + src: [ + srcDir + "*.js", + srcDir + "lib/*.js", + srcDir + "adapter/example/*.js", + srcDir + "tasks/**/*.js", + srcDir + "www/**/*.js", + '!' + srcDir + "www/lib/**/*.js", + '!' + srcDir + 'node_modules/**/*.js', + '!' + srcDir + 'adapter/*/node_modules/**/*.js' + ], + options: require('./jscsRules.js') + } +}; \ No newline at end of file diff --git a/tasks/jscsRules.js b/tasks/jscsRules.js new file mode 100644 index 0000000..ded301d --- /dev/null +++ b/tasks/jscsRules.js @@ -0,0 +1,36 @@ +module.exports = { + force: true, + "requireCurlyBraces": ["else", "for", "while", "do", "try", "catch"], /*"if",*/ + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], + "requireSpaceBeforeBlockStatements": true, + "requireParenthesesAroundIIFE": true, + "disallowSpacesInFunctionDeclaration": {"beforeOpeningRoundBrace": true}, + "disallowSpacesInNamedFunctionExpression": {"beforeOpeningRoundBrace": true}, + "requireSpacesInFunctionExpression": {"beforeOpeningCurlyBrace": true}, + "requireSpacesInAnonymousFunctionExpression": {"beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true}, + "requireSpacesInNamedFunctionExpression": {"beforeOpeningCurlyBrace": true}, + "requireSpacesInFunctionDeclaration": {"beforeOpeningCurlyBrace": true}, + "disallowMultipleVarDecl": true, + "requireBlocksOnNewline": true, + "disallowEmptyBlocks": true, + "disallowSpacesInsideObjectBrackets": true, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpaceAfterObjectKeys": true, + "disallowSpacesInsideParentheses": true, + "requireCommaBeforeLineBreak": true, + //"requireAlignedObjectValues": "all", + "requireOperatorBeforeLineBreak": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], +// "disallowLeftStickedOperators": ["?", "+", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], +// "requireRightStickedOperators": ["!"], +// "requireSpaceAfterBinaryOperators": ["?", "+", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], + //"disallowSpaceAfterBinaryOperators": [","], + "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], + "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], + "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="], + "requireSpaceAfterBinaryOperators": ["?", ">", ",", ">=", "<=", "<", "+", "-", "/", "*", "=", "==", "===", "!=", "!=="], + //"validateIndentation": 4, + //"validateQuoteMarks": { "mark": "\"", "escape": true }, + "disallowMixedSpacesAndTabs": true, + "disallowKeywordsOnNewLine": ["else", "catch"] + +}; diff --git a/tasks/jshint.js b/tasks/jshint.js new file mode 100644 index 0000000..f823ebc --- /dev/null +++ b/tasks/jshint.js @@ -0,0 +1,17 @@ +var srcDir = __dirname + "/../"; + +module.exports = { + options: { + force: true + }, + all: [ + srcDir + "*.js", + srcDir + "lib/*.js", + srcDir + "adapter/example/*.js", + srcDir + "tasks/**/*.js", + srcDir + "www/**/*.js", + '!' + srcDir + "www/lib/**/*.js", + '!' + srcDir + 'node_modules/**/*.js', + '!' + srcDir + 'adapter/*/node_modules/**/*.js' + ] +}; \ No newline at end of file diff --git a/test/testPackageFiles.js b/test/testPackageFiles.js new file mode 100644 index 0000000..d0759c0 --- /dev/null +++ b/test/testPackageFiles.js @@ -0,0 +1,91 @@ +/* jshint -W097 */ +/* jshint strict:false */ +/* jslint node: true */ +/* jshint expr: true */ +var expect = require('chai').expect; +var fs = require('fs'); + +describe('Test package.json and io-package.json', function() { + it('Test package files', function (done) { + console.log(); + + var fileContentIOPackage = fs.readFileSync(__dirname + '/../io-package.json', 'utf8'); + var ioPackage = JSON.parse(fileContentIOPackage); + + var fileContentNPMPackage = fs.readFileSync(__dirname + '/../package.json', 'utf8'); + var npmPackage = JSON.parse(fileContentNPMPackage); + + expect(ioPackage).to.be.an('object'); + expect(npmPackage).to.be.an('object'); + + expect(ioPackage.common.version, 'ERROR: Version number in io-package.json needs to exist').to.exist; + expect(npmPackage.version, 'ERROR: Version number in package.json needs to exist').to.exist; + + expect(ioPackage.common.version, 'ERROR: Version numbers in package.json and io-package.json needs to match').to.be.equal(npmPackage.version); + + if (!ioPackage.common.news || !ioPackage.common.news[ioPackage.common.version]) { + console.log('WARNING: No news entry for current version exists in io-package.json, no rollback in Admin possible!'); + console.log(); + } + + expect(npmPackage.author, 'ERROR: Author in package.json needs to exist').to.exist; + expect(ioPackage.common.authors, 'ERROR: Authors in io-package.json needs to exist').to.exist; + + if (ioPackage.common.name.indexOf('template') !== 0) { + if (Array.isArray(ioPackage.common.authors)) { + expect(ioPackage.common.authors.length, 'ERROR: Author in io-package.json needs to be set').to.not.be.equal(0); + if (ioPackage.common.authors.length === 1) { + expect(ioPackage.common.authors[0], 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name '); + } + } + else { + expect(ioPackage.common.authors, 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name '); + } + } + else { + console.log('WARNING: Testing for set authors field in io-package skipped because template adapter'); + console.log(); + } + expect(fs.existsSync(__dirname + '/../README.md'), 'ERROR: README.md needs to exist! Please create one with description, detail information and changelog. English is mandatory.').to.be.true; + if (!ioPackage.common.titleLang || typeof ioPackage.common.titleLang !== 'object') { + console.log('WARNING: titleLang is not existing in io-package.json. Please add'); + console.log(); + } + if ( + ioPackage.common.title.indexOf('yunkong2') !== -1 || + ioPackage.common.title.indexOf('yunkong2') !== -1 || + ioPackage.common.title.indexOf('adapter') !== -1 || + ioPackage.common.title.indexOf('Adapter') !== -1 + ) { + console.log('WARNING: title contains Adapter or yunkong2. It is clear anyway, that it is adapter for yunkong2.'); + console.log(); + } + + if (ioPackage.common.name.indexOf('vis-') !== 0) { + if (!ioPackage.common.materialize || !fs.existsSync(__dirname + '/../admin/index_m.html') || !fs.existsSync(__dirname + '/../gulpfile.js')) { + console.log('WARNING: Admin3 support is missing! Please add it'); + console.log(); + } + if (ioPackage.common.materialize) { + expect(fs.existsSync(__dirname + '/../admin/index_m.html'), 'Admin3 support is enabled in io-package.json, but index_m.html is missing!').to.be.true; + } + } + + var licenseFileExists = fs.existsSync(__dirname + '/../LICENSE'); + var fileContentReadme = fs.readFileSync(__dirname + '/../README.md', 'utf8'); + if (fileContentReadme.indexOf('## Changelog') === -1) { + console.log('Warning: The README.md should have a section ## Changelog'); + console.log(); + } + expect((licenseFileExists || fileContentReadme.indexOf('## License') !== -1), 'A LICENSE must exist as LICENSE file or as part of the README.md').to.be.true; + if (!licenseFileExists) { + console.log('Warning: The License should also exist as LICENSE file'); + console.log(); + } + if (fileContentReadme.indexOf('## License') === -1) { + console.log('Warning: The README.md should also have a section ## License to be shown in Admin3'); + console.log(); + } + done(); + }); +}); diff --git a/widgets/canvas-gauges.html b/widgets/canvas-gauges.html new file mode 100644 index 0000000..8773a56 --- /dev/null +++ b/widgets/canvas-gauges.html @@ -0,0 +1,606 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/widgets/canvas-gauges/img/prev/Prev_cgCompas.png b/widgets/canvas-gauges/img/prev/Prev_cgCompas.png new file mode 100644 index 0000000000000000000000000000000000000000..b7f7cdcdb016c2d41aa2e4b11208326de774a44e GIT binary patch literal 6104 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 ef4jCm0{;)Pu!Z9^?4ZQ}00009z*| literal 0 HcmV?d00001 diff --git a/widgets/canvas-gauges/img/prev/Prev_cgFlat.png b/widgets/canvas-gauges/img/prev/Prev_cgFlat.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ebeedd79da26332c43e14188eaa373f15b078c GIT binary patch literal 1602 zcmV-I2EF--P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^9M4LVi;00pv1L_t(|UhSGoNSs#`$6Yia6rr0otG0Ae zl1)?EWMvl;jV`(fHH0eCC=^;0k`Q!|AR)ns_^eGujH6Ruk>I<&-|zP`ijSBXM>H`q z^-1ZbP{h;!xn*3WNyB%;e9_?um;3p7zvDf>`##u{1p?YE&_41b z1iX$wMMXtGetv$Uj$>0(QztSqGNSA1>OymJa_*Fsm3^gSr=+ChQcq7$P;PE+VsCHn zJ4S5`4i28R*=&g&9Ub55`qJ3g_(Nr7WhCZut)QUblF>P2W@eu4>gqbf99mjhzRu3h zPOPb^`TWpMb8~a)!omV=Y-|J@HO}J~7Z*Pr9UVPDPnc}GQ5zEz6Q^oxYxgma%C)sM zT3K27&ZrH*&6u2=BrH7X`qJ6ixrPNhn3V`^c#Ap`jr^IO%dY9Dg)4H2e)}}|LeuEoLkuj=V{$mSXf8^O-KRS zEiNwZckclG__2UCMbQAw(Ibl1OdqdH9Xr>r(|TSWIT$ojiGcPL=o>d^-D(xko_rZP zq2TSwPpze4$pW^#uBBE|=?*0}hlfAld#D}1hYD3_L_~x-g3r&-6Y3p=x&v{!kgvIH$vK#N9<#Z* zsjj!Tx78R_{%B`shf-5h)!rCYI2s=xSNBn_RQHAl2gwD{PXT&(V1OJ?o~XZ}uAyx5 zH6Ov#($c8AyPL+w#t2n7brk2mudk0#%2n4~PDQ1VFn2!hm5U z!`%b)6*%}Y-$U``Bqm@93ky@A*%^k5x~_7F0WvfO%{?y!7ExVqZEYz>=jP@V^puno z1(heuuuV3=QH?*Ze^-W&X=m?8RK6=mT!}q^=(p7r*U=aFcU?KqRmm7jyiRo5k-rlMbQ!k8c`t7 zG@wb2HVK-57SP`HViQG+qD9fN>o6$_1hjzmu5=@c7DbDqB?>g6K%i+rlLL!M&;+!A z_O2J3C|VRPik4l6Nl_r61+;gi8&R|<+Pf6}4;M1&07*qoM6N<$f`gLp A1poj5 literal 0 HcmV?d00001 diff --git a/widgets/canvas-gauges/img/prev/Prev_cgLinear.png b/widgets/canvas-gauges/img/prev/Prev_cgLinear.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc7bf5301436e0ae4e70bf835f564695f4fed2e GIT binary patch literal 3635 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 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @version 2.0.9 + */ +!function(e){"use strict";function t(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t1&&(d=1),t&&t(1===d?d:i(d)),s0){for(a=e.toFixed(r).toString().split("."),n=i-a[0].length;o1?(i=~r.indexOf("."),~r.indexOf("-")?"-"+[t.majorTicksInt+t.majorTicksDec+2+(i?1:0)-r.length].join("0")+r.replace("-",""):[t.majorTicksInt+t.majorTicksDec+1+(i?1:0)-r.length].join("0")+r):r}function f(e){return e*Math.PI/180}function v(e,t){return{x:-e*Math.sin(t),y:e*Math.cos(t)}}function m(e,t,r,i){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],n=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,a=e.createLinearGradient(o?0:n,o?n:0,o?0:i,o?i:0);return a.addColorStop(0,t),a.addColorStop(1,r),a}function b(e,t){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(r)return e.restore(),!0;e.save();var i=t.borderShadowWidth;return i&&(e.shadowBlur=i,e.shadowColor=t.colorBorderShadow),!0}function g(e,t){t.needleShadow&&(e.shadowOffsetX=2,e.shadowOffsetY=2,e.shadowBlur=10,e.shadowColor=t.colorNeedleShadowDown)}function p(e,t,r){return e["font"+t+"Style"]+" "+e["font"+t+"Weight"]+" "+e["font"+t+"Size"]*r+"px "+e["font"+t]}function w(e,t,r,i,o,n){if(t.valueBox){var a=t.valueText||h(r,t);e.shadowOffsetX=null,e.shadowOffsetY=null,e.shadowBlur=null,e.shadowColor="",e.strokeStyle=null,e.lineWidth=0,e.save(),e.font=p(t,"Value",n/200),e.save(),e.beginPath();var l=.12*n,s=parseFloat(t.valueBoxStroke)||0,d=2*n-2*s,u=e.measureText(t.valueText?a:"-"+h(0,t)).width,f=u+.05*n,v=l+.07*n,m=n*t.valueBoxBorderRadius/100,b=(parseFloat(t.valueBoxWidth)||0)/100*d;b>f&&(f=b),f>d&&(f=d);var g=i-f/2,w=o-l-.04*n;m?c(e,g,w,f,v,m):e.rect(g,w,f,v);var y=o-.12*n-.025*n+(.12*n+.045*n)/2;if(t.valueBoxStroke){var x=e.createRadialGradient(i,y,n/10,i,y,n/5);x.addColorStop(0,t.colorValueBoxRect),x.addColorStop(1,t.colorValueBoxRectEnd),e.strokeStyle=x,e.lineWidth=n*t.valueBoxStroke/100,e.stroke()}t.colorValueBoxShadow&&(e.shadowBlur=.012*n,e.shadowColor=t.colorValueBoxShadow),t.colorValueBoxBackground&&(e.fillStyle=t.colorValueBoxBackground,e.fill()),e.closePath(),e.restore(),t.valueTextShadow&&(e.shadowOffsetX=.004*n,e.shadowOffsetY=.004*n,e.shadowBlur=.012*n,e.shadowColor=t.colorValueTextShadow),e.fillStyle=t.colorValueText,e.textAlign="center",e.fillText(a,g+f/2,o),e.restore()}}function y(e,t,r,i,o){r.beginPath(),r.arc(0,0,fe(e),0,2*ge,!0),r.lineWidth=t,r.strokeStyle=o?be.linearGradient(r,i,o,e):i,r.stroke(),r.closePath()}function x(e,t){return e.maxRadius||(e.maxRadius=e.max-t.borderShadowWidth-t.borderOuterWidth-t.borderMiddleWidth-t.borderInnerWidth+(t.borderOuterWidth?.5:0)+(t.borderMiddleWidth?.5:0)+(t.borderInnerWidth?.5:0)),e.maxRadius}function T(e,t){var r=t.borderShadowWidth,i=e.max-r-t.borderOuterWidth/2,o=i-t.borderOuterWidth/2-t.borderMiddleWidth/2+.5,n=o-t.borderMiddleWidth/2-t.borderInnerWidth/2+.5,a=x(e,t),l=void 0,s=!1;e.save(),t.borderOuterWidth&&(s=be.drawShadow(e,t,s),y(i,t.borderOuterWidth,e,t.colorBorderOuter,t.colorBorderOuterEnd)),t.borderMiddleWidth&&(s=be.drawShadow(e,t,s),y(o,t.borderMiddleWidth,e,t.colorBorderMiddle,t.colorBorderMiddleEnd)),t.borderInnerWidth&&(s=be.drawShadow(e,t,s),y(n,t.borderInnerWidth,e,t.colorBorderInner,t.colorBorderInnerEnd)),be.drawShadow(e,t,s),e.beginPath(),e.arc(0,0,fe(a),0,2*ge,!0),t.colorPlateEnd?(l=e.createRadialGradient(0,0,a/2,0,0,a),l.addColorStop(0,t.colorPlate),l.addColorStop(1,t.colorPlateEnd)):l=t.colorPlate,e.fillStyle=l,e.fill(),e.closePath(),e.restore()}function k(e,t){var r=e.max*(parseFloat(t.highlightsWidth)||0)/100;if(r){var i=fe(W(e,t)-r/2),o=0,n=t.highlights.length,a=(t.maxValue-t.minValue)/t.ticksAngle;for(e.save();on?o:n,n>o,o>n?r:i):a,t>0?be.roundRect(e,r,i,o,n,t):e.rect(r,i,o,n),e.fill(),e.closePath()}function E(e,t,r,i,o,n,a,l,s){e.beginPath(),e.lineWidth=t,e.strokeStyle=s?be.linearGradient(e,l,s,a,!0,o):l,r>0?be.roundRect(e,i,o,n,a,r):e.rect(i,o,n,a),e.stroke(),e.closePath()}function R(e,t,r,i,o,n){e.save();var a=t.borderRadius,l=o-t.borderShadowWidth-t.borderOuterWidth,s=l-t.borderOuterWidth-t.borderMiddleWidth,d=s-t.borderMiddleWidth-t.borderInnerWidth,c=d-t.borderInnerWidth,h=n-t.borderShadowWidth-t.borderOuterWidth,u=h-t.borderOuterWidth-t.borderMiddleWidth,f=u-t.borderMiddleWidth-t.borderInnerWidth,v=f-t.borderInnerWidth,m=r-(s-l)/2,b=m-(d-s)/2,g=b-(c-d)/2,p=i-(u-h)/2,w=p-(f-u)/2,y=w-(v-f)/2,x=0,T=!1;return t.borderOuterWidth&&(T=be.drawShadow(e,t,T),E(e,t.borderOuterWidth,a,r+t.borderOuterWidth/2-x,i+t.borderOuterWidth/2-x,l,h,t.colorBorderOuter,t.colorBorderOuterEnd),x+=.5),t.borderMiddleWidth&&(T=be.drawShadow(e,t,T),E(e,t.borderMiddleWidth,a-=1+2*x,m+t.borderMiddleWidth/2-x,p+t.borderMiddleWidth/2-x,s+2*x,u+2*x,t.colorBorderMiddle,t.colorBorderMiddleEnd),x+=.5),t.borderInnerWidth&&(T=be.drawShadow(e,t,T),E(e,t.borderInnerWidth,a-=1+2*x,b+t.borderInnerWidth/2-x,w+t.borderInnerWidth/2-x,d+2*x,f+2*x,t.colorBorderInner,t.colorBorderInnerEnd),x+=.5),be.drawShadow(e,t,T),j(e,a,g,y,c+2*x,v+2*x,t.colorPlate,t.colorPlateEnd),e.restore(),[g,y,c,v]}function I(e,t,r,i,o,n){var a=de.pixelRatio,l=n>=o,s=l?.85*o:n,d=l?n:o;r=l?ue(r+(o-s)/2):r;var c=!!t.title,h=!!t.units,u=!!t.valueBox,f=void 0,v=void 0,m=void 0;l?(v=ue(.05*d),f=ue(.075*d),m=ue(.075*d),c&&(d-=f,i+=f),h&&(d-=v),u&&(d-=m)):(v=f=ue(.15*s),c&&(s-=f,i+=f),h&&(s-=v));var b=2*t.barStrokeWidth,g=t.barBeginCircle?ue(s*t.barBeginCircle/200-b/2):0,p=ue(s*t.barWidth/100-b),w=ue(d*t.barLength/100-b),y=ue((d-w)/2),x=ue(r+(l?s/2:y+g)),T=ue(i+(l?d-y-g+b/2:s/2)),k=!l||t.hasLeft&&t.hasRight?0:(t.hasRight?-1:1)*t.ticksWidth/100*s,S=l||t.hasLeft&&t.hasRight?0:(t.hasRight?-1:1)*t.ticksWidth/100*s;return e.barDimensions={isVertical:l,width:s,length:d,barWidth:p,barLength:w,strokeWidth:b,barMargin:y,radius:g,pixelRatio:a,barOffset:null,titleMargin:c?f:0,unitsMargin:h?v:0,get ticksLength(){return this.barLength-this.barOffset-this.strokeWidth},X:r+k,Y:i+S,x0:x+k,y0:T+S,baseX:r,baseY:i,ticksPadding:t.ticksPadding/100},e.barDimensions}function D(e,t,r,i,o,n,a){var l=I(e,t,i,o,n,a),s=l.isVertical,d=l.width,c=l.barWidth,h=l.barLength,u=l.strokeWidth,f=l.barMargin,v=l.radius,m=l.x0,b=l.y0,g=l.X,p=l.Y,w=h;if(e.save(),e.beginPath(),t.barBeginCircle){var y=be.radians(s?270:0),x=Math.asin(c/2/v),T=Math.cos(x),k=Math.sin(x),S=m+(s?v*k:v*T-u/2),W=s?b-v*T:b+v*k,O=fe(s?W-b:S-m);e.barDimensions.barOffset=ue(O+v);var M=s?ue(m-v*k):S,B=s?W:ue(b-v*k);"progress"===r&&(h=e.barDimensions.barOffset+(h-e.barDimensions.barOffset)*(t.value-t.minValue)/(t.maxValue-t.minValue));var P=ue(S+h-e.barDimensions.barOffset+u/2),A=ue(W-h+e.barDimensions.barOffset-u/2);e.arc(m,b,v,y+x,y-x),s?(e.moveTo(S,B),e.lineTo(S,A),e.lineTo(M,A),e.lineTo(M,B)):(e.moveTo(S,B),e.lineTo(P,B),e.lineTo(P,W),e.lineTo(S,W))}else{var C=ue(s?g+(d-c)/2:g+f),V=ue(s?p+h+f:p+(d-c)/2);"progress"===r&&(h*=(t.value-t.minValue)/(t.maxValue-t.minValue)),s?e.rect(C,V,c,-h):e.rect(C,V,h,c)}"progress"!==r&&t.barStrokeWidth&&(e.lineWidth=u,e.strokeStyle=t.colorBarStroke,e.stroke()),"progress"!==r&&t.colorBar?(e.fillStyle=t.colorBarEnd?be.linearGradient(e,t.colorBar,t.colorBarEnd,h,s,s?p:g):t.colorBar,e.fill()):"progress"===r&&t.colorBarProgress&&(e.fillStyle=t.colorBarProgressEnd?be.linearGradient(e,t.colorBarProgress,t.colorBarProgressEnd,w,s,s?p:g):t.colorBarProgress,e.fill()),e.closePath(),t.barBeginCircle&&(e.barDimensions.radius+=u),e.barDimensions.barWidth+=u,e.barDimensions.barLength+=u}function L(e,t,r,i,o,n){D(e,t,"",r,i,o,n)}function z(e,t){return t.needleSide!==e||t.tickSide!==e||t.numberSide!==e}function _(e,t,r,i,o,n){t.barProgress&&D(e,t,"progress",r,i,o,n)}function G(e,t){var r=e.barDimensions,i=r.isVertical,o=r.width,n=r.length,a=r.barWidth,l=r.barOffset,s=r.barMargin,d=r.X,c=r.Y,h=r.ticksLength,u=r.ticksPadding,f=o*(parseFloat(t.highlightsWidth)||0)/100;if(t.highlights&&f){var v="right"!==t.tickSide,m="left"!==t.tickSide,b=0,g=t.highlights.length,p=(o-a)/2,w=t.maxValue-t.minValue,y=ue(i?d+p:d+s+l),x=f,T=i?c+n-s-l:c+p,k=ue((t.ticksWidth/100+u)*o)+(f-t.ticksWidth/100*o),S=ue(a+u*o);for(e.save();bn&&(d*=-1),e.moveTo(r-h,i),e.lineTo(r+h,i),e.lineTo(r+h,i+d),e.lineTo(r,n),e.lineTo(r-h,i+d),e.lineTo(r-h,i)):(r>o&&(d*=-1),e.moveTo(r,i-h),e.lineTo(r,i+h),e.lineTo(r+d,i+h),e.lineTo(o,i),e.lineTo(r+d,i-h),e.lineTo(r,i-h)),e.fill(),e.closePath()}function te(e,t,r,i,o,n,a){e.barDimensions.isVertical&&be.drawValueBox(e,t,r,i+n/2,o+a-40*(n/300),n)}var re=function(){function e(e,t){var r=[],i=!0,o=!1,n=void 0;try{for(var a,l=e[Symbol.iterator]();!(i=(a=l.next()).done)&&(r.push(a.value),!t||r.length!==t);i=!0);}catch(e){o=!0,n=e}finally{try{!i&&l.return&&l.return()}finally{if(o)throw n}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),ie=function e(t,r,i){null===t&&(t=Function.prototype);var o=Object.getOwnPropertyDescriptor(t,r);if(void 0===o){var n=Object.getPrototypeOf(t);return null===n?void 0:e(n,r,i)}if("value"in o)return o.value;var a=o.get;if(void 0!==a)return a.call(i)},oe=function(){function e(e,t){for(var r=0;r>>0;if(0===o)return-1;var n=+t||0;if(Math.abs(n)===1/0&&(n=0),n>=o)return-1;for(r=Math.max(n>=0?n:o-Math.abs(n),0);r>>0,i=arguments[1],o=i>>0,n=o<0?Math.max(r+o,0):Math.min(o,r),a=arguments[2],l=void 0===a?r:a>>0,s=l<0?Math.max(r+l,0):Math.min(l,r);n=(7-4*t)/11)return-Math.pow((11-6*t-11*e)/4,2)+Math.pow(r,2)},elastic:function(e){return 1-ae.delastic(1-e)},delastic:function(e){var t=1.5;return Math.pow(2,10*(e-1))*Math.cos(20*Math.PI*t/3*e)}},le=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"linear",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:250,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){};if(o(this,t),this.duration=r,this.rule=e,this.draw=i,this.end=n,"function"!=typeof this.draw)throw new TypeError("Invalid animation draw callback:",i);if("function"!=typeof this.end)throw new TypeError("Invalid animation end callback:",n)}return oe(t,[{key:"animate",value:function(t,r){var i=this,o=e.performance&&e.performance.now?e.performance.now():n("animationStartTime")||Date.now();t=t||this.draw,r=r||this.end,this.frame=ne(function(e){return a(e,t,o,ae[i.rule]||i.rule,i.duration,r,i)})}},{key:"destroy",value:function(){if(this.frame){var e=n("cancelAnimationFrame")||function(e){};e(this.frame),this.frame=null}this.draw=null,this.end=null}}]),t}();le.rules=ae;var se=function(){function t(r,i,n){o(this,t),this.options=r,this.element=i.toLowerCase(),this.type=t.toDashed(n),this.Type=e[n],this.mutationsObserved=!1,this.isObservable=!!e.MutationObserver,false&&t.domReady(this.traverse.bind(this))}return oe(t,[{key:"isValidNode",value:function(e){return!(!e.tagName||e.tagName.toLowerCase()!==this.element||e.getAttribute("data-type")!==this.type)}},{key:"traverse",value:function(){for(var t=document.getElementsByTagName(this.element),r=0,i=t.length;r360&&(e.ticksAngle=360),e.ticksAngle<0&&(e.ticksAngle=0),e.startAngle<0&&(e.startAngle=0),e.startAngle>360&&(e.startAngle=360),r(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))}return i(t,e),oe(t,[{key:"draw",value:function(){try{var e=this.canvas,r=[-e.drawX,-e.drawY,e.drawWidth,e.drawHeight],i=r[0],o=r[1],n=r[2],a=r[3],l=this.options; + if("needle"===l.animationTarget){if(!e.elementClone.initialized){var s=e.contextClone;s.clearRect(i,o,n,a),s.save(),T(s,l),k(s,l),S(s,l),O(s,l),P(s,l),A(s,l),C(s,l),e.elementClone.initialized=!0}this.canvas.commit(),e.context.clearRect(i,o,n,a),e.context.save(),e.context.drawImage(e.elementClone,i,o,n,a),e.context.save(),N(e.context,l,l.animatedValue?this.options.value:this.value),V(e.context,l)}else{var d=-be.radians((l.value-l.minValue)/(l.maxValue-l.minValue)*l.ticksAngle);if(e.context.clearRect(i,o,n,a),e.context.save(),T(e.context,l),e.context.rotate(d),k(e.context,l),S(e.context,l),O(e.context,l),P(e.context,l),e.context.rotate(-d),e.context.save(),!e.elementClone.initialized){var c=e.contextClone;c.clearRect(i,o,n,a),c.save(),A(c,l),C(c,l),V(c,l),e.elementClone.initialized=!0}e.context.drawImage(e.elementClone,i,o,n,a)}N(e.context,l,l.animatedValue?this.options.value:this.value),ie(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"draw",this).call(this)}catch(e){be.verifyError(e)}return this}}]),t}(me);"undefined"!=typeof e&&(e.RadialGauge=ye),me.initialize("RadialGauge",we);var xe=Object.assign({},ce,{borderRadius:0,barBeginCircle:30,barWidth:20,barStrokeWidth:0,barProgress:!0,colorBarStroke:"#222",colorBar:"#ccc",colorBarEnd:"",colorBarProgress:"#888",colorBarProgressEnd:"",needleWidth:6,tickSide:"both",needleSide:"both",numberSide:"both",ticksWidth:10,ticksWidthMinor:5,ticksPadding:5,barLength:85,fontTitleSize:26,highlightsWidth:10}),Te=function(e){function n(e){return o(this,n),e=Object.assign({},xe,e||{}),e.barStrokeWidth>=e.barWidth&&(e.barStrokeWidth=ue(e.barWidth/2)),e.hasLeft=z("right",e),e.hasRight=z("left",e),r(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e))}return i(n,e),oe(n,[{key:"draw",value:function(){try{var e=this.canvas,r=[-e.drawX,-e.drawY,e.drawWidth,e.drawHeight],i=r[0],o=r[1],a=r[2],l=r[3],s=this.options;if(!e.elementClone.initialized){var d=e.contextClone;d.clearRect(i,o,a,l),d.save(),this.drawBox=R(d,s,i,o,a,l),L.apply(void 0,[d,s].concat(t(this.drawBox))),e.context.barDimensions=d.barDimensions,G(d,s),q(d,s),F(d,s),H(d,s),J(d,s),Z(d,s),e.elementClone.initialized=!0}this.canvas.commit(),e.context.clearRect(i,o,a,l),e.context.save(),e.context.drawImage(e.elementClone,i,o,a,l),e.context.save(),_.apply(void 0,[e.context,s].concat(t(this.drawBox))),$(e.context,s),te.apply(void 0,[e.context,s,s.animatedValue?this.options.value:this.value].concat(t(this.drawBox))),ie(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"draw",this).call(this)}catch(e){be.verifyError(e)}return this}}]),n}(me);"undefined"!=typeof e&&(e.LinearGauge=Te),me.initialize("LinearGauge",xe),"undefined"!=typeof module&&Object.assign(e,{Collection:l,GenericOptions:ce,Animation:le,BaseGauge:me,drawings:be,SmartCanvas:de,vendorize:n})}("undefined"!=typeof module?module.exports:window); +//# sourceMappingURL=gauge.min.js.map \ No newline at end of file diff --git a/widgets/canvas-gauges/js/gauge.min.js.map b/widgets/canvas-gauges/js/gauge.min.js.map new file mode 100644 index 0000000..756cbd2 --- /dev/null +++ b/widgets/canvas-gauges/js/gauge.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["gauge.min.js"],"names":["ns","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_possibleConstructorReturn","self","call","ReferenceError","_inherits","subClass","superClass","TypeError","prototype","Object","create","constructor","value","enumerable","writable","configurable","setPrototypeOf","__proto__","_classCallCheck","instance","Constructor","vendorize","prop","window","global","vendors","s","capitalized","charAt","toUpperCase","substr","vendorProp","step","time","draw","start","rule","duration","end","anim","progress","percent","frame","requestAnimationFrame","Collection","apply","this","arguments","verifyError","err","DOMException","result","prepareTicks","options","majorTicks","push","drawings","formatMajorTickNumber","minValue","maxValue","tickSide","roundRect","context","x","y","w","h","r","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","padValue","val","dec","valueDec","int","valueInt","strVal","n","parseFloat","Math","abs","toFixed","toString","split","round","num","right","hasDec","majorTicksDec","majorTicksInt","indexOf","join","replace","radians","degrees","PI","radialPoint","radius","angle","sin","cos","linearGradient","colorFrom","colorTo","isVertical","undefined","grad","createLinearGradient","addColorStop","drawShadow","shadowDrawn","restore","save","borderShadowWidth","shadowBlur","shadowColor","colorBorderShadow","drawNeedleShadow","needleShadow","shadowOffsetX","shadowOffsetY","colorNeedleShadowDown","font","target","baseSize","drawValueBox","max","valueBox","text","valueText","strokeStyle","lineWidth","th","bs","valueBoxStroke","bmax","tw","measureText","width","bw","bh","br","valueBoxBorderRadius","obw","valueBoxWidth","bx","by","rect","gy","grd","createRadialGradient","colorValueBoxRect","colorValueBoxRectEnd","stroke","colorValueBoxShadow","colorValueBoxBackground","fillStyle","fill","valueTextShadow","colorValueTextShadow","colorValueText","textAlign","fillText","drawRadialBorder","arc","maxRadialRadius","maxRadius","borderOuterWidth","borderMiddleWidth","borderInnerWidth","drawRadialPlate","d0","r0","r1","r2","r3","colorBorderOuter","colorBorderOuterEnd","colorBorderMiddle","colorBorderMiddleEnd","colorBorderInner","colorBorderInnerEnd","colorPlateEnd","colorPlate","drawRadialHighlights","hlWidth","highlightsWidth","radialTicksRadius","highlights","vd","ticksAngle","hlt","rotate","HPI","startAngle","to","color","drawRadialMinorTicks","SmartCanvas","pixelRatio","colorMinorTicks","minorTicks","closeStrokedPath","drawRadialMajorTicks","colors","colorMajorTicks","radialNextAngle","strokeTicks","drawRadialNumbers","points","isAnimated","animationTarget","colorNumbers","plateValueAngle","point","drawRadialTitle","title","colorTitle","drawRadialUnits","units","colorUnits","drawRadialNeedle","needle","needleCircleSize","rIn","needleEnd","rStart","needleStart","rOut","pad1","needleWidth","pad2","isFixed","colorNeedle","colorNeedleEnd","needleType","colorNeedleShadowUp","needleCircleOuter","colorNeedleCircleOuter","colorNeedleCircleOuterEnd","needleCircleInner","colorNeedleCircleInner","colorNeedleCircleInnerEnd","drawRadialValueBox","drawRectangle","colorStart","colorEnd","drawLinearBorder","drawLinearPlate","borderRadius","w1","w2","w3","w4","h1","h2","h3","h4","x2","x3","x4","y2","y3","y4","aliasingOffset","barDimensions","hasTitle","hasUnits","hasValue","titleMargin","unitsMargin","valueMargin","strokeWidth","barStrokeWidth","barBeginCircle","barWidth","barLength","barMargin","x0","y0","dx","hasLeft","hasRight","ticksWidth","dy","barOffset","ticksLength","X","Y","baseX","baseY","ticksPadding","drawLinearBarShape","type","_barDimensions","fullBarLength","direction","alpha","asin","cosAlpha","sinAlpha","x1","y1","cutRadius","rx","ry","colorBarStroke","colorBar","colorBarEnd","colorBarProgress","colorBarProgressEnd","drawLinearBar","hasTicksBar","notWhich","needleSide","numberSide","drawLinearBarProgress","barProgress","drawLinearBarHighlights","_context$barDimension","tickOffset","interval","eX","eH","eY","hLeft","hRight","entry","eStart","eW","drawLinearTick","drawLinearTicks","ticksSize","deltaLen","lineLength","_context$barDimension2","tickX","tickY","tickLen","tickLeft","tickRight","tickSpace","drawLinearMajorTicks","_drawings$prepareTick","_drawings$prepareTick2","_slicedToArray","_context$barDimension3","rightTicks","leftTicks","sX","sY","drawLinearTickStroke","drawLinearMinorTicks","_drawings$prepareTick3","_drawings$prepareTick4","ticksWidthMinor","drawLinearMajorTicksNumbers","_context$barDimension4","ticks","textHeight","fontNumbersSize","numLeft","numRight","textX","textY","textWidth","numberOffset","tick","drawLinearTitle","_context$barDimension5","fontTitleSize","drawLinearUnits","_context$barDimension6","fontUnitsSize","drawLinearBarNeedle","_context$barDimension7","position","tickWidth","baseLength","needleLength","toLowerCase","drawLinearArrowNeedle","drawLinearLineNeedle","barStart","nLeft","nRight","needleStyle","isRight","peakLength","bodyLength","halfWidth","drawLinearValueBox","sliceIterator","_arr","_n","_d","_e","_s","_i","Symbol","iterator","next","done","_get","get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","_createClass","defineProperties","props","descriptor","defineProperty","key","protoProps","staticProps","assign","firstSource","nextSource","keysArray","keys","nextIndex","len","nextKey","searchElement","fromIndex","k","O","Infinity","relativeStart","min","relativeEnd","final","callback","setTimeout","Date","getTime","rules","linear","p","quad","pow","dequad","quint","dequint","cycle","acos","decycle","bounce","debounce","a","b","elastic","delastic","Animation","_this","performance","now","cancelAnimationFrame","id","DomObserver","element","toDashed","Type","mutationsObserved","isObservable","MutationObserver","domReady","traverse","bind","node","tagName","getAttribute","elements","document","getElementsByTagName","process","observe","body","childList","subtree","attributes","characterData","attributeOldValue","characterDataOldValue","records","record","attributeName","isValidNode","oldValue","addedNodes","ii","ss","_this2","JSON","parse","stringify","hasOwnProperty","toAttributeName","attributeValue","renderTo","observer","forEach","attr","disconnect","destroy","_prop","map","part","_options","update","test","e","camelCase","str","handler","readyState","addEventListener","attachEvent","canvas","height","collection","init","style","elementClone","cloneNode","getContext","contextClone","drawWidth","drawHeight","drawX","drawY","minSide","initialized","translate","index","splice","clearRect","onRedraw","scale","redraw","devicePixelRatio","matchMedia","addListener","GenericOptions","animatedValue","animateOnInit","borders","animation","animationDuration","animationRule","fontNumbers","fontTitle","fontUnits","fontValue","fontValueSize","fontNumbersStyle","fontTitleStyle","fontUnitsStyle","fontValueStyle","fontNumbersWeight","fontTitleWeight","fontUnitsWeight","fontValueWeight","getElementById","version","gauges","BaseGauge","className","name","HTMLCanvasElement","parentNode","offsetWidth","offsetHeight","_value","set","_this3","isNaN","isFinite","fromValue","animate","defaultRadialGaugeOptions","RadialGauge","_BaseGauge","_ref","commit","drawImage","_context","initialize","defaultLinearGaugeOptions","LinearGauge","_BaseGauge2","_ref2","drawBox","concat","module","exports"],"mappings":"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","file":"gauge.min.js","sourcesContent":["/*!\n * The MIT License (MIT)\n * \n * Copyright (c) 2016 Mykhailo Stadnyk \n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * @version 2.0.9\n */\n(function(ns) {'use strict';\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @external {Object.assign} https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n */\n/* istanbul ignore next */\nif (!Object.assign) {\n Object.defineProperty(Object, 'assign', {\n enumerable: false,\n configurable: true,\n writable: true,\n value: function value(target, firstSource) {\n 'use strict';\n\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert first argument to object');\n }\n\n var to = Object(target);\n var i = 1;\n\n for (; i < arguments.length; i++) {\n var nextSource = arguments[i];\n\n if (nextSource === undefined || nextSource === null) {\n continue;\n }\n\n var keysArray = Object.keys(Object(nextSource));\n var nextIndex = 0,\n len = keysArray.length;\n\n for (; nextIndex < len; nextIndex++) {\n var nextKey = keysArray[nextIndex];\n var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n\n if (desc !== undefined && desc.enumerable) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n\n return to;\n }\n });\n}\n\n/**\n * @external {Array.indexOf} https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\n */\n/* istanbul ignore next */\nif (!Array.prototype.indexOf) {\n Array.prototype.indexOf = function (searchElement, fromIndex) {\n var k;\n\n if (this === null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n var O = Object(this);\n var len = O.length >>> 0;\n\n if (len === 0) {\n return -1;\n }\n\n var n = +fromIndex || 0;\n\n if (Math.abs(n) === Infinity) {\n n = 0;\n }\n\n if (n >= len) {\n return -1;\n }\n\n k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n while (k < len) {\n if (k in O && O[k] === searchElement) {\n return k;\n }\n\n k++;\n }\n\n return -1;\n };\n}\n\n/**\n * @external {Array.fill} https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/fill\n */\n/* istanbul ignore next */\nif (!Array.prototype.fill) {\n Array.prototype.fill = function (value) {\n if (this === null) {\n throw new TypeError('this is null or not defined');\n }\n\n var O = Object(this);\n var len = O.length >>> 0;\n var start = arguments[1];\n var relativeStart = start >> 0;\n var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len);\n var end = arguments[2];\n var relativeEnd = end === undefined ? len : end >> 0;\n var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len);\n while (k < final) {\n O[k] = value;\n k++;\n }\n\n return O;\n };\n}\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/**\n * Look-ups for a proper vendor-specific property and returns its value\n *\n * @example\n * var requestAnimationFrame = vendorize('requestAnimationFrame');\n * // it will refer properly to:\n * // - window.requestAnimationFrame by default or to\n * // - window.webkitRequestAnimationFrame or to\n * // - window.mozRequestAnimationFrame or to\n * // - window.msRequestAnimationFrame or to\n * // - window.oRequestAnimationFrame\n * // depending on the current browser vendor\n *\n * @author Mykhailo Stadnyk \n * @param {string} prop\n * @param {HTMLElement|Window|object} [from] - default is window\n * @returns {*}\n */\nfunction vendorize(prop, from) {\n /* istanbul ignore else: no reason to cover */\n if (!from) {\n from = typeof window === 'undefined' ? global : window;\n }\n\n if (typeof from[prop] !== 'undefined') {\n return from[prop];\n }\n\n var vendors = ['webkit', 'moz', 'ms', 'o'];\n var i = 0;\n var s = vendors.length;\n var capitalized = prop.charAt(0).toUpperCase() + prop.substr(1);\n\n for (; i < s; i++) {\n var vendorProp = from[vendors[i] + capitalized];\n\n /* istanbul ignore if: requires very complex environment to test (specific browser version) */\n if (typeof vendorProp !== 'undefined') {\n return vendorProp;\n }\n }\n\n return null;\n}\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/* jshint -W079 */\n\n/**\n * @ignore\n * @typedef {object} ns\n */\n\n/* istanbul ignore next */\n/**\n * @type {function(callback: function(time: number): number, element?: HTMLElement)}\n * @access private\n */\nvar requestAnimationFrame = vendorize('requestAnimationFrame') || function (callback) {\n return setTimeout(function () {\n return callback(new Date().getTime());\n }, 1000 / 60);\n};\n\n/**\n * Generic AnimationRule function interface\n *\n * @typedef {function(percent: number): number} AnimationRule\n */\n\n/**\n * Callback for animation step draw event.\n * It will be called each time animation step is executed, bypassing\n * as first argument a percent of animation completeness. It is expected\n * that this callback will do an actual work of animating an elements or\n * whatever, as far as animation engine is just calculating and executing\n * animation steps without any knowledge about things under animation.\n *\n * @typedef {function(percent: number): *} DrawEventCallback\n */\n\n/**\n * Callback for animation complete event.\n * It is called once each animation is complete.\n *\n * @typedef {function(): *} EndEventCallback\n */\n\n/**\n * Predefined known animation rules.\n * It's a simple collection of math for some most used animations.\n *\n * @typedef {{linear: AnimationRule, quad: AnimationRule, dequad: AnimationRule, quint: AnimationRule, dequint: AnimationRule, cycle: AnimationRule, decycle: AnimationRule, bounce: AnimationRule, debounce: AnimationRule, elastic: AnimationRule, delastic: AnimationRule}} AnimationRules\n */\n\n/* istanbul ignore next: no reason covering this */\nvar rules = {\n linear: function linear(p) {\n return p;\n },\n quad: function quad(p) {\n return Math.pow(p, 2);\n },\n dequad: function dequad(p) {\n return 1 - rules.quad(1 - p);\n },\n quint: function quint(p) {\n return Math.pow(p, 5);\n },\n dequint: function dequint(p) {\n return 1 - Math.pow(1 - p, 5);\n },\n cycle: function cycle(p) {\n return 1 - Math.sin(Math.acos(p));\n },\n decycle: function decycle(p) {\n return Math.sin(Math.acos(1 - p));\n },\n bounce: function bounce(p) {\n return 1 - rules.debounce(1 - p);\n },\n debounce: function debounce(p) {\n var a = 0,\n b = 1;\n for (; 1; a += b, b /= 2) {\n if (p >= (7 - 4 * a) / 11) {\n return -Math.pow((11 - 6 * a - 11 * p) / 4, 2) + Math.pow(b, 2);\n }\n }\n },\n elastic: function elastic(p) {\n return 1 - rules.delastic(1 - p);\n },\n delastic: function delastic(p) {\n var x = 1.5;\n return Math.pow(2, 10 * (p - 1)) * Math.cos(20 * Math.PI * x / 3 * p);\n }\n};\n\n/* istanbul ignore next: private, not testable */\n/**\n * Evaluates animation step and decides if the next step required or\n * stops animation calling a proper events.\n *\n * @access private\n * @param {number} time\n * @param {DrawEventCallback} draw\n * @param {number} start\n * @param {AnimationRule} rule\n * @param {number} duration\n * @param {EndEventCallback} end\n * @param {Animation} anim\n */\nfunction step(time, draw, start, rule, duration, end, anim) {\n if (typeof rule !== 'function') {\n throw new TypeError('Invalid animation rule:', rule);\n }\n\n var progress = time - start;\n var percent = progress / duration;\n\n if (percent > 1) {\n percent = 1;\n }\n\n draw && draw(percent === 1 ? percent : rule(percent));\n\n if (progress < duration) {\n anim.frame = requestAnimationFrame(function (time) {\n return step(time, draw, start, rule, duration, end, anim);\n });\n } else {\n end && end();\n }\n}\n\n/**\n * Animation engine API for JavaScript-based animations.\n * This is simply an animation core framework which simplifies creation\n * of various animations for generic purposes.\n *\n * @example\n * // create 'linear' animation engine, 500ms duration\n * let linear = new Animation('linear', 500);\n *\n * // create 'elastic' animation engine\n * let elastic = new Animation('elastic');\n *\n * // define animation behavior\n * let bounced = new Animation('bounce', 500, percent => {\n * let value = parseInt(percent * 100, 10);\n *\n * $('div.bounced').css({\n * width: value + '%',\n * height: value + '%'\n * });\n * });\n *\n * // execute animation\n * bounced.animate();\n *\n * // execute animation and handle when its finished\n * bounced.animate(null, () => {\n * console.log('Animation finished!');\n * });\n */\n\nvar Animation = function () {\n\n /**\n * @constructor\n * @param {string|AnimationRule} rule\n * @param {number} duration\n * @param {DrawEventCallback} [draw]\n * @param {EndEventCallback} [end]\n */\n function Animation() {\n var rule = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'linear';\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;\n var draw = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};\n var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};\n\n _classCallCheck(this, Animation);\n\n /**\n * Overall animation duration in milliseconds.\n * By default is equal to 250 ms.\n *\n * @type {number}\n */\n this.duration = duration;\n\n /**\n * Animation rule. By default is linear animation.\n * Animation rule is a subject to animation rules, which are\n * a simple object containing math-based methods for calculating\n * animation steps.\n *\n * @type {string|AnimationRule}\n */\n this.rule = rule;\n\n /**\n * Callback function for the animation step draw event.\n *\n * @type {DrawEventCallback}\n */\n this.draw = draw;\n\n /**\n * Callback for the animation complete event.\n *\n * @type {EndEventCallback}\n */\n this.end = end;\n\n if (typeof this.draw !== 'function') {\n throw new TypeError('Invalid animation draw callback:', draw);\n }\n\n if (typeof this.end !== 'function') {\n throw new TypeError('Invalid animation end callback:', end);\n }\n }\n\n /* istanbul ignore next: non-testable */\n /**\n * Performs animation calling each animation step draw callback and\n * end callback at the end of animation. Callbacks are optional to this\n * method call. If them are not bypassed will be used that ones which\n * was pre-set on constructing an Animation object or pre-set after\n * construction.\n *\n * @example\n * function draw(percent) {\n * $('.my-animated-divs').css({\n * width: parseInt(percent * 100, 10) + '%'\n * });\n * }\n * function done() {\n * console.log('Animation complete!');\n * }\n *\n * // Define 'draw' and 'end' callbacks on construction\n * var animation = new Animation('cycle', 500, draw, done);\n * animation.animate();\n *\n * // Define 'draw' and 'end' callbacks after construction\n * var animation = new Animation('cycle', 500);\n * animation.draw = draw;\n * animation.end = done;\n * animation.animate();\n *\n * // Define 'draw' and 'end' callbacks at animation\n * var animation = new Animation('cycle', 500);\n * animation.animate(draw, done);\n *\n * @param {DrawEventCallback} [draw]\n * @param {EndEventCallback} [end]\n */\n\n\n _createClass(Animation, [{\n key: 'animate',\n value: function animate(draw, end) {\n var _this = this;\n\n //noinspection JSUnresolvedVariable\n var start = ns.performance && ns.performance.now ? ns.performance.now() : vendorize('animationStartTime') || Date.now();\n\n draw = draw || this.draw;\n end = end || this.end;\n\n /**\n * Current requested animation frame identifier\n *\n * @type {number}\n */\n this.frame = requestAnimationFrame(function (time) {\n return step(time, draw, start, rules[_this.rule] || _this.rule, _this.duration, end, _this);\n });\n }\n\n /**\n * Destroys this object properly\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n if (this.frame) {\n var cancelAnimationFrame = vendorize('cancelAnimationFrame') ||\n /* istanbul ignore next */\n function (id) {};\n\n cancelAnimationFrame(this.frame);\n this.frame = null;\n }\n\n this.draw = null;\n this.end = null;\n }\n }]);\n\n return Animation;\n}();\n\n/**\n * Animation rules bound statically to Animation constructor.\n *\n * @type {AnimationRules}\n * @static\n */\n\n\nAnimation.rules = rules;\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/**\n * @typedef {{ constructor: function(options: GenericOptions): GaugeInterface, draw: function(): GaugeInterface, destroy: function, update: function(options: GenericOptions) }} GaugeInterface\n */\n/**\n * @typedef {{parse: function, stringify: function}} JSON\n * @external {JSON} https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON\n */\n/**\n * @ignore\n * @typedef {{MutationObserver: function}} ns\n */\n\n/**\n * DOM Observer.\n * It will observe DOM document for a configured element types and\n * instantiate associated Types for an existing or newly added DOM elements\n *\n * @example\n * class ProgressBar {\n * constructor(options) {}\n * draw() {}\n * }\n *\n * // It will observe DOM document for elements
\n * // having attribute 'data-type=\"progress\"'\n * // and instantiate for each new instance of ProgressBar\n *\n * new DomParser({color: 'red'}, 'div', 'progress', ProgressBar);\n *\n * // assume we could have HTML like this\n * //
\n * // in this case all matching attributes names for a given options will be\n * // parsed and bypassed to an instance from HTML attributes\n */\n\nvar DomObserver = function () {\n\n /**\n * @constructor\n * @param {object} options\n * @param {string} element\n * @param {string} type\n */\n function DomObserver(options, element, type) {\n _classCallCheck(this, DomObserver);\n\n //noinspection JSUnresolvedVariable\n /**\n * Default instantiation options for the given type\n *\n * @type {Object}\n */\n this.options = options;\n\n /**\n * Name of an element to lookup/observe\n *\n * @type {string}\n */\n this.element = element.toLowerCase();\n\n /**\n * data-type attribute value to lookup\n *\n * @type {string}\n */\n this.type = DomObserver.toDashed(type);\n\n /**\n * Actual type constructor to instantiate for each found element\n *\n * @type {Function}\n */\n this.Type = ns[type];\n\n /**\n * Signals if mutations observer for this type or not\n *\n * @type {boolean}\n */\n this.mutationsObserved = false;\n\n /**\n * Flag specifies whenever the browser supports observing\n * of DOM tree mutations or not\n *\n * @type {boolean}\n */\n this.isObservable = !!ns.MutationObserver;\n\n /* istanbul ignore next: this should be tested with end-to-end tests */\n DomObserver.domReady(this.traverse.bind(this));\n }\n\n /**\n * Checks if given node is valid node to process\n *\n * @param {Node|HTMLElement} node\n * @returns {boolean}\n */\n\n\n _createClass(DomObserver, [{\n key: 'isValidNode',\n value: function isValidNode(node) {\n //noinspection JSUnresolvedVariable\n return !!(node.tagName && node.tagName.toLowerCase() === this.element && node.getAttribute('data-type') === this.type);\n }\n\n /**\n * Traverse entire current DOM tree and process matching nodes.\n * Usually it should be called only once on document initialization.\n */\n\n }, {\n key: 'traverse',\n value: function traverse() {\n var elements = document.getElementsByTagName(this.element);\n var i = 0,\n s = elements.length;\n\n /* istanbul ignore next: this should be tested with end-to-end tests */\n for (; i < s; i++) {\n this.process(elements[i]);\n }\n\n if (this.isObservable && !this.mutationsObserved) {\n new ns.MutationObserver(this.observe.bind(this)).observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true,\n attributeOldValue: true,\n characterDataOldValue: true\n });\n\n this.mutationsObserved = true;\n }\n }\n\n /**\n * Observes given mutation records for an elements to process\n *\n * @param {MutationRecord[]} records\n */\n\n }, {\n key: 'observe',\n value: function observe(records) {\n var i = 0;\n var s = records.length;\n\n /* istanbul ignore next: this should be tested with end-to-end tests */\n for (; i < s; i++) {\n var record = records[i];\n\n if (record.type === 'attributes' && record.attributeName === 'data-type' && this.isValidNode(record.target) && record.oldValue !== this.type) // skip false-positive mutations\n {\n setTimeout(this.process.bind(this, record.target));\n } else if (record.addedNodes && record.addedNodes.length) {\n var ii = 0;\n var ss = record.addedNodes.length;\n\n for (; ii < ss; ii++) {\n setTimeout(this.process.bind(this, record.addedNodes[ii]));\n }\n }\n }\n }\n\n /**\n * Parses given attribute value to a proper JavaScript value.\n * For example it will parse some stringified value to a proper type\n * value, e.g. 'true' => true, 'null' => null, '{\"prop\": 20}' => {prop: 20}\n *\n * @param {*} value\n * @return {*}\n */\n\n }, {\n key: 'process',\n\n\n /**\n * Processes a given node, instantiating a proper type constructor for it\n *\n * @param {Node|HTMLElement} node\n * @returns {GaugeInterface|null}\n */\n value: function process(node) {\n var _this2 = this;\n\n if (!this.isValidNode(node)) return null;\n\n var prop = void 0;\n var options = JSON.parse(JSON.stringify(this.options));\n var instance = null;\n\n for (prop in options) {\n /* istanbul ignore else: non-testable in most cases */\n if (options.hasOwnProperty(prop)) {\n var attributeName = DomObserver.toAttributeName(prop);\n var attributeValue = DomObserver.parse(node.getAttribute(attributeName));\n\n if (attributeValue !== null && attributeValue !== undefined) {\n options[prop] = attributeValue;\n }\n }\n }\n\n options.renderTo = node;\n instance = new this.Type(options);\n instance.draw && instance.draw();\n\n if (!this.isObservable) return instance;\n\n instance.observer = new ns.MutationObserver(function (records) {\n records.forEach(function (record) {\n if (record.type === 'attributes') {\n var attr = record.attributeName.toLowerCase();\n var type = node.getAttribute(attr).toLowerCase();\n\n if (attr === 'data-type' && type && type !== _this2.type) {\n instance.observer.disconnect();\n delete instance.observer;\n instance.destroy && instance.destroy();\n } else if (attr.substr(0, 5) === 'data-') {\n var _prop = attr.substr(5).split('-').map(function (part, i) {\n return !i ? part : part.charAt(0).toUpperCase() + part.substr(1);\n }).join('');\n var _options = {};\n\n _options[_prop] = DomObserver.parse(node.getAttribute(record.attributeName));\n\n instance.update && instance.update(_options);\n }\n }\n });\n });\n\n //noinspection JSCheckFunctionSignatures\n instance.observer.observe(node, { attributes: true });\n\n return instance;\n }\n\n /**\n * Transforms camelCase string to dashed string\n *\n * @static\n * @param {string} camelCase\n * @return {string}\n */\n\n }], [{\n key: 'parse',\n value: function parse(value) {\n // parse boolean\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n // parse undefined\n if (value === 'undefined') return undefined;\n\n // parse null\n if (value === 'null') return null;\n\n // Comma-separated strings to array parsing.\n // It won't match strings which contains non alphanumeric characters to\n // prevent strings like 'rgba(0,0,0,0)' or JSON-like from being parsed.\n // Typically it simply allows easily declare arrays as comma-separated\n // numbers or plain strings. If something more complicated is\n // required it can be declared using JSON format syntax\n if (/^[-+#.\\w\\d\\s]+(?:,[-+#.\\w\\d\\s]*)+$/.test(value)) {\n return value.split(',');\n }\n\n // parse JSON\n try {\n return JSON.parse(value);\n } catch (e) {}\n\n // plain value - no need to parse\n return value;\n }\n }, {\n key: 'toDashed',\n value: function toDashed(camelCase) {\n var arr = camelCase.split(/(?=[A-Z])/);\n var i = 1;\n var s = arr.length;\n var str = arr[0].toLowerCase();\n\n for (; i < s; i++) {\n str += '-' + arr[i].toLowerCase();\n }\n\n return str;\n }\n\n /**\n * Transforms camel case property name to dash separated attribute name\n *\n * @static\n * @param {string} str\n * @returns {string}\n */\n\n }, {\n key: 'toAttributeName',\n value: function toAttributeName(str) {\n return 'data-' + DomObserver.toDashed(str);\n }\n\n /**\n * Cross-browser DOM ready handler\n *\n * @static\n * @param {Function} handler\n */\n\n }, {\n key: 'domReady',\n value: function domReady(handler) {\n if (/comp|inter|loaded/.test((ns.document || {}).readyState + '')) return handler();\n\n if (ns.addEventListener) ns.addEventListener('DOMContentLoaded', handler, false);else if (ns.attachEvent) ns.attachEvent('onload', handler);\n }\n }]);\n\n return DomObserver;\n}();\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * @ignore\n * @typedef {object} ns\n */\n\n/**\n * Drawings on canvas using hidden canvas as a cache for better\n * performance drawings during canvas animations. SmartCanvas also\n * adopts a canvas to\n */\n\n\nvar SmartCanvas = function () {\n\n /**\n * @constructor\n * @param {HTMLCanvasElement} canvas\n * @param {number} [width]\n * @param {number} [height]\n */\n function SmartCanvas(canvas, width, height) {\n _classCallCheck(this, SmartCanvas);\n\n SmartCanvas.collection.push(this);\n\n /**\n * Canvas base width\n *\n * @type {number}\n */\n this.width = width || 0;\n\n /**\n * Canvas base height\n *\n * @type {number}\n */\n this.height = height || 0;\n\n /**\n * Target drawings canvas element\n *\n * @type {HTMLCanvasElement}\n */\n this.element = canvas;\n\n this.init();\n }\n\n /**\n * Initializes canvases and contexts\n */\n\n\n _createClass(SmartCanvas, [{\n key: 'init',\n value: function init() {\n var pixelRatio = SmartCanvas.pixelRatio;\n\n this.element.width = this.width * pixelRatio;\n this.element.height = this.height * pixelRatio;\n\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n /**\n * Canvas caching element\n *\n * @type {HTMLCanvasElement|Node}\n */\n this.elementClone = this.element.cloneNode(true);\n\n //noinspection JSUnresolvedVariable\n /**\n * Target drawings canvas element 2D context\n *\n * @type {CanvasRenderingContext2D}\n */\n this.context = this.element.getContext('2d');\n\n /**\n * Canvas caching element 2D context\n *\n * @type {CanvasRenderingContext2D}\n */\n this.contextClone = this.elementClone.getContext('2d');\n\n /**\n * Actual drawings width\n *\n * @type {number}\n */\n this.drawWidth = this.element.width;\n\n /**\n * Actual drawings height\n *\n * @type {number}\n */\n this.drawHeight = this.element.height;\n\n /**\n * X-coordinate of drawings zero point\n *\n * @type {number}\n */\n this.drawX = this.drawWidth / 2;\n\n /**\n * Y-coordinate of drawings zero point\n *\n * @type {number}\n */\n this.drawY = this.drawHeight / 2;\n\n /**\n * Minimal side length in pixels of the drawing\n *\n * @type {number}\n */\n this.minSide = this.drawX < this.drawY ? this.drawX : this.drawY;\n\n this.elementClone.initialized = false;\n\n this.contextClone.translate(this.drawX, this.drawY);\n this.contextClone.save();\n\n this.context.translate(this.drawX, this.drawY);\n this.context.save();\n\n this.context.max = this.contextClone.max = this.minSide;\n this.context.maxRadius = this.contextClone.maxRadius = null;\n }\n\n /**\n * Destroys this object, removing the references from memory\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n var index = SmartCanvas.collection.indexOf(this);\n\n /* istanbul ignore else */\n if (~index) {\n SmartCanvas.collection.splice(index, 1);\n }\n\n this.context.clearRect(-this.drawX, -this.drawY, this.drawWidth, this.drawHeight);\n\n // dereference all created elements\n this.context.max = null;\n delete this.context.max;\n\n this.context.maxRadius = null;\n delete this.context.maxRadius;\n\n this.context = null;\n this.contextClone = null;\n this.elementClone = null;\n this.element = null;\n\n /**\n * On canvas redraw event callback\n *\n * @type {function|null|undefined}\n */\n this.onRedraw = null;\n }\n\n /**\n * Commits the drawings\n */\n\n }, {\n key: 'commit',\n value: function commit() {\n var scale = SmartCanvas.pixelRatio;\n\n if (scale !== 1) {\n this.contextClone.scale(scale, scale);\n this.contextClone.save();\n }\n\n return this;\n }\n\n /**\n * Redraw this object\n */\n\n }, {\n key: 'redraw',\n value: function redraw() {\n this.init();\n\n /**\n * On canvas redraw event callback\n *\n * @type {function(): *}\n */\n this.onRedraw && this.onRedraw();\n\n return this;\n }\n\n /**\n * Returns current device pixel ratio\n *\n * @returns {number}\n */\n\n }], [{\n key: 'redraw',\n\n\n /**\n * Forces redraw all canvas in the current collection\n */\n value: function redraw() {\n var i = 0;\n var s = SmartCanvas.collection.length;\n\n for (; i < s; i++) {\n SmartCanvas.collection[i].redraw();\n }\n }\n }, {\n key: 'pixelRatio',\n get: function get() {\n /* istanbul ignore next */\n //noinspection JSUnresolvedVariable\n return ns.devicePixelRatio || 1;\n }\n }]);\n\n return SmartCanvas;\n}();\n\nSmartCanvas.collection = [];\n\n/* istanbul ignore next: very browser-specific testing required to cover */\n//noinspection JSUnresolvedVariable\nif (ns.matchMedia) {\n //noinspection JSUnresolvedFunction\n ns.matchMedia('screen and (min-resolution: 2dppx)').addListener(SmartCanvas.redraw);\n}\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Describes rendering target element. Can be either string identifier of\n * the element or the element itself.\n *\n * @typedef {HTMLElement|string} RenderTarget\n */\n\n/**\n * Highlight area definition.\n * It describes highlight area starting from value to value using\n * color. Color can be describes with hex, rgb or rgba value.\n *\n * @typedef {{ from: number, to: number, color: string}} Highlight\n */\n\n/**\n * Shared generic gauges options\n *\n * @type {{renderTo: RenderTarget, width: number, height: number, minValue: number, maxValue: number, value: number, units: string|boolean, majorTicks: number[]|string[], minorTicks: number, strokeTicks: boolean, animatedValue: boolean, animateOnInit: boolean, title: string|boolean, borders: boolean, valueInt: number, valueDec: number, majorTicksInt: number, majorTicksDec: number, animation: boolean, animationDuration: number, animationRule: string|AnimationRule, colorPlate: string, colorPlateEnd: string, colorMajorTicks: string, colorMinorTicks: string, colorTitle: string, colorUnits: string, colorNumbers: string, colorNeedle: string, colorNeedleEnd: string, colorValueText: string, colorValueTextShadow: string, colorBorderShadow: string, colorBorderOuter: string, colorBorderOuterEnd: string, colorBorderMiddle: string, colorBorderMiddleEnd: string, colorBorderInner: string, colorBorderInnerEnd: string, colorValueBoxRect: string, colorValueBoxRectEnd: string, colorValueBoxBackground: string, colorValueBoxShadow: string, colorNeedleShadowUp: string, colorNeedleShadowDown: string, needle: boolean, needleShadow: boolean, needleType: string, needleStart: number, needleEnd: number, needleWidth: number, borderOuterWidth: number, borderMiddleWidth: number, borderInnerWidth: number, borderShadowWidth: number, valueBox: boolean, valueBoxWidth: number, valueBoxStroke: number, valueText: string, valueTextShadow: boolean, valueBoxBorderRadius: number, highlights: Highlight[], highlightsWidth: number, fontNumbers: string, fontTitle: string, fontUnits: string, fontValue: string, fontTitleSize: number, fontValueSize: number, fontUnitsSize: number, fontNumbersSize: number, fontNumbersStyle: string, fontTitleStyle: string, fontUnitsStyle: string, fontValueStyle: string, fontNumbersWeight: string, fontTitleWeight: string, fontUnitsWeight: string, fontValueWeight: string}} GenericOptions\n */\nvar GenericOptions = {\n // basic options\n renderTo: null,\n width: 0,\n height: 0,\n minValue: 0,\n maxValue: 100,\n value: 0,\n units: false,\n majorTicks: [0, 20, 40, 60, 80, 100],\n minorTicks: 10,\n strokeTicks: true,\n animatedValue: false,\n animateOnInit: false,\n title: false,\n borders: true,\n\n // number formats\n valueInt: 3,\n valueDec: 2,\n majorTicksInt: 1,\n majorTicksDec: 0,\n\n // animations\n animation: true,\n animationDuration: 500,\n animationRule: 'cycle',\n\n // colors\n colorPlate: '#fff',\n colorPlateEnd: '',\n colorMajorTicks: '#444',\n colorMinorTicks: '#666',\n colorTitle: '#888',\n colorUnits: '#888',\n colorNumbers: '#444',\n colorNeedle: 'rgba(240,128,128,1)',\n colorNeedleEnd: 'rgba(255,160,122,.9)',\n colorValueText: '#444',\n colorValueTextShadow: 'rgba(0,0,0,0.3)',\n colorBorderShadow: 'rgba(0,0,0,0.5)',\n colorBorderOuter: '#ddd',\n colorBorderOuterEnd: '#aaa',\n colorBorderMiddle: '#eee',\n colorBorderMiddleEnd: '#f0f0f0',\n colorBorderInner: '#fafafa',\n colorBorderInnerEnd: '#ccc',\n colorValueBoxRect: '#888',\n colorValueBoxRectEnd: '#666',\n colorValueBoxBackground: '#babab2',\n colorValueBoxShadow: 'rgba(0,0,0,1)',\n colorNeedleShadowUp: 'rgba(2,255,255,0.2)',\n colorNeedleShadowDown: 'rgba(188,143,143,0.45)',\n\n fontNumbers: 'Arial',\n fontTitle: 'Arial',\n fontUnits: 'Arial',\n fontValue: 'Arial',\n\n fontNumbersSize: 20,\n fontTitleSize: 24,\n fontUnitsSize: 22,\n fontValueSize: 40,\n\n fontNumbersStyle: 'normal',\n fontTitleStyle: 'normal',\n fontUnitsStyle: 'normal',\n fontValueStyle: 'normal',\n\n fontNumbersWeight: 'normal',\n fontTitleWeight: 'normal',\n fontUnitsWeight: 'normal',\n fontValueWeight: 'normal',\n\n // needle\n needle: true,\n needleShadow: true,\n needleType: 'arrow',\n needleStart: 5,\n needleEnd: 85,\n needleWidth: 4,\n\n // borders\n borderOuterWidth: 3,\n borderMiddleWidth: 3,\n borderInnerWidth: 3,\n borderShadowWidth: 3,\n\n // value and highlights\n valueBox: true,\n valueBoxStroke: 5,\n valueBoxWidth: 0,\n valueText: '',\n valueTextShadow: true,\n valueBoxBorderRadius: 2.5,\n\n // highlights\n highlights: [{ from: 20, to: 60, color: '#eee' }, { from: 60, to: 80, color: '#ccc' }, { from: 80, to: 100, color: '#999' }],\n highlightsWidth: 15\n};\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Gauge collections type.\n *\n * It is used ES5 declaration here, because babel\n * transpiles inheritance incorrectly in this case.\n *\n * @class Collection\n * @constructor\n */\nfunction Collection() {\n Array.prototype.constructor.apply(this, arguments);\n}\n\nCollection.prototype = Object.create(Array.prototype);\nCollection.prototype.constructor = Collection;\n\n/**\n * Returns gauge object by its identifier or index in the collection\n *\n * @param {string|number} id\n * @return {*}\n */\nCollection.prototype.get = function (id) {\n if (typeof id === 'string') {\n var i = 0;\n var s = this.length;\n\n for (; i < s; i++) {\n var canvas = this[i].options.renderTo.tagName ? this[i].options.renderTo :\n /* istanbul ignore next: should be tested with e2e tests */\n document.getElementById(this[i].options.renderTo || '');\n\n if (canvas.getAttribute('id') === id) {\n return this[i];\n }\n }\n } else if (typeof id === 'number') {\n return this[id];\n }\n\n return null;\n};\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar version = '2.0.9';\n\nvar round = Math.round;\nvar abs = Math.abs;\n\nvar gauges = new Collection();\n\ngauges.version = version;\n\n/**\n * Basic abstract BaseGauge class implementing common functionality\n * for different type of gauges.\n *\n * It should not be instantiated directly but must be extended by a final\n * gauge implementation.\n *\n * @abstract\n * @example\n *\n * class MyCoolGauge extends BaseGauge {\n *\n * // theses methods below MUST be implemented:\n *\n * constructor(options) {\n * // ... do something with options\n * super(options);\n * // ... implement anything else\n * }\n *\n * draw() {\n * // ... some implementation here\n * return this;\n * }\n * }\n */\n\nvar BaseGauge = function () {\n\n /**\n * @constructor\n * @abstract\n * @param {GenericOptions} options\n */\n function BaseGauge(options) {\n _classCallCheck(this, BaseGauge);\n\n var className = this.constructor.name;\n\n if (className === 'BaseGauge') {\n throw new TypeError('Attempt to instantiate abstract class!');\n }\n\n gauges.push(this);\n\n //noinspection JSUnresolvedVariable\n /**\n * Gauges version string\n *\n * @type {string}\n */\n this.version = version;\n\n /**\n * Gauge type class\n *\n * @type {BaseGauge} type\n */\n this.type = ns[className];\n\n /**\n * True if gauge has been drawn for the first time, false otherwise.\n *\n * @type {boolean}\n */\n this.initialized = false;\n\n options.minValue = parseFloat(options.minValue);\n options.maxValue = parseFloat(options.maxValue);\n options.value = parseFloat(options.value) || 0;\n\n if (!options.borders) {\n options.borderInnerWidth = options.borderMiddleWidth = options.borderOuterWidth = 0;\n }\n\n if (!options.renderTo) {\n throw TypeError('Canvas element was not specified when creating ' + 'the Gauge object!');\n }\n\n var canvas = options.renderTo.tagName ? options.renderTo :\n /* istanbul ignore next: to be tested with e2e tests */\n document.getElementById(options.renderTo);\n\n if (!(canvas instanceof HTMLCanvasElement)) {\n throw TypeError('Given gauge canvas element is invalid!');\n }\n\n options.width = parseFloat(options.width) || 0;\n options.height = parseFloat(options.height) || 0;\n\n if (!options.width || !options.height) {\n if (!options.width) options.width = canvas.parentNode ? canvas.parentNode.offsetWidth : canvas.offsetWidth;\n if (!options.height) options.height = canvas.parentNode ? canvas.parentNode.offsetHeight : canvas.offsetHeight;\n }\n\n /**\n * Gauge options\n *\n * @type {GenericOptions} options\n */\n this.options = options || {};\n\n if (this.options.animateOnInit) {\n this._value = this.options.value;\n this.options.value = this.options.minValue;\n }\n\n /**\n * @type {SmartCanvas} canvas\n */\n this.canvas = new SmartCanvas(canvas, options.width, options.height);\n this.canvas.onRedraw = this.draw.bind(this);\n\n /**\n * @type {Animation} animation\n */\n this.animation = new Animation(options.animationRule, options.animationDuration);\n }\n\n /**\n * Sets new value for this gauge.\n * If gauge is animated by configuration it will trigger a proper animation.\n * Upsetting a value triggers gauge redraw.\n *\n * @param {number} value\n */\n\n\n _createClass(BaseGauge, [{\n key: 'update',\n\n\n /**\n * Updates gauge configuration options at runtime and redraws the gauge\n *\n * @param {RadialGaugeOptions} options\n * @returns {BaseGauge}\n */\n value: function update(options) {\n Object.assign(this.options, options || {});\n\n this.canvas.width = this.options.width;\n this.canvas.height = this.options.height;\n\n this.animation.rule = this.options.animationRule;\n this.animation.duration = this.options.animationDuration;\n\n this.canvas.redraw();\n\n return this;\n }\n\n /**\n * Performs destruction of this object properly\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n var index = gauges.indexOf(this);\n\n /* istanbul ignore else */\n if (~index) {\n //noinspection JSUnresolvedFunction\n gauges.splice(index, 1);\n }\n\n this.canvas.destroy();\n this.canvas = null;\n\n this.animation.destroy();\n this.animation = null;\n }\n\n /**\n * Returns gauges version string\n *\n * @return {string}\n */\n\n }, {\n key: 'draw',\n\n\n /**\n * Triggering gauge render on a canvas.\n *\n * @abstract\n * @returns {BaseGauge}\n */\n value: function draw() {\n if (this.options.animateOnInit && !this.initialized) {\n this.value = this._value;\n this.initialized = true;\n }\n }\n\n /**\n * Inject given gauge object into DOM\n *\n * @param {string} type\n * @param {GenericOptions} options\n */\n\n }, {\n key: 'value',\n set: function set(value) {\n var _this3 = this;\n\n value = parseFloat(value);\n\n if (isNaN(value) || !isFinite(value)) {\n value = this.options.minValue;\n }\n\n var fromValue = this.options.value;\n\n if (value === this.options.value) return;\n\n if (this.options.animation) {\n /**\n * @type {number}\n * @access private\n */\n this._value = value;\n\n this.animation.animate(function (percent) {\n _this3.options.value = fromValue + (value - fromValue) * percent;\n\n _this3.draw();\n }, function () {\n _this3.options.value = value;\n delete _this3._value;\n _this3.draw();\n });\n } else {\n this.options.value = value;\n this.draw();\n }\n }\n\n /**\n * Returns current value of the gauge\n *\n * @return {number}\n */\n ,\n get: function get() {\n return typeof this._value === 'undefined' ? this.options.value : this._value;\n }\n }], [{\n key: 'initialize',\n value: function initialize(type, options) {\n new DomObserver(options, 'canvas', type);\n }\n }, {\n key: 'version',\n get: function get() {\n return version;\n }\n }]);\n\n return BaseGauge;\n}();\n\n/**\n * @ignore\n * @typedef {object} ns\n */\n/* istanbul ignore if */\n\n\nif (typeof ns !== 'undefined') {\n ns['BaseGauge'] = BaseGauge;\n (ns.document || ns)['gauges'] = gauges;\n}\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * @access private\n * @typedef {CanvasRenderingContext2D|{max: number, maxRadius: number, barDimensions: object}} Canvas2DContext\n */\n\n/* istanbul ignore next: private, not testable */\n/**\n * Examines if a given error is something to throw or to ignore\n *\n * @param {Error} err\n */\nfunction verifyError(err) {\n // there is some unpredictable error in FF in some circumstances\n // which we found simply safe to ignore than to fight with it\n // noinspection JSUnresolvedVariable\n if (err instanceof DOMException && err.result === 0x8053000b) {\n return; // ignore it\n }\n\n throw err;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Prepares major ticks data\n *\n * @access private\n * @param {GenericOptions|{ tickSide: string }} options\n * @return {[boolean, boolean]}\n */\nfunction prepareTicks(options) {\n if (!(options.majorTicks instanceof Array)) {\n options.majorTicks = options.majorTicks ? [options.majorTicks] : [];\n }\n\n if (!options.majorTicks.length) {\n options.majorTicks.push(drawings.formatMajorTickNumber(options.minValue, options));\n options.majorTicks.push(drawings.formatMajorTickNumber(options.maxValue, options));\n }\n\n return [options.tickSide !== 'right', options.tickSide !== 'left'];\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws rounded corners rectangle\n *\n * @param {Canvas2DContext} context\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @param {number} r\n */\nfunction roundRect(context, x, y, w, h, r) {\n context.beginPath();\n\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n\n context.quadraticCurveTo(x, y, x + r, y);\n\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Pads a given value with leading zeros using the given options\n *\n * @param {number} val\n * @param {RadialGaugeOptions|{valueInt: number, valueDec: number}} options\n * @returns {string}\n */\nfunction padValue(val, options) {\n var dec = options.valueDec;\n var int = options.valueInt;\n var i = 0;\n var s = void 0,\n strVal = void 0,\n n = void 0;\n\n val = parseFloat(val);\n n = val < 0;\n val = Math.abs(val);\n\n if (dec > 0) {\n strVal = val.toFixed(dec).toString().split('.');\n s = int - strVal[0].length;\n\n for (; i < s; ++i) {\n strVal[0] = '0' + strVal[0];\n }\n\n strVal = (n ? '-' : '') + strVal[0] + '.' + strVal[1];\n } else {\n strVal = Math.round(val).toString();\n s = int - strVal.length;\n\n for (; i < s; ++i) {\n strVal = '0' + strVal;\n }\n\n strVal = (n ? '-' : '') + strVal;\n }\n\n return strVal;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Formats a number for display on the dial's plate using the majorTicksFormat\n * config option.\n *\n * @param {number} num number to format\n * @param {object} options\n * @returns {string} formatted number\n */\nfunction formatMajorTickNumber(num, options) {\n var right = void 0,\n hasDec = false;\n\n // First, force the correct number of digits right of the decimal.\n if (options.majorTicksDec === 0) {\n right = Math.round(num).toString();\n } else {\n right = num.toFixed(options.majorTicksDec);\n }\n\n // Second, force the correct number of digits left of the decimal.\n if (options.majorTicksInt > 1) {\n // Does this number have a decimal?\n hasDec = ~right.indexOf('.');\n\n // Is this number a negative number?\n if (~right.indexOf('-')) {\n return '-' + [options.majorTicksInt + options.majorTicksDec + 2 + (hasDec ? 1 : 0) - right.length].join('0') + right.replace('-', '');\n } else {\n return [options.majorTicksInt + options.majorTicksDec + 1 + (hasDec ? 1 : 0) - right.length].join('0') + right;\n }\n }\n\n return right;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Transforms degrees to radians\n *\n * @param {number} degrees\n * @returns {number}\n */\nfunction radians(degrees) {\n return degrees * Math.PI / 180;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Calculates and returns radial point coordinates\n *\n * @param {number} radius\n * @param {number} angle\n * @returns {{x: number, y: number}}\n */\nfunction radialPoint(radius, angle) {\n return { x: -radius * Math.sin(angle), y: radius * Math.cos(angle) };\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Creates and returns linear gradient canvas object\n *\n * @param {Canvas2DContext} context\n * @param {string} colorFrom\n * @param {string} colorTo\n * @param {number} length\n * @param {boolean} [isVertical]\n * @param {number} [from]\n * @returns {CanvasGradient}\n */\nfunction linearGradient(context, colorFrom, colorTo, length) {\n var isVertical = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var from = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n var grad = context.createLinearGradient(isVertical ? 0 : from, isVertical ? from : 0, isVertical ? 0 : length, isVertical ? length : 0);\n\n grad.addColorStop(0, colorFrom);\n grad.addColorStop(1, colorTo);\n\n return grad;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws the shadow if it was not drawn\n *\n * @param {Canvas2DContext} context\n * @param {GenericOptions} options\n * @param {boolean} shadowDrawn\n * @return {boolean}\n */\nfunction drawShadow(context, options) {\n var shadowDrawn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (shadowDrawn) {\n context.restore();\n return true;\n }\n\n context.save();\n\n var w = options.borderShadowWidth;\n\n if (w) {\n context.shadowBlur = w;\n context.shadowColor = options.colorBorderShadow;\n }\n\n return true;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge needle shadow\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawNeedleShadow(context, options) {\n if (!options.needleShadow) return;\n\n context.shadowOffsetX = 2;\n context.shadowOffsetY = 2;\n context.shadowBlur = 10;\n context.shadowColor = options.colorNeedleShadowDown;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Constructs font styles for canvas fonts\n *\n * @param {GenericOptions} options\n * @param {string} target\n * @param {number} baseSize\n */\nfunction font(options, target, baseSize) {\n return options['font' + target + 'Style'] + ' ' + options['font' + target + 'Weight'] + ' ' + options['font' + target + 'Size'] * baseSize + 'px ' + options['font' + target];\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws value box at given position\n *\n * @param {Canvas2DContext} context\n * @param {GenericOptions} options\n * @param {number|string} value\n * @param {number} x\n * @param {number} y\n * @param {number} max\n */\nfunction drawValueBox(context, options, value, x, y, max) {\n if (!options.valueBox) return;\n\n var text = options.valueText || padValue(value, options);\n\n context.shadowOffsetX = null;\n context.shadowOffsetY = null;\n context.shadowBlur = null;\n context.shadowColor = '';\n context.strokeStyle = null;\n context.lineWidth = 0;\n context.save();\n\n context.font = font(options, 'Value', max / 200);\n context.save();\n context.beginPath();\n\n var th = 0.12 * max;\n var bs = parseFloat(options.valueBoxStroke) || 0;\n var bmax = max * 2 - bs * 2;\n var tw = context.measureText(options.valueText ? text : '-' + padValue(0, options)).width;\n var bw = tw + 0.05 * max;\n var bh = th + 0.07 * max;\n var br = max * options.valueBoxBorderRadius / 100;\n var obw = (parseFloat(options.valueBoxWidth) || 0) / 100 * bmax;\n\n obw > bw && (bw = obw);\n bw > bmax && (bw = bmax);\n\n var bx = x - bw / 2;\n var by = y - th - 0.04 * max;\n\n if (br) roundRect(context, bx, by, bw, bh, br);else context.rect(bx, by, bw, bh);\n\n var gy = y - 0.12 * max - 0.025 * max + (0.12 * max + 0.045 * max) / 2;\n\n if (options.valueBoxStroke) {\n var grd = context.createRadialGradient(x, gy, max / 10, x, gy, max / 5);\n\n grd.addColorStop(0, options.colorValueBoxRect);\n grd.addColorStop(1, options.colorValueBoxRectEnd);\n\n context.strokeStyle = grd;\n context.lineWidth = max * options.valueBoxStroke / 100;\n context.stroke();\n }\n\n if (options.colorValueBoxShadow) {\n context.shadowBlur = 0.012 * max;\n context.shadowColor = options.colorValueBoxShadow;\n }\n\n if (options.colorValueBoxBackground) {\n context.fillStyle = options.colorValueBoxBackground;\n context.fill();\n }\n\n context.closePath();\n context.restore();\n\n if (options.valueTextShadow) {\n context.shadowOffsetX = 0.004 * max;\n context.shadowOffsetY = 0.004 * max;\n context.shadowBlur = 0.012 * max;\n context.shadowColor = options.colorValueTextShadow;\n }\n\n context.fillStyle = options.colorValueText;\n context.textAlign = 'center';\n context.fillText(text, bx + bw / 2, y);\n context.restore();\n}\n\nvar drawings = {\n roundRect: roundRect,\n padValue: padValue,\n formatMajorTickNumber: formatMajorTickNumber,\n radians: radians,\n radialPoint: radialPoint,\n linearGradient: linearGradient,\n drawNeedleShadow: drawNeedleShadow,\n drawValueBox: drawValueBox,\n verifyError: verifyError,\n prepareTicks: prepareTicks,\n drawShadow: drawShadow,\n font: font\n};\n\ndrawings;\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar PI = Math.PI;\nvar HPI = PI / 2;\n\n/**\n * Gauge configuration options\n *\n * @typedef {GenericOptions|{ticksAngle: number, startAngle: number, colorNeedleCircleOuter: string, colorNeedleCircleOuterEnd: string, colorNeedleCircleInner: string, colorNeedleCircleInnerEnd: string, needleCircleSize: number, needleCircleInner: boolean, needleCircleOuter: boolean, animationTarget: string}} RadialGaugeOptions\n */\n\n/**\n * Default gauge configuration options\n *\n * @access private\n * @type {RadialGaugeOptions}\n */\nvar defaultRadialGaugeOptions = Object.assign({}, GenericOptions, {\n // basic options\n ticksAngle: 270,\n startAngle: 45,\n\n // colors\n colorNeedleCircleOuter: '#f0f0f0',\n colorNeedleCircleOuterEnd: '#ccc',\n colorNeedleCircleInner: '#e8e8e8',\n colorNeedleCircleInnerEnd: '#f5f5f5',\n\n // needle\n needleCircleSize: 10,\n needleCircleInner: true,\n needleCircleOuter: true,\n\n // custom animations\n animationTarget: 'needle' // 'needle' or 'plate'\n});\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gradient-filled circle on a canvas\n *\n * @access private\n * @param {number} radius\n * @param {number} width\n * @param {Canvas2DContext} context\n * @param {string} start gradient start color\n * @param {string} end gradient end color\n */\nfunction drawRadialBorder(radius, width, context, start, end) {\n context.beginPath();\n //noinspection JSUnresolvedFunction\n context.arc(0, 0, abs(radius), 0, PI * 2, true);\n context.lineWidth = width;\n context.strokeStyle = end ? drawings.linearGradient(context, start, end, radius) : start;\n context.stroke();\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Returns max radius without borders for the gauge\n *\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n * @return {number}\n */\nfunction maxRadialRadius(context, options) {\n if (!context.maxRadius) {\n context.maxRadius = context.max - options.borderShadowWidth - options.borderOuterWidth - options.borderMiddleWidth - options.borderInnerWidth + (options.borderOuterWidth ? 0.5 : 0) + (options.borderMiddleWidth ? 0.5 : 0) + (options.borderInnerWidth ? 0.5 : 0);\n }\n\n return context.maxRadius;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge plate on the canvas\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialPlate(context, options) {\n var d0 = options.borderShadowWidth;\n var r0 = context.max - d0 - options.borderOuterWidth / 2;\n var r1 = r0 - options.borderOuterWidth / 2 - options.borderMiddleWidth / 2 + 0.5;\n var r2 = r1 - options.borderMiddleWidth / 2 - options.borderInnerWidth / 2 + 0.5;\n var r3 = maxRadialRadius(context, options);\n var grad = void 0;\n var shadowDrawn = false;\n\n context.save();\n\n if (options.borderOuterWidth) {\n shadowDrawn = drawings.drawShadow(context, options, shadowDrawn);\n drawRadialBorder(r0, options.borderOuterWidth, context, options.colorBorderOuter, options.colorBorderOuterEnd);\n }\n\n if (options.borderMiddleWidth) {\n shadowDrawn = drawings.drawShadow(context, options, shadowDrawn);\n drawRadialBorder(r1, options.borderMiddleWidth, context, options.colorBorderMiddle, options.colorBorderMiddleEnd);\n }\n\n if (options.borderInnerWidth) {\n shadowDrawn = drawings.drawShadow(context, options, shadowDrawn);\n drawRadialBorder(r2, options.borderInnerWidth, context, options.colorBorderInner, options.colorBorderInnerEnd);\n }\n\n drawings.drawShadow(context, options, shadowDrawn);\n\n context.beginPath();\n //noinspection JSUnresolvedFunction\n context.arc(0, 0, abs(r3), 0, PI * 2, true);\n\n if (options.colorPlateEnd) {\n grad = context.createRadialGradient(0, 0, r3 / 2, 0, 0, r3);\n grad.addColorStop(0, options.colorPlate);\n grad.addColorStop(1, options.colorPlateEnd);\n } else {\n grad = options.colorPlate;\n }\n\n context.fillStyle = grad;\n\n context.fill();\n context.closePath();\n\n context.restore();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge highlight areas on a canvas\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialHighlights(context, options) {\n var hlWidth = context.max * (parseFloat(options.highlightsWidth) || 0) / 100;\n\n if (!hlWidth) return;\n\n //noinspection JSUnresolvedFunction\n var r = abs(radialTicksRadius(context, options) - hlWidth / 2);\n var i = 0,\n s = options.highlights.length;\n var vd = (options.maxValue - options.minValue) / options.ticksAngle;\n\n context.save();\n\n for (; i < s; i++) {\n var hlt = options.highlights[i];\n\n context.beginPath();\n\n context.rotate(HPI);\n context.arc(0, 0, r, drawings.radians(options.startAngle + (hlt.from - options.minValue) / vd), drawings.radians(options.startAngle + (hlt.to - options.minValue) / vd), false);\n context.strokeStyle = hlt.color;\n context.lineWidth = hlWidth;\n context.stroke();\n context.closePath();\n\n context.restore();\n context.save();\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws minor ticks bar on a canvas\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialMinorTicks(context, options) {\n var radius = radialTicksRadius(context, options);\n\n context.lineWidth = SmartCanvas.pixelRatio;\n context.strokeStyle = options.colorMinorTicks;\n\n context.save();\n\n var s = options.minorTicks * (options.majorTicks.length - 1);\n var i = 0;\n\n for (; i < s; ++i) {\n var angle = options.startAngle + i * (options.ticksAngle / s);\n\n context.rotate(drawings.radians(angle));\n\n context.beginPath();\n context.moveTo(0, radius);\n context.lineTo(0, radius - context.max * 0.075);\n closeStrokedPath(context);\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Returns ticks radius\n *\n * @access private\n * @param context\n * @param options\n * @return {number}\n */\nfunction radialTicksRadius(context, options) {\n return maxRadialRadius(context, options) - context.max * 0.05;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge major ticks bar on a canvas\n *\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialMajorTicks(context, options) {\n drawings.prepareTicks(options);\n\n //noinspection JSUnresolvedFunction\n var r = abs(radialTicksRadius(context, options));\n var i = void 0,\n colors = void 0;\n var s = options.majorTicks.length;\n var pixelRatio = SmartCanvas.pixelRatio;\n\n context.lineWidth = 2 * pixelRatio;\n context.save();\n\n colors = options.colorMajorTicks instanceof Array ? options.colorMajorTicks : new Array(s).fill(options.colorMajorTicks);\n\n i = 0;\n for (; i < s; ++i) {\n context.strokeStyle = colors[i];\n context.rotate(drawings.radians(radialNextAngle(options, i, s)));\n\n context.beginPath();\n context.moveTo(0, r);\n context.lineTo(0, r - context.max * 0.15);\n closeStrokedPath(context);\n }\n\n if (options.strokeTicks) {\n context.strokeStyle = colors[0];\n context.rotate(HPI);\n\n context.beginPath();\n context.arc(0, 0, r, drawings.radians(options.startAngle), drawings.radians(options.startAngle + options.ticksAngle), false);\n closeStrokedPath(context);\n }\n}\n\n/* istanbul ignore next: private, not testable */\nfunction radialNextAngle(options, i, s) {\n return options.startAngle + i * (options.ticksAngle / (s - 1));\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Strokes, closes path and restores previous context state\n *\n * @param {Canvas2DContext} context\n */\nfunction closeStrokedPath(context) {\n context.stroke();\n context.restore();\n context.closePath();\n context.save();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge bar numbers\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialNumbers(context, options) {\n var radius = maxRadialRadius(context, options) - context.max * 0.35;\n var points = {};\n var i = 0;\n var s = options.majorTicks.length;\n var isAnimated = options.animationTarget !== 'needle';\n var colors = options.colorNumbers instanceof Array ? options.colorNumbers : new Array(s).fill(options.colorNumbers);\n\n var plateValueAngle = isAnimated ? -(options.value - options.minValue) / (options.maxValue - options.minValue) * options.ticksAngle : 0;\n\n if (isAnimated) {\n context.save();\n context.rotate(-drawings.radians(plateValueAngle));\n }\n\n for (; i < s; ++i) {\n var angle = plateValueAngle + radialNextAngle(options, i, s);\n var point = drawings.radialPoint(radius, drawings.radians(angle));\n\n if (angle === 360) angle = 0;\n\n if (points[angle]) {\n continue; //already drawn at this place, skipping\n }\n\n points[angle] = true;\n\n context.font = drawings.font(options, 'Numbers', context.max / 200);\n context.fillStyle = colors[i];\n context.lineWidth = 0;\n context.textAlign = 'center';\n context.fillText(options.majorTicks[i], point.x, point.y + 3);\n }\n\n isAnimated && context.restore();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge title\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialTitle(context, options) {\n if (!options.title) return;\n\n context.save();\n context.font = drawings.font(options, 'Title', context.max / 200);\n context.fillStyle = options.colorTitle;\n context.textAlign = 'center';\n context.fillText(options.title, 0, -context.max / 4.25, context.max * 0.8);\n context.restore();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws units name on the gauge\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialUnits(context, options) {\n if (!options.units) return;\n\n context.save();\n context.font = drawings.font(options, 'Units', context.max / 200);\n context.fillStyle = options.colorUnits;\n context.textAlign = 'center';\n context.fillText(options.units, 0, context.max / 3.25, context.max * 0.8);\n context.restore();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge needle\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n */\nfunction drawRadialNeedle(context, options) {\n if (!options.needle) return;\n\n var value = options.value;\n var max = maxRadialRadius(context, options);\n //noinspection JSUnresolvedFunction\n var r1 = abs(max / 100 * options.needleCircleSize);\n //noinspection JSUnresolvedFunction\n var r2 = abs(max / 100 * options.needleCircleSize * 0.75);\n //noinspection JSUnresolvedFunction\n var rIn = abs(max / 100 * options.needleEnd);\n //noinspection JSUnresolvedFunction\n var rStart = abs(options.needleStart ? max / 100 * options.needleStart : 0);\n //noinspection JSUnresolvedFunction\n var rOut = abs(max * 0.2);\n var pad1 = max / 100 * options.needleWidth;\n var pad2 = max / 100 * options.needleWidth / 2;\n var pixelRatio = SmartCanvas.pixelRatio;\n var isFixed = options.animationTarget !== 'needle';\n\n context.save();\n\n drawings.drawNeedleShadow(context, options);\n\n context.rotate(drawings.radians(isFixed ? options.startAngle : options.startAngle + (value - options.minValue) / (options.maxValue - options.minValue) * options.ticksAngle));\n\n context.fillStyle = drawings.linearGradient(context, options.colorNeedle, options.colorNeedleEnd, rIn - rOut);\n\n if (options.needleType === 'arrow') {\n context.beginPath();\n context.moveTo(-pad2, -rOut);\n context.lineTo(-pad1, 0);\n context.lineTo(-1 * pixelRatio, rIn);\n context.lineTo(pixelRatio, rIn);\n context.lineTo(pad1, 0);\n context.lineTo(pad2, -rOut);\n context.closePath();\n context.fill();\n\n context.beginPath();\n context.lineTo(-0.5 * pixelRatio, rIn);\n context.lineTo(-1 * pixelRatio, rIn);\n context.lineTo(-pad1, 0);\n context.lineTo(-pad2, -rOut);\n context.lineTo(pad2 / 2 * pixelRatio - 2 * pixelRatio, -rOut);\n context.closePath();\n context.fillStyle = options.colorNeedleShadowUp;\n context.fill();\n } else {\n // simple line needle\n context.beginPath();\n context.moveTo(-pad2, rIn);\n context.lineTo(-pad2, rStart);\n context.lineTo(pad2, rStart);\n context.lineTo(pad2, rIn);\n context.closePath();\n context.fill();\n }\n\n if (options.needleCircleSize) {\n context.restore();\n\n drawings.drawNeedleShadow(context, options);\n\n if (options.needleCircleOuter) {\n context.beginPath();\n context.arc(0, 0, r1, 0, PI * 2, true);\n context.fillStyle = drawings.linearGradient(context, options.colorNeedleCircleOuter, options.colorNeedleCircleOuterEnd, r1);\n context.fill();\n context.closePath();\n }\n\n if (options.needleCircleInner) {\n context.beginPath();\n context.arc(0, 0, r2, 0, PI * 2, true);\n context.fillStyle = drawings.linearGradient(context, options.colorNeedleCircleInner, options.colorNeedleCircleInnerEnd, r2);\n context.fill();\n context.closePath();\n }\n\n context.restore();\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge value box\n *\n * @param {Canvas2DContext} context\n * @param {RadialGaugeOptions} options\n * @param {number} value\n */\nfunction drawRadialValueBox(context, options, value) {\n drawings.drawValueBox(context, options, value, 0, context.max - context.max * 0.33, context.max);\n}\n\n/**\n * Minimalistic HTML5 Canvas Gauge\n * @example\n * var gauge = new RadialGauge({\n * renderTo: 'gauge-id', // identifier of HTML canvas element or element itself\n * width: 400,\n * height: 400,\n * units: 'Km/h',\n * title: false,\n * value: 0,\n * minValue: 0,\n * maxValue: 220,\n * majorTicks: [\n * '0','20','40','60','80','100','120','140','160','180','200','220'\n * ],\n * minorTicks: 2,\n * strokeTicks: false,\n * highlights: [\n * { from: 0, to: 50, color: 'rgba(0,255,0,.15)' },\n * { from: 50, to: 100, color: 'rgba(255,255,0,.15)' },\n * { from: 100, to: 150, color: 'rgba(255,30,0,.25)' },\n * { from: 150, to: 200, color: 'rgba(255,0,225,.25)' },\n * { from: 200, to: 220, color: 'rgba(0,0,255,.25)' }\n * ],\n * colorPlate: '#222',\n * colorMajorTicks: '#f5f5f5',\n * colorMinorTicks: '#ddd',\n * colorTitle: '#fff',\n * colorUnits: '#ccc',\n * colorNumbers: '#eee',\n * colorNeedleStart: 'rgba(240, 128, 128, 1)',\n * colorNeedleEnd: 'rgba(255, 160, 122, .9)',\n * valueBox: true,\n * animationRule: 'bounce'\n * });\n * // draw initially\n * gauge.draw();\n * // animate\n * setInterval(() => {\n * gauge.value = Math.random() * -220 + 220;\n * }, 1000);\n */\n\nvar RadialGauge = function (_BaseGauge) {\n _inherits(RadialGauge, _BaseGauge);\n\n /**\n * @constructor\n * @param {RadialGaugeOptions} options\n */\n function RadialGauge(options) {\n _classCallCheck(this, RadialGauge);\n\n options = Object.assign({}, defaultRadialGaugeOptions, options || {});\n\n /* istanbul ignore if */\n if (isNaN(options.startAngle)) options.startAngle = 45;\n /* istanbul ignore if */\n if (isNaN(options.ticksAngle)) options.ticksAngle = 270;\n\n /* istanbul ignore if */\n if (options.ticksAngle > 360) options.ticksAngle = 360;\n /* istanbul ignore if */\n if (options.ticksAngle < 0) options.ticksAngle = 0;\n\n /* istanbul ignore if */\n if (options.startAngle < 0) options.startAngle = 0;\n /* istanbul ignore if */\n if (options.startAngle > 360) options.startAngle = 360;\n\n return _possibleConstructorReturn(this, (RadialGauge.__proto__ || Object.getPrototypeOf(RadialGauge)).call(this, options));\n }\n\n /* */\n /**\n * Triggering gauge render on a canvas.\n *\n * @returns {RadialGauge}\n */\n\n\n _createClass(RadialGauge, [{\n key: 'draw',\n value: function draw() {\n try {\n var canvas = this.canvas;\n var _ref = [-canvas.drawX, -canvas.drawY, canvas.drawWidth, canvas.drawHeight];\n var x = _ref[0];\n var y = _ref[1];\n var w = _ref[2];\n var h = _ref[3];\n\n var options = this.options;\n\n if (options.animationTarget === 'needle') {\n if (!canvas.elementClone.initialized) {\n var context = canvas.contextClone;\n\n // clear the cache\n context.clearRect(x, y, w, h);\n context.save();\n\n drawRadialPlate(context, options);\n drawRadialHighlights(context, options);\n drawRadialMinorTicks(context, options);\n drawRadialMajorTicks(context, options);\n drawRadialNumbers(context, options);\n drawRadialTitle(context, options);\n drawRadialUnits(context, options);\n\n canvas.elementClone.initialized = true;\n }\n\n this.canvas.commit();\n\n // clear the canvas\n canvas.context.clearRect(x, y, w, h);\n canvas.context.save();\n\n canvas.context.drawImage(canvas.elementClone, x, y, w, h);\n canvas.context.save();\n\n drawRadialValueBox(canvas.context, options, options.animatedValue ? this.options.value : this.value);\n drawRadialNeedle(canvas.context, options);\n } else {\n var plateValueAngle = -drawings.radians((options.value - options.minValue) / (options.maxValue - options.minValue) * options.ticksAngle);\n\n // clear the canvas\n canvas.context.clearRect(x, y, w, h);\n canvas.context.save();\n\n drawRadialPlate(canvas.context, options);\n\n canvas.context.rotate(plateValueAngle);\n\n // animated\n drawRadialHighlights(canvas.context, options);\n drawRadialMinorTicks(canvas.context, options);\n drawRadialMajorTicks(canvas.context, options);\n drawRadialNumbers(canvas.context, options);\n\n // non-animated\n canvas.context.rotate(-plateValueAngle);\n canvas.context.save();\n\n if (!canvas.elementClone.initialized) {\n var _context = canvas.contextClone;\n\n // clear the cache\n _context.clearRect(x, y, w, h);\n _context.save();\n\n drawRadialTitle(_context, options);\n drawRadialUnits(_context, options);\n drawRadialNeedle(_context, options);\n\n canvas.elementClone.initialized = true;\n }\n\n canvas.context.drawImage(canvas.elementClone, x, y, w, h);\n }\n\n // value box animations\n drawRadialValueBox(canvas.context, options, options.animatedValue ? this.options.value : this.value);\n\n _get(RadialGauge.prototype.__proto__ || Object.getPrototypeOf(RadialGauge.prototype), 'draw', this).call(this);\n } catch (err) {\n drawings.verifyError(err);\n }\n\n return this;\n }\n }]);\n\n return RadialGauge;\n}(BaseGauge);\n\n/**\n * @ignore\n * @typedef {object} ns\n */\n/* istanbul ignore if */\n\n\nif (typeof ns !== 'undefined') {\n ns['RadialGauge'] = RadialGauge;\n}\n\nBaseGauge.initialize('RadialGauge', defaultRadialGaugeOptions);\n\n/*!\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Mykhailo Stadnyk \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Linear gauge configuration options\n *\n * @typedef {GenericOptions|{borderRadius: number, barBeginCircle: number, barWidth: number, barStrokeWidth: number, barProgress: boolean, colorBar: string, colorBarEnd: string, colorBarStroke: string, colorBarProgress: string, colorBarProgressEnd: string, tickSide: string, needleSide: string, numberSide: string, ticksWidth: number, ticksWidthMinor: number, ticksPadding: number, barLength: number}} LinearGaugeOptions\n */\n\n/**\n * Default linear gauge configuration options\n *\n * @type {LinearGaugeOptions}\n */\nvar defaultLinearGaugeOptions = Object.assign({}, GenericOptions, {\n // basic options\n borderRadius: 0,\n // width: 150,\n // height: 400,\n\n // bar\n barBeginCircle: 30, // percents\n barWidth: 20, // percents\n barStrokeWidth: 0, // pixels\n barProgress: true,\n\n colorBarStroke: '#222',\n colorBar: '#ccc',\n colorBarEnd: '',\n colorBarProgress: '#888',\n colorBarProgressEnd: '',\n\n needleWidth: 6,\n\n tickSide: 'both', // available: 'left', 'right', 'both'\n needleSide: 'both', // available: 'left', 'right', 'both'\n\n numberSide: 'both', // available: 'left', 'right', 'both'\n\n ticksWidth: 10,\n ticksWidthMinor: 5,\n ticksPadding: 5,\n barLength: 85,\n fontTitleSize: 26,\n\n highlightsWidth: 10\n});\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws rectangle on a canvas\n *\n * @param {Canvas2DContext} context\n * @param {number} r radius for founded corner rectangle if 0 or less won't be drawn\n * @param {number} x x-coordinate of the top-left corner\n * @param {number} y y-coordinate of the top-left corner\n * @param {number} w width of the rectangle\n * @param {number} h height of the rectangle\n * @param {string} colorStart base fill color of the rectangle\n * @param {string} [colorEnd] gradient color of the rectangle\n */\nfunction drawRectangle(context, r, x, y, w, h, colorStart, colorEnd) {\n context.beginPath();\n context.fillStyle = colorEnd ? drawings.linearGradient(context, colorStart, colorEnd, w > h ? w : h, h > w, w > h ? x : y) : colorStart;\n\n r > 0 ? drawings.roundRect(context, x, y, w, h, r) : context.rect(x, y, w, h);\n\n context.fill();\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws rectangle on a canvas\n *\n * @param {Canvas2DContext} context\n * @param {number} width width of the border\n * @param {number} r radius for founded corner rectangle if 0 or less won't be drawn\n * @param {number} x x-coordinate of the top-left corner\n * @param {number} y y-coordinate of the top-left corner\n * @param {number} w width of the rectangle\n * @param {number} h height of the rectangle\n * @param {string} colorStart base fill color of the rectangle\n * @param {string} [colorEnd] gradient color of the rectangle\n */\nfunction drawLinearBorder(context, width, r, x, y, w, h, colorStart, colorEnd) {\n context.beginPath();\n context.lineWidth = width;\n context.strokeStyle = colorEnd ? drawings.linearGradient(context, colorStart, colorEnd, h, true, y) : colorStart;\n\n r > 0 ? drawings.roundRect(context, x, y, w, h, r) : context.rect(x, y, w, h);\n\n context.stroke();\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws linear gauge plate\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n */\nfunction drawLinearPlate(context, options, x, y, w, h) {\n context.save();\n\n var r = options.borderRadius;\n var w1 = w - options.borderShadowWidth - options.borderOuterWidth;\n var w2 = w1 - options.borderOuterWidth - options.borderMiddleWidth;\n var w3 = w2 - options.borderMiddleWidth - options.borderInnerWidth;\n var w4 = w3 - options.borderInnerWidth;\n\n var h1 = h - options.borderShadowWidth - options.borderOuterWidth;\n var h2 = h1 - options.borderOuterWidth - options.borderMiddleWidth;\n var h3 = h2 - options.borderMiddleWidth - options.borderInnerWidth;\n var h4 = h3 - options.borderInnerWidth;\n\n var x2 = x - (w2 - w1) / 2;\n var x3 = x2 - (w3 - w2) / 2;\n var x4 = x3 - (w4 - w3) / 2;\n\n var y2 = y - (h2 - h1) / 2;\n var y3 = y2 - (h3 - h2) / 2;\n var y4 = y3 - (h4 - h3) / 2;\n var aliasingOffset = 0;\n var shadowDrawn = false;\n\n if (options.borderOuterWidth) {\n shadowDrawn = drawings.drawShadow(context, options, shadowDrawn);\n drawLinearBorder(context, options.borderOuterWidth, r, x + options.borderOuterWidth / 2 - aliasingOffset, y + options.borderOuterWidth / 2 - aliasingOffset, w1, h1, options.colorBorderOuter, options.colorBorderOuterEnd);\n aliasingOffset += 0.5;\n }\n\n if (options.borderMiddleWidth) {\n shadowDrawn = drawings.drawShadow(context, options, shadowDrawn);\n drawLinearBorder(context, options.borderMiddleWidth, r -= 1 + aliasingOffset * 2, x2 + options.borderMiddleWidth / 2 - aliasingOffset, y2 + options.borderMiddleWidth / 2 - aliasingOffset, w2 + aliasingOffset * 2, h2 + aliasingOffset * 2, options.colorBorderMiddle, options.colorBorderMiddleEnd);\n aliasingOffset += 0.5;\n }\n\n if (options.borderInnerWidth) {\n shadowDrawn = drawings.drawShadow(context, options, shadowDrawn);\n drawLinearBorder(context, options.borderInnerWidth, r -= 1 + aliasingOffset * 2, x3 + options.borderInnerWidth / 2 - aliasingOffset, y3 + options.borderInnerWidth / 2 - aliasingOffset, w3 + aliasingOffset * 2, h3 + aliasingOffset * 2, options.colorBorderInner, options.colorBorderInnerEnd);\n aliasingOffset += 0.5;\n }\n\n drawings.drawShadow(context, options, shadowDrawn);\n\n drawRectangle(context, r, x4, y4, w4 + aliasingOffset * 2, h4 + aliasingOffset * 2, options.colorPlate, options.colorPlateEnd);\n\n context.restore();\n\n return [x4, y4, w4, h4];\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Calculates and returns linear gauge base bar dimensions.\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions|{barStrokeWidth: number, barBeginCircle: number, barWidth: number, hasLeft: boolean, hasRight: boolean}} options\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n * @return {{isVertical: boolean, width: number, length: number, barWidth: number, barLength: number, strokeWidth: number, barMargin: number, radius: number, x0: number, y0: number, barOffset: number, titleMargin: number, unitsMargin: number, X: number, Y: number, baseX: number, baseY: number, ticksPadding: number}}\n */\nfunction barDimensions(context, options, x, y, w, h) {\n var pixelRatio = SmartCanvas.pixelRatio;\n var isVertical = h >= w;\n var width = isVertical ? w * 0.85 : h;\n var length = isVertical ? h : w;\n\n //noinspection JSUnresolvedFunction\n x = isVertical ? round(x + (w - width) / 2) : x;\n\n var hasTitle = !!options.title;\n var hasUnits = !!options.units;\n var hasValue = !!options.valueBox;\n\n var titleMargin = void 0;\n var unitsMargin = void 0;\n var valueMargin = void 0;\n\n if (isVertical) {\n //noinspection JSUnresolvedFunction\n unitsMargin = round(length * 0.05);\n //noinspection JSUnresolvedFunction\n titleMargin = round(length * 0.075);\n //noinspection JSUnresolvedFunction\n valueMargin = round(length * 0.075);\n\n if (hasTitle) {\n length -= titleMargin;\n y += titleMargin;\n }\n\n if (hasUnits) length -= unitsMargin;\n if (hasValue) length -= valueMargin;\n } else {\n //noinspection JSUnresolvedFunction\n unitsMargin = titleMargin = round(width * 0.15);\n\n if (hasTitle) {\n width -= titleMargin;\n y += titleMargin;\n }\n\n if (hasUnits) width -= unitsMargin;\n }\n\n var strokeWidth = options.barStrokeWidth * 2;\n //noinspection JSUnresolvedFunction\n var radius = options.barBeginCircle ? round(width * options.barBeginCircle / 200 - strokeWidth / 2) : 0;\n //noinspection JSUnresolvedFunction\n var barWidth = round(width * options.barWidth / 100 - strokeWidth);\n //noinspection JSUnresolvedFunction\n var barLength = round(length * options.barLength / 100 - strokeWidth);\n //noinspection JSUnresolvedFunction\n var barMargin = round((length - barLength) / 2);\n\n // coordinates for arc of the bar if configured\n //noinspection JSUnresolvedFunction\n var x0 = round(x + (isVertical ? width / 2 : barMargin + radius));\n //noinspection JSUnresolvedFunction\n var y0 = round(y + (isVertical ? length - barMargin - radius + strokeWidth / 2 : width / 2));\n var dx = isVertical && !(options.hasLeft && options.hasRight) ? (options.hasRight ? -1 : 1) * options.ticksWidth / 100 * width : 0;\n var dy = !isVertical && !(options.hasLeft && options.hasRight) ? (options.hasRight ? -1 : 1) * options.ticksWidth / 100 * width : 0;\n\n //noinspection JSUndefinedPropertyAssignment\n context.barDimensions = {\n isVertical: isVertical,\n width: width,\n length: length,\n barWidth: barWidth,\n barLength: barLength,\n strokeWidth: strokeWidth,\n barMargin: barMargin,\n radius: radius,\n pixelRatio: pixelRatio,\n barOffset: null,\n titleMargin: hasTitle ? titleMargin : 0,\n unitsMargin: hasUnits ? unitsMargin : 0,\n get ticksLength() {\n return this.barLength - this.barOffset - this.strokeWidth;\n },\n X: x + dx,\n Y: y + dy,\n x0: x0 + dx,\n y0: y0 + dy,\n baseX: x,\n baseY: y,\n ticksPadding: options.ticksPadding / 100\n };\n\n return context.barDimensions;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws bar shape from the given options on a given canvas context\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {string} type\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n */\nfunction drawLinearBarShape(context, options, type, x, y, w, h) {\n var _barDimensions = barDimensions(context, options, x, y, w, h);\n\n var isVertical = _barDimensions.isVertical;\n var width = _barDimensions.width;\n var barWidth = _barDimensions.barWidth;\n var barLength = _barDimensions.barLength;\n var strokeWidth = _barDimensions.strokeWidth;\n var barMargin = _barDimensions.barMargin;\n var radius = _barDimensions.radius;\n var x0 = _barDimensions.x0;\n var y0 = _barDimensions.y0;\n var X = _barDimensions.X;\n var Y = _barDimensions.Y;\n\n var fullBarLength = barLength;\n\n context.save();\n context.beginPath();\n\n if (options.barBeginCircle) {\n var direction = drawings.radians(isVertical ? 270 : 0);\n var alpha = Math.asin(barWidth / 2 / radius);\n var cosAlpha = Math.cos(alpha);\n var sinAlpha = Math.sin(alpha);\n\n var x1 = x0 + (isVertical ? radius * sinAlpha : radius * cosAlpha - strokeWidth / 2);\n var y1 = isVertical ? y0 - radius * cosAlpha : y0 + radius * sinAlpha;\n //noinspection JSUnresolvedFunction\n var cutRadius = isVertical ? abs(y1 - y0) : abs(x1 - x0);\n\n //noinspection JSUnresolvedFunction\n context.barDimensions.barOffset = round(cutRadius + radius);\n\n // bottom point\n //noinspection JSUnresolvedFunction\n var x2 = isVertical ? round(x0 - radius * sinAlpha) : x1;\n //noinspection JSUnresolvedFunction\n var y2 = isVertical ? y1 : round(y0 - radius * sinAlpha);\n\n if (type === 'progress') {\n barLength = context.barDimensions.barOffset + (barLength - context.barDimensions.barOffset) * (options.value - options.minValue) / (options.maxValue - options.minValue);\n }\n\n // bar ends at\n //noinspection JSUnresolvedFunction\n var x3 = round(x1 + barLength - context.barDimensions.barOffset + strokeWidth / 2); // h\n //noinspection JSUnresolvedFunction\n var y3 = round(y1 - barLength + context.barDimensions.barOffset - strokeWidth / 2); // v\n\n context.arc(x0, y0, radius, direction + alpha, direction - alpha);\n\n if (isVertical) {\n context.moveTo(x1, y2);\n context.lineTo(x1, y3);\n context.lineTo(x2, y3);\n context.lineTo(x2, y2);\n } else {\n context.moveTo(x1, y2);\n context.lineTo(x3, y2);\n context.lineTo(x3, y1);\n context.lineTo(x1, y1);\n }\n } else {\n // simply rectangle\n //noinspection JSUnresolvedFunction\n var rx = round(isVertical ? X + (width - barWidth) / 2 : X + barMargin);\n //noinspection JSUnresolvedFunction\n var ry = round(isVertical ? Y + barLength + barMargin : Y + (width - barWidth) / 2);\n\n if (type === 'progress') {\n barLength *= (options.value - options.minValue) / (options.maxValue - options.minValue);\n }\n\n if (isVertical) context.rect(rx, ry, barWidth, -barLength);else context.rect(rx, ry, barLength, barWidth);\n }\n\n if (type !== 'progress' && options.barStrokeWidth) {\n context.lineWidth = strokeWidth;\n context.strokeStyle = options.colorBarStroke;\n //context.lineJoin = 'round';\n context.stroke();\n }\n\n if (type !== 'progress' && options.colorBar) {\n context.fillStyle = options.colorBarEnd ? drawings.linearGradient(context, options.colorBar, options.colorBarEnd, barLength, isVertical, isVertical ? Y : X) : options.colorBar;\n context.fill();\n } else if (type === 'progress' && options.colorBarProgress) {\n context.fillStyle = options.colorBarProgressEnd ? drawings.linearGradient(context, options.colorBarProgress, options.colorBarProgressEnd, fullBarLength, isVertical, isVertical ? Y : X) : options.colorBarProgress;\n context.fill();\n }\n\n context.closePath();\n\n // fix dimensions for further usage\n if (options.barBeginCircle) context.barDimensions.radius += strokeWidth;\n\n context.barDimensions.barWidth += strokeWidth;\n context.barDimensions.barLength += strokeWidth;\n}\n\n/**\n * Draws gauge bar\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} x x-coordinate of the top-left corner of the gauge\n * @param {number} y y-coordinate of the top-left corner of the gauge\n * @param {number} w width of the gauge\n * @param {number} h height of the gauge\n */\nfunction drawLinearBar(context, options, x, y, w, h) {\n drawLinearBarShape(context, options, '', x, y, w, h);\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Helper function to calculate bar ticks presence on the sides\n *\n * @param {string} notWhich\n * @param {LinearGaugeOptions} options\n * @return {boolean}\n */\nfunction hasTicksBar(notWhich, options) {\n return options.needleSide !== notWhich || options.tickSide !== notWhich || options.numberSide !== notWhich;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge bar progress\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} x x-coordinate of the top-left corner of the gauge\n * @param {number} y y-coordinate of the top-left corner of the gauge\n * @param {number} w width of the gauge\n * @param {number} h height of the gauge\n */\nfunction drawLinearBarProgress(context, options, x, y, w, h) {\n options.barProgress && drawLinearBarShape(context, options, 'progress', x, y, w, h);\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws gauge bar highlighted areas\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearBarHighlights(context, options) {\n var _context$barDimension = context.barDimensions;\n var isVertical = _context$barDimension.isVertical;\n var width = _context$barDimension.width;\n var length = _context$barDimension.length;\n var barWidth = _context$barDimension.barWidth;\n var barOffset = _context$barDimension.barOffset;\n var barMargin = _context$barDimension.barMargin;\n var X = _context$barDimension.X;\n var Y = _context$barDimension.Y;\n var ticksLength = _context$barDimension.ticksLength;\n var ticksPadding = _context$barDimension.ticksPadding;\n\n var hlWidth = width * (parseFloat(options.highlightsWidth) || 0) / 100;\n\n if (!options.highlights || !hlWidth) return;\n\n var hasLeft = options.tickSide !== 'right';\n var hasRight = options.tickSide !== 'left';\n var i = 0;\n var s = options.highlights.length;\n var tickOffset = (width - barWidth) / 2;\n var interval = options.maxValue - options.minValue;\n //noinspection JSUnresolvedFunction\n var eX = round(isVertical ? X + tickOffset : X + barMargin + barOffset);\n var eH = hlWidth;\n var eY = isVertical ? Y + length - barMargin - barOffset : Y + tickOffset;\n //noinspection JSUnresolvedFunction\n var hLeft = round((options.ticksWidth / 100 + ticksPadding) * width) + (hlWidth - options.ticksWidth / 100 * width);\n //noinspection JSUnresolvedFunction\n var hRight = round(barWidth + ticksPadding * width);\n\n context.save();\n\n for (; i < s; i++) {\n var entry = options.highlights[i];\n //noinspection JSUnresolvedFunction\n var eStart = ticksLength * abs(entry.from) / interval;\n //noinspection JSUnresolvedFunction\n var eW = ticksLength * abs((entry.to - entry.from) / interval);\n\n context.beginPath();\n context.fillStyle = entry.color;\n\n if (isVertical) {\n if (hasLeft) context.rect(eX - hLeft, eY - eStart, eH, -eW);\n\n if (hasRight) context.rect(eX + hRight, eY - eStart, eH, -eW);\n } else {\n if (hasLeft) context.rect(eX + eStart, eY - hLeft, eW, eH);\n\n if (hasRight) context.rect(eX + eStart, eY + hRight, eW, eH);\n }\n\n context.fill();\n context.closePath();\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws a tick line on a linear gauge\n *\n * @param {Canvas2DContext} context\n * @param x1\n * @param y1\n * @param x2\n * @param y2\n */\nfunction drawLinearTick(context, x1, y1, x2, y2) {\n context.beginPath();\n\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.stroke();\n\n context.closePath();\n context.save();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws ticks\n *\n * @param {Canvas2DContext} context\n * @param {string} color\n * @param {number} ticksSize\n * @param {number} deltaLen\n * @param {boolean} hasLeft\n * @param {boolean} hasRight\n * @param {number} lineWidth\n * @param {number} lineLength\n */\nfunction drawLinearTicks(context, color, ticksSize, deltaLen, hasLeft, hasRight, lineWidth, lineLength) {\n var _context$barDimension2 = context.barDimensions;\n var isVertical = _context$barDimension2.isVertical;\n var length = _context$barDimension2.length;\n var barWidth = _context$barDimension2.barWidth;\n var barOffset = _context$barDimension2.barOffset;\n var barMargin = _context$barDimension2.barMargin;\n var pixelRatio = _context$barDimension2.pixelRatio;\n var width = _context$barDimension2.width;\n var X = _context$barDimension2.X;\n var Y = _context$barDimension2.Y;\n var ticksLength = _context$barDimension2.ticksLength;\n var ticksPadding = _context$barDimension2.ticksPadding;\n\n var tickOffset = (width - barWidth) / 2;\n var tickX = void 0,\n tickY = void 0;\n var i = 0;\n var tickLen = lineLength * width;\n var tickLeft = tickOffset - ticksPadding * width;\n var tickRight = tickOffset + barWidth + tickLen + ticksPadding * width;\n var tickSpace = ticksLength / (ticksSize - deltaLen);\n var colors = color instanceof Array ? color : new Array(ticksSize).fill(color);\n\n context.lineWidth = lineWidth * pixelRatio;\n context.save();\n\n for (; i < ticksSize; i++) {\n context.strokeStyle = colors[i];\n\n if (isVertical) {\n tickY = Y + length - barMargin - barOffset - i * tickSpace;\n\n if (hasLeft) {\n tickX = X + tickLeft;\n //noinspection JSUnresolvedFunction\n drawLinearTick(context, tickX, tickY, round(tickX - tickLen), tickY);\n }\n\n if (hasRight) {\n tickX = X + tickRight;\n //noinspection JSUnresolvedFunction\n drawLinearTick(context, tickX, tickY, round(tickX - tickLen), tickY);\n }\n } else {\n tickX = X + barMargin + barOffset + i * tickSpace;\n\n if (hasLeft) {\n tickY = Y + tickLeft;\n //noinspection JSUnresolvedFunction\n drawLinearTick(context, tickX, tickY, tickX, round(tickY - tickLen));\n }\n\n if (hasRight) {\n tickY = Y + tickRight;\n //noinspection JSUnresolvedFunction\n drawLinearTick(context, tickX, round(tickY), tickX, tickY - tickLen);\n }\n }\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws major ticks\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearMajorTicks(context, options) {\n var _drawings$prepareTick = drawings.prepareTicks(options);\n\n var _drawings$prepareTick2 = _slicedToArray(_drawings$prepareTick, 2);\n\n var hasLeft = _drawings$prepareTick2[0];\n var hasRight = _drawings$prepareTick2[1];\n\n var lineWidth = 2;\n var colors = options.colorMajorTicks instanceof Array ? options.colorMajorTicks : new Array(options.colorMajorTicks.length).fill(options.colorMajorTicks);\n\n drawLinearTicks(context, options.colorMajorTicks, options.majorTicks.length, 1, hasLeft, hasRight, lineWidth, options.ticksWidth / 100);\n\n if (options.strokeTicks) {\n var _context$barDimension3 = context.barDimensions;\n var isVertical = _context$barDimension3.isVertical;\n var length = _context$barDimension3.length;\n var width = _context$barDimension3.width;\n var barWidth = _context$barDimension3.barWidth;\n var barMargin = _context$barDimension3.barMargin;\n var barOffset = _context$barDimension3.barOffset;\n var X = _context$barDimension3.X;\n var Y = _context$barDimension3.Y;\n var ticksLength = _context$barDimension3.ticksLength;\n var pixelRatio = _context$barDimension3.pixelRatio;\n var ticksPadding = _context$barDimension3.ticksPadding;\n\n var rightTicks = (width - barWidth) / 2 + barWidth + ticksPadding * width;\n var leftTicks = (width - barWidth) / 2 - ticksPadding * width;\n var sX = void 0,\n sY = void 0,\n eX = void 0,\n eY = void 0;\n\n context.strokeStyle = colors[0];\n\n lineWidth *= pixelRatio;\n\n if (isVertical) {\n sY = Y + length - barMargin - barOffset + lineWidth / 2;\n eY = sY - ticksLength - lineWidth;\n\n if (hasLeft) {\n //noinspection JSUnresolvedFunction\n eX = sX = round(X + leftTicks);\n drawLinearTickStroke(context, sX, sY, eX, eY);\n }\n\n if (hasRight) {\n //noinspection JSUnresolvedFunction\n eX = sX = round(X + rightTicks);\n drawLinearTickStroke(context, sX, sY, eX, eY);\n }\n } else {\n sX = X + barMargin + barOffset - lineWidth / 2;\n eX = sX + ticksLength + lineWidth;\n\n if (hasLeft) {\n //noinspection JSUnresolvedFunction\n eY = sY = round(Y + leftTicks);\n drawLinearTickStroke(context, sX, sY, eX, eY);\n }\n\n if (hasRight) {\n //noinspection JSUnresolvedFunction\n eY = sY = round(Y + rightTicks);\n drawLinearTickStroke(context, sX, sY, eX, eY);\n }\n }\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws ticks stroke\n *\n * @param {Canvas2DContext} context\n * @param {number} sX\n * @param {number} sY\n * @param {number} eX\n * @param {number} eY\n */\nfunction drawLinearTickStroke(context, sX, sY, eX, eY) {\n context.beginPath();\n context.moveTo(sX, sY);\n context.lineTo(eX, eY);\n context.stroke();\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws minor ticks\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearMinorTicks(context, options) {\n var _drawings$prepareTick3 = drawings.prepareTicks(options);\n\n var _drawings$prepareTick4 = _slicedToArray(_drawings$prepareTick3, 2);\n\n var hasLeft = _drawings$prepareTick4[0];\n var hasRight = _drawings$prepareTick4[1];\n\n\n drawLinearTicks(context, options.colorMinorTicks, options.minorTicks * (options.majorTicks.length - 1), 0, hasLeft, hasRight, 1, options.ticksWidthMinor / 100);\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws major tick numbers\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearMajorTicksNumbers(context, options) {\n var _context$barDimension4 = context.barDimensions;\n var isVertical = _context$barDimension4.isVertical;\n var length = _context$barDimension4.length;\n var width = _context$barDimension4.width;\n var barWidth = _context$barDimension4.barWidth;\n var barMargin = _context$barDimension4.barMargin;\n var barOffset = _context$barDimension4.barOffset;\n var X = _context$barDimension4.X;\n var Y = _context$barDimension4.Y;\n var ticksLength = _context$barDimension4.ticksLength;\n var ticksPadding = _context$barDimension4.ticksPadding;\n\n var ticks = options.majorTicks.length;\n var hasLeft = options.numberSide !== 'right';\n var hasRight = options.numberSide !== 'left';\n var textHeight = options.fontNumbersSize * width / 200;\n var i = 0;\n var ticksWidth = (options.ticksWidth / 100 + ticksPadding * 2) * width;\n var numLeft = (width - barWidth) / 2 - ticksWidth;\n var numRight = (width - barWidth) / 2 + barWidth + ticksWidth;\n var textX = void 0,\n textY = void 0,\n textWidth = void 0,\n numberOffset = void 0,\n tick = void 0;\n var colors = options.colorNumbers instanceof Array ? options.colorNumbers : new Array(ticks).fill(options.colorNumbers);\n\n context.font = drawings.font(options, 'Numbers', width / 200);\n context.lineWidth = 0;\n context.textAlign = 'center';\n\n for (; i < ticks; i++) {\n context.fillStyle = colors[i];\n tick = options.majorTicks[i];\n numberOffset = i * ticksLength / (ticks - 1);\n\n if (isVertical) {\n textY = Y + length - barMargin - barOffset - numberOffset + textHeight / 3;\n\n if (hasLeft) {\n context.textAlign = 'right';\n context.fillText(tick, X + numLeft, textY);\n }\n\n if (hasRight) {\n context.textAlign = 'left';\n context.fillText(tick, X + numRight, textY);\n }\n } else {\n textWidth = context.measureText(tick).width;\n textX = X + barMargin + barOffset + numberOffset;\n\n if (hasLeft) {\n context.fillText(tick, textX, Y + numLeft);\n }\n\n if (hasRight) {\n context.fillText(tick, textX, Y + numRight + textHeight);\n }\n }\n }\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws linear gauge title\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearTitle(context, options) {\n if (!options.title) return;\n\n var _context$barDimension5 = context.barDimensions;\n var isVertical = _context$barDimension5.isVertical;\n var width = _context$barDimension5.width;\n var length = _context$barDimension5.length;\n var baseX = _context$barDimension5.baseX;\n var baseY = _context$barDimension5.baseY;\n var titleMargin = _context$barDimension5.titleMargin;\n\n var textHeight = options.fontTitleSize * width / 200;\n //noinspection JSUnresolvedFunction\n var textX = round(baseX + (isVertical ? width : length) / 2);\n //noinspection JSUnresolvedFunction\n var textY = round(baseY + titleMargin / 2 - (isVertical ? textHeight : textHeight / 2) - 0.025 * (isVertical ? length : width));\n\n context.save();\n context.textAlign = 'center';\n context.fillStyle = options.colorTitle;\n context.font = drawings.font(options, 'Title', width / 200);\n context.lineWidth = 0;\n context.fillText(options.title, textX, textY, isVertical ? width : length);\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws linear gauge units\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearUnits(context, options) {\n if (!options.units) return;\n\n var _context$barDimension6 = context.barDimensions;\n var isVertical = _context$barDimension6.isVertical;\n var width = _context$barDimension6.width;\n var length = _context$barDimension6.length;\n var baseX = _context$barDimension6.baseX;\n var baseY = _context$barDimension6.baseY;\n var unitsMargin = _context$barDimension6.unitsMargin;\n\n var textHeight = options.fontUnitsSize * width / 200;\n //noinspection JSUnresolvedFunction\n var textX = round(baseX + (isVertical ? width : length) / 2);\n //noinspection JSUnresolvedFunction\n var textY = round(baseY + (isVertical ? length : width) + unitsMargin / 2 - textHeight / 2);\n\n context.save();\n context.textAlign = 'center';\n context.fillStyle = options.colorTitle;\n context.font = drawings.font(options, 'Units', width / 200);\n context.lineWidth = 0;\n context.fillText(options.units, textX, textY, isVertical ? width : length);\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws linear gauge needles\n *\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n */\nfunction drawLinearBarNeedle(context, options) {\n if (!options.needle) return;\n\n var _context$barDimension7 = context.barDimensions;\n var isVertical = _context$barDimension7.isVertical;\n var width = _context$barDimension7.width;\n var length = _context$barDimension7.length;\n var barWidth = _context$barDimension7.barWidth;\n var barOffset = _context$barDimension7.barOffset;\n var barMargin = _context$barDimension7.barMargin;\n var ticksLength = _context$barDimension7.ticksLength;\n var X = _context$barDimension7.X;\n var Y = _context$barDimension7.Y;\n var ticksPadding = _context$barDimension7.ticksPadding;\n\n var hasLeft = options.needleSide !== 'right';\n var hasRight = options.needleSide !== 'left';\n var position = ticksLength * (options.value - options.minValue) / (options.maxValue - options.minValue);\n var tickWidth = (options.ticksWidth / 100 + ticksPadding) * width;\n var baseLength = barWidth / 2 + tickWidth;\n var needleLength = baseLength * (options.needleEnd / 100);\n var sX = void 0,\n eX = void 0,\n sY = void 0,\n eY = void 0;\n var draw = options.needleType.toLowerCase() === 'arrow' ? drawLinearArrowNeedle : drawLinearLineNeedle;\n var barStart = (width - barWidth) / 2;\n var needleStart = baseLength * (options.needleStart / 100);\n var nLeft = barStart - tickWidth - needleStart;\n var nRight = barStart + barWidth + tickWidth + needleStart;\n\n context.save();\n\n drawings.drawNeedleShadow(context, options);\n\n if (isVertical) {\n //noinspection JSUnresolvedFunction\n sY = round(Y + length - barMargin - barOffset - position);\n\n if (hasLeft) {\n //noinspection JSUnresolvedFunction\n sX = round(X + nLeft);\n eX = sX + needleLength;\n draw(context, options, sX, sY, eX, sY, needleLength);\n }\n\n if (hasRight) {\n //noinspection JSUnresolvedFunction\n sX = round(X + nRight);\n eX = sX - needleLength;\n draw(context, options, sX, sY, eX, sY, needleLength, true);\n }\n } else {\n //noinspection JSUnresolvedFunction\n sX = round(X + barMargin + barOffset + position);\n\n if (hasLeft) {\n //noinspection JSUnresolvedFunction\n sY = round(Y + nLeft);\n eY = sY + needleLength;\n draw(context, options, sX, sY, sX, eY, needleLength);\n }\n\n if (hasRight) {\n //noinspection JSUnresolvedFunction\n sY = round(Y + nRight);\n eY = sY - needleLength;\n draw(context, options, sX, sY, sX, eY, needleLength, true);\n }\n }\n\n context.restore();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Returns needle color style\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} length\n * @param {boolean} [isRight]\n * @return {CanvasGradient|string}\n */\nfunction needleStyle(context, options, length, isRight) {\n return options.colorNeedleEnd ? drawings.linearGradient(context, isRight ? options.colorNeedleEnd : options.colorNeedle, isRight ? options.colorNeedle : options.colorNeedleEnd, length, !context.barDimensions.isVertical) : options.colorNeedle;\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws line needle shape\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} sX\n * @param {number} sY\n * @param {number} eX\n * @param {number} eY\n * @param {number} length\n * @param {boolean} [isRight]\n */\nfunction drawLinearLineNeedle(context, options, sX, sY, eX, eY, length, isRight) {\n context.lineWidth = options.needleWidth;\n context.strokeStyle = needleStyle(context, options, length, isRight);\n\n context.beginPath();\n context.moveTo(sX, sY);\n context.lineTo(eX, eY);\n context.stroke();\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws arrow needle shape\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} sX\n * @param {number} sY\n * @param {number} eX\n * @param {number} eY\n * @param {number} length\n * @param {boolean} [isRight]\n */\nfunction drawLinearArrowNeedle(context, options, sX, sY, eX, eY, length, isRight) {\n //noinspection JSUnresolvedFunction\n var peakLength = round(length * 0.4);\n var bodyLength = length - peakLength;\n var isVertical = sX === eX;\n var halfWidth = options.needleWidth / 2;\n\n context.fillStyle = needleStyle(context, options, length, isRight);\n\n context.beginPath();\n\n if (isVertical) {\n if (sY > eY) bodyLength *= -1;\n\n context.moveTo(sX - halfWidth, sY);\n context.lineTo(sX + halfWidth, sY);\n context.lineTo(sX + halfWidth, sY + bodyLength);\n context.lineTo(sX, eY);\n context.lineTo(sX - halfWidth, sY + bodyLength);\n context.lineTo(sX - halfWidth, sY);\n } else {\n if (sX > eX) bodyLength *= -1;\n\n context.moveTo(sX, sY - halfWidth);\n context.lineTo(sX, sY + halfWidth);\n context.lineTo(sX + bodyLength, sY + halfWidth);\n context.lineTo(eX, sY);\n context.lineTo(sX + bodyLength, sY - halfWidth);\n context.lineTo(sX, sY - halfWidth);\n }\n\n context.fill();\n context.closePath();\n}\n\n/* istanbul ignore next: private, not testable */\n/**\n * Draws value box for linear gauge\n *\n * @access private\n * @param {Canvas2DContext} context\n * @param {LinearGaugeOptions} options\n * @param {number} value\n * @param {number} x\n * @param {number} y\n * @param {number} w\n * @param {number} h\n */\nfunction drawLinearValueBox(context, options, value, x, y, w, h) {\n // currently value box is available only for vertical linear gauge,\n // as far as by design it is hard to find a proper place for\n // horizontal ones\n context.barDimensions.isVertical && drawings.drawValueBox(context, options, value, x + w / 2, y + h - 40 * (w / 300), w);\n}\n\n/**\n * Minimalistic HTML5 Canvas Linear Gauge\n */\n\nvar LinearGauge = function (_BaseGauge2) {\n _inherits(LinearGauge, _BaseGauge2);\n\n /**\n * @constructor\n * @param {LinearGaugeOptions} options\n */\n function LinearGauge(options) {\n _classCallCheck(this, LinearGauge);\n\n options = Object.assign({}, defaultLinearGaugeOptions, options || {});\n\n /* istanbul ignore else */\n if (options.barStrokeWidth >= options.barWidth) {\n //noinspection JSUnresolvedFunction\n options.barStrokeWidth = round(options.barWidth / 2);\n }\n\n //noinspection JSUndefinedPropertyAssignment\n options.hasLeft = hasTicksBar('right', options);\n //noinspection JSUndefinedPropertyAssignment\n options.hasRight = hasTicksBar('left', options);\n\n return _possibleConstructorReturn(this, (LinearGauge.__proto__ || Object.getPrototypeOf(LinearGauge)).call(this, options));\n }\n\n /* istanbul ignore next */\n /**\n * Triggering linear gauge render on a canvas.\n *\n * @returns {LinearGauge}\n */\n\n\n _createClass(LinearGauge, [{\n key: 'draw',\n value: function draw() {\n try {\n var canvas = this.canvas;\n var _ref2 = [-canvas.drawX, -canvas.drawY, canvas.drawWidth, canvas.drawHeight];\n var x = _ref2[0];\n var y = _ref2[1];\n var w = _ref2[2];\n var h = _ref2[3];\n\n var options = this.options;\n\n if (!canvas.elementClone.initialized) {\n var context = canvas.contextClone;\n\n // clear the cache\n context.clearRect(x, y, w, h);\n context.save();\n\n this.drawBox = drawLinearPlate(context, options, x, y, w, h);\n\n drawLinearBar.apply(undefined, [context, options].concat(_toConsumableArray(this.drawBox)));\n\n canvas.context.barDimensions = context.barDimensions;\n\n drawLinearBarHighlights(context, options);\n drawLinearMinorTicks(context, options);\n drawLinearMajorTicks(context, options);\n drawLinearMajorTicksNumbers(context, options);\n drawLinearTitle(context, options);\n drawLinearUnits(context, options);\n\n canvas.elementClone.initialized = true;\n }\n\n this.canvas.commit();\n\n // clear the canvas\n canvas.context.clearRect(x, y, w, h);\n canvas.context.save();\n\n canvas.context.drawImage(canvas.elementClone, x, y, w, h);\n canvas.context.save();\n\n drawLinearBarProgress.apply(undefined, [canvas.context, options].concat(_toConsumableArray(this.drawBox)));\n drawLinearBarNeedle(canvas.context, options);\n drawLinearValueBox.apply(undefined, [canvas.context, options, options.animatedValue ? this.options.value : this.value].concat(_toConsumableArray(this.drawBox)));\n\n _get(LinearGauge.prototype.__proto__ || Object.getPrototypeOf(LinearGauge.prototype), 'draw', this).call(this);\n } catch (err) {\n drawings.verifyError(err);\n }\n\n return this;\n }\n }]);\n\n return LinearGauge;\n}(BaseGauge);\n\n/**\n * @ignore\n * @typedef {object} ns\n */\n/* istanbul ignore if */\n\n\nif (typeof ns !== 'undefined') {\n ns['LinearGauge'] = LinearGauge;\n}\n\nBaseGauge.initialize('LinearGauge', defaultLinearGaugeOptions);;typeof module !== \"undefined\" && Object.assign(ns, {Collection: Collection,GenericOptions: GenericOptions,Animation: Animation,BaseGauge: BaseGauge,drawings: drawings,SmartCanvas: SmartCanvas,vendorize: vendorize});}(typeof module !== \"undefined\" ? module.exports : window));"],"sourceRoot":"/source/"} \ No newline at end of file