├── index.js ├── .jshintrc ├── .gitignore ├── .travis.yml ├── .editorconfig ├── bower.json ├── gulpfile.js ├── LICENSE ├── package.json ├── karma.conf.js ├── index.html ├── src ├── js │ └── ng-cooltip.js └── styles │ └── scss │ └── ng-cooltip.scss ├── README.md ├── css └── demo.css ├── test ├── ng-cooltip-box.spec.js └── ng-cooltip-classic.spec.js ├── app.js └── dist ├── ng-cooltip.min.js └── ng-cooltip.min.css /index.js: -------------------------------------------------------------------------------- 1 | require('./src/js/ng-cooltip'); 2 | module.exports = 'ng-cooltip'; 3 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "es5": true, 3 | "strict": true, 4 | "indent": 2, 5 | "quotmark": "single", 6 | "expr": true 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | .env 4 | .vscode 5 | *.log 6 | *.sublime-workspace 7 | *.sublime-project 8 | jsconfig.json 9 | typings/* -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4.3.0" 4 | before_install: 5 | - "export DISPLAY=:99.0" 6 | - "sh -e /etc/init.d/xvfb start" 7 | before_script: 8 | - npm install 9 | script: karma start --single-run 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # Change these settings to your own preference 10 | indent_style = space 11 | indent_size = 2 12 | 13 | # We recommend you to keep these unchanged 14 | end_of_line = lf 15 | charset = utf-8 16 | trim_trailing_whitespace = true 17 | insert_final_newline = true 18 | 19 | [*.md] 20 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-cooltip", 3 | "main": "ng-cooltip.js", 4 | "homepage": "http://ndelvalle.github.io/ng-cooltip/#/classic", 5 | "authors": [ 6 | "ndelvalle " 7 | ], 8 | "description": "An angular module with a small collection of various hover tooltip", 9 | "dependencies": { 10 | "angular": "^1.4.9" 11 | }, 12 | "resolutions": { 13 | "angular": "~1.4.9" 14 | }, 15 | "license": "MIT", 16 | "keywords": [ 17 | "angular", 18 | "angularjs", 19 | "tooltip", 20 | "cooltip" 21 | ], 22 | "ignore": [ 23 | "**/.*", 24 | "node_modules", 25 | "test", 26 | "tests" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var gutil = require('gulp-util'); 3 | 4 | var concat = require('gulp-concat'); 5 | var uglify = require('gulp-uglify'); 6 | var sass = require('gulp-sass'); 7 | var rename = require('gulp-rename'); 8 | var sourcemaps = require('gulp-sourcemaps'); 9 | 10 | gulp.task('build-js', function() { 11 | return gulp.src('src/js/ng-cooltip.js') 12 | .pipe(sourcemaps.init()) 13 | .pipe(concat('ng-cooltip.min.js')) 14 | .pipe(uglify()) 15 | .pipe(sourcemaps.write()) 16 | .pipe(gulp.dest('dist')); 17 | }); 18 | 19 | gulp.task('build-css', function() { 20 | return gulp.src('src/styles/scss/**/*.scss') 21 | .pipe(sourcemaps.init()) 22 | .pipe(sass()) 23 | .pipe(sourcemaps.write()) 24 | .pipe(rename({suffix: '.min'})) 25 | .pipe(gulp.dest('dist')); 26 | }); 27 | 28 | gulp.task('production', ['build-js', 'build-css']); 29 | gulp.task('default', ['production']); 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Nicolas del Valle 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ng-cooltip", 3 | "version": "0.0.7", 4 | "description": "An angular module with a small collection of various hover tooltip", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "main": "index.js", 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/ndelvalle/ng-cooltip.git" 12 | }, 13 | "keywords": [ 14 | "angular", 15 | "angularjs", 16 | "tooltip", 17 | "cooltip" 18 | ], 19 | "author": "ndelvalle ", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/ndelvalle/ng-cooltip/issues" 23 | }, 24 | "homepage": "http://ndelvalle.github.io/ng-cooltip/", 25 | "devDependencies": { 26 | "angular": "^1.4.9", 27 | "angular-mocks": "^1.4.9", 28 | "gulp": "^3.9.0", 29 | "gulp-concat": "^2.6.0", 30 | "gulp-rename": "^1.2.2", 31 | "gulp-sass": "^2.1.1", 32 | "gulp-sourcemaps": "^1.6.0", 33 | "gulp-uglify": "^1.5.1", 34 | "gulp-util": "^3.0.7", 35 | "jasmine-core": "^2.4.1", 36 | "karma": "^0.13.21", 37 | "karma-firefox-launcher": "^0.1.7", 38 | "karma-jasmine": "^0.3.7" 39 | }, 40 | "engines": { 41 | "node": "4.3.0" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // Generated on Sat Feb 13 2016 02:51:24 GMT+0100 (CET) 3 | 4 | module.exports = function(config) { 5 | config.set({ 6 | 7 | // base path that will be used to resolve all patterns (eg. files, exclude) 8 | basePath: '', 9 | 10 | 11 | // frameworks to use 12 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 13 | frameworks: ['jasmine'], 14 | 15 | 16 | // list of files / patterns to load in the browser 17 | files: [ 18 | 'node_modules/angular/angular.js', 19 | 'node_modules/angular-mocks/angular-mocks.js', 20 | 'src/js/ng-cooltip.js', 21 | 'test/ng-cooltip-classic.spec.js', 22 | 'test/ng-cooltip-box.spec.js', 23 | ], 24 | 25 | 26 | // list of files to exclude 27 | exclude: [ 28 | ], 29 | 30 | 31 | // preprocess matching files before serving them to the browser 32 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 33 | preprocessors: { 34 | }, 35 | 36 | 37 | // test results reporter to use 38 | // possible values: 'dots', 'progress' 39 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 40 | reporters: ['progress'], 41 | 42 | 43 | // web server port 44 | port: 9876, 45 | 46 | 47 | // enable / disable colors in the output (reporters and logs) 48 | colors: true, 49 | 50 | 51 | // level of logging 52 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 53 | logLevel: config.LOG_INFO, 54 | 55 | 56 | // enable / disable watching file and executing tests whenever any file changes 57 | autoWatch: true, 58 | 59 | 60 | // start these browsers 61 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 62 | browsers: ['Firefox'], 63 | 64 | 65 | // Continuous Integration mode 66 | // if true, Karma captures browsers, runs the tests and exits 67 | singleRun: false, 68 | 69 | // Concurrency level 70 | // how many browser should be started simultaneous 71 | concurrency: Infinity 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ng-cooltip 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Fork me on GitHub 17 | 18 |
19 |
20 |
21 |

ng-cooltip An angular directive with a small collection of various hover tooltip

22 | 23 | 28 | 29 |
30 |
31 |
32 |
33 | 34 |

this is an angular wrapper of Tooltip Styles Inspiration

35 | 36 |
37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/js/ng-cooltip.js: -------------------------------------------------------------------------------- 1 | (function (){ 2 | 'use strict'; 3 | 4 | angular.module('ng-cooltip', []) 5 | 6 | .directive('cooltip', [function () { 7 | return { 8 | restrict: 'AE', 9 | scope: { 10 | item: '=cooltipItem', 11 | content: '=cooltipContent', 12 | effect: '=cooltipEffect' 13 | }, 14 | controller: coolTipController, 15 | controllerAs: 'vm', 16 | bindToController: true, 17 | templateUrl: templateUrl 18 | }; 19 | }]) 20 | 21 | .run(runTemplateCache); 22 | 23 | coolTipController.$inject = ['$sce']; 24 | function coolTipController($sce) { 25 | this.trustedHtmlContent = $sce.trustAsHtml(this.content); 26 | this.effect = (this.effect > 0 && this.effect < 6) ? this.effect : 1; 27 | } 28 | 29 | function templateUrl(elem, attrs) { 30 | return (attrs.cooltipType || 'classic') + '.html'; 31 | } 32 | 33 | runTemplateCache.$inject = ['$templateCache']; 34 | function runTemplateCache($templateCache) { 35 | $templateCache.put('classic.html', [ 36 | '', 37 | '', 38 | '', 39 | '{{ vm.item }}', 40 | '', 41 | '', 42 | '', 43 | '', 44 | '', 45 | '' 46 | ].join('\n')); 47 | 48 | $templateCache.put('box.html', [ 49 | '', 50 | '', 51 | '', 52 | '{{ vm.item }}', 53 | '', 54 | '', 55 | '', 56 | '', 57 | '', 58 | '' 59 | ].join('\n')); 60 | 61 | $templateCache.put('round.html', [ 62 | '', 63 | '', 64 | ' {{ vm.item }}', 65 | '', 66 | '', 67 | '', 68 | '' 69 | ].join('\n')); 70 | } 71 | 72 | })(); 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [ng-cooltip](https://ndelvalle.github.io/ng-cooltip/) [![Build Status](https://travis-ci.org/ndelvalle/ng-cooltip.svg?branch=master)](https://travis-ci.org/ndelvalle/ng-cooltip) 2 | 3 | An angular module with a small collection of various hover tooltip. This module is an angular wrapper of [Tooltip Styles Inspiration](https://github.com/codrops/TooltipStylesInspiration). 4 | 5 | ## Usage: 6 | 7 | 1. Install ng-cooltip from _bower_, [_npm_](https://www.npmjs.com/package/ng-cooltip) or import script manually 8 | 9 | ``` 10 | $ bower install ng-cooltip --save 11 | $ npm install ng-cooltip --save 12 | ``` 13 | 14 | 2. Include the supplied JS file. Skip if you use Commonjs modules 15 | 16 | ``` html 17 | 18 | 19 | 20 | 21 | ``` 22 | 23 | 3. Include the supplied CSS file (or create your own CSS to override defaults) 24 | 25 | ```html 26 | 27 | 28 | 29 | 30 | ``` 31 | 32 | 4. Add ng-cooltip dependency to your app 33 | 34 | ``` js 35 | angular.module('myApp', ['ng-cooltip']) 36 | ``` 37 | If you use Commonjs modules: 38 | 39 | ```js 40 | var ngCooltip = require('ng-cooltip'); 41 | angular.module('myApp', [ngCooltip]) 42 | ``` 43 | 44 | #### Attributes 45 | 46 | | option | Description | Values | 47 | | ------------- |:----------------------------------------------:| ---------------------: | 48 | | cooltip-type | cooltip type and style | 'classic', 'box', 'round'| 49 | | cooltip-item | word / sentence that fires the tooltip | String | 50 | | cooltip-content | content on tooltip, it could be an html element| String / html element | 51 | | cooltip-effect | firing tooltip effect | [1-5] | 52 | 53 | #### Usage example 54 | ```html 55 |

Lorem ipsum dolor sit amet, et perfecto deserunt nam, quem doming platonem vim no.

56 | ``` 57 | -------------------------------------------------------------------------------- /css/demo.css: -------------------------------------------------------------------------------- 1 | @import url(http://fonts.googleapis.com/css?family=Raleway:200,300,400,700); 2 | 3 | *, *:after, *:before { -webkit-box-sizing: border-box; box-sizing: border-box; } 4 | .clearfix:before, .clearfix:after { content: ''; display: table; } 5 | .clearfix:after { clear: both; } 6 | 7 | body, html, .container { 8 | height: 100%; 9 | } 10 | 11 | body { 12 | background: #fff; 13 | color: #74777b; 14 | font-weight: 500; 15 | font-size: 1em; 16 | font-family: 'Raleway', Arial, sans-serif; 17 | } 18 | 19 | a { 20 | color: #2fa0ec; 21 | text-decoration: none; 22 | outline: none; 23 | } 24 | 25 | a:hover, a:focus { 26 | color: #74777b; 27 | } 28 | 29 | .color-classic { 30 | background: #464355; 31 | color: #eee; 32 | } 33 | 34 | .color-box { 35 | background: #434d55; 36 | color: #eee; 37 | } 38 | 39 | .color-round { 40 | background: #47c9af; 41 | color: #fff; 42 | } 43 | 44 | .color-round a { 45 | color: rgba(0,0,0,0.3); 46 | } 47 | 48 | .color-round a:hover, 49 | .color-round a:focus { 50 | color: #fff; 51 | } 52 | 53 | .content { 54 | padding: 0 1em; 55 | margin: 0 auto; 56 | text-align: center; 57 | } 58 | 59 | /* Header */ 60 | .codrops-header { 61 | padding: 1em 0 3em; 62 | letter-spacing: -1px; 63 | } 64 | 65 | .codrops-header h1 { 66 | font-weight: 800; 67 | font-size: 4.5em; 68 | line-height: 1; 69 | } 70 | 71 | .codrops-header h1 span { 72 | display: block; 73 | font-size: 50%; 74 | font-weight: 200; 75 | padding-top: 0.325em; 76 | opacity: 0.6; 77 | } 78 | 79 | 80 | /* Codrops demo links */ 81 | .codrops-demos { 82 | margin: 0 auto; 83 | } 84 | 85 | .codrops-demos a { 86 | font-weight: 700; 87 | text-transform: uppercase; 88 | letter-spacing: 1px; 89 | padding: 0.25em 0; 90 | margin: 5px 10px; 91 | display: inline-block; 92 | font-size: 0.85em; 93 | } 94 | 95 | .codrops-demos a.current-demo { 96 | opacity: 0.5; 97 | } 98 | 99 | /* Dummy elements */ 100 | .dummy { 101 | text-align: left; 102 | padding: 1em; 103 | min-height: 300px; 104 | margin: 0 auto; 105 | font-weight: 300; 106 | } 107 | 108 | .dummy-text { 109 | max-width: 1000px; 110 | font-size: 1.65em; 111 | } 112 | 113 | .info { 114 | margin: 0 auto; 115 | text-align: center; 116 | max-width: 600px; 117 | font-size: 13px; 118 | padding: 2em 0; 119 | } 120 | 121 | .dummy-text p { 122 | margin-top: 0; 123 | line-height: 1.8; 124 | text-align: justify; 125 | } 126 | 127 | .dummy-text h3 { 128 | font-weight: 700; 129 | text-transform: uppercase; 130 | letter-spacing: 2px; 131 | font-size: 1em; 132 | margin: 2em 0 1em; 133 | } 134 | 135 | .dummy-menu { 136 | max-width: 100%; 137 | padding: 4em 1em; 138 | } 139 | 140 | .dummy-menu ul, 141 | .dummy-team ul { 142 | list-style: none; 143 | text-align: center; 144 | padding: 0; 145 | margin: 0 0 3em; 146 | } 147 | 148 | .dummy-menu ul li { 149 | display: inline-block; 150 | position: relative; 151 | margin: 0 1em; 152 | font-size: 1.5em; 153 | } 154 | 155 | .dummy-menu ul li a { 156 | display: inline-block; 157 | font-weight: 700; 158 | padding: 0.15em 0.25em 0; 159 | -webkit-transition: color 0.3s; 160 | transition: color 0.3s; 161 | } 162 | -------------------------------------------------------------------------------- /test/ng-cooltip-box.spec.js: -------------------------------------------------------------------------------- 1 | 2 | describe('ng-cooltip box directive spec', function() { 3 | 4 | var element; 5 | var scope; 6 | var compile; 7 | this.scope = scope; 8 | 9 | beforeEach(module('ng-cooltip')); 10 | 11 | beforeEach(inject(function($compile, $rootScope) { 12 | compile = $compile; 13 | scope = $rootScope.$new(); 14 | 15 | scope.content = 'Vel ut solum erant dicit, eum te aperiam efficiendi, et eos alia eruditi persecuti. Ius ex omnis voluptatum'; 16 | scope.effect = 1; 17 | directiveElem = getCompiledElement(); 18 | })); 19 | 20 | 21 | it('should have 6 span elements', function () { 22 | var element = directiveElem.find('span'); 23 | expect(element.length).toEqual(6); 24 | }); 25 | 26 | 27 | // The directive must have the above elements 28 | //--------------------------------------------------------------// 29 | 30 | var mustHaveElements = [ 31 | { selector: '#', name: 'ng-cooltip' }, 32 | { selector: '#', name: 'cooltip-box' }, 33 | { selector: '.', name: 'tooltip-effect-1' }, 34 | { selector: '.', name: 'tooltip-item' }, 35 | { selector: '.', name: 'tooltip-content' }, 36 | { selector: '.', name: 'tooltip-text' }, 37 | ]; 38 | 39 | function mustHaveElementTask(taskName, el) { 40 | it(taskName, function () { 41 | var element = directiveElem[0].querySelector(el.selector + el.name); 42 | expect(element).toBeDefined(); 43 | expect(element).not.toBe(null); 44 | }); 45 | } 46 | 47 | mustHaveElements.forEach(function (el) { 48 | var selectorName = el.selector === '#' ? 'id' : 'class'; 49 | var taskName = 'should have an element with '+ selectorName +': \''+ el.name +'\''; 50 | 51 | mustHaveElementTask(taskName, el); 52 | }); 53 | 54 | 55 | // The directive should work with the above effects 56 | //--------------------------------------------------------------// 57 | 58 | var availableEffects = ['1', '2', '3', '4', '5']; 59 | 60 | function availableEffectsTask(taskName, effect) { 61 | it(taskName, function () { 62 | // compile directive with new scope.effect value 63 | scope.effect = effect; 64 | directiveElem = getCompiledElement(); 65 | 66 | var element = directiveElem[0].querySelector('.tooltip-effect-' + effect); 67 | expect(element).toBeDefined(); 68 | expect(element).not.toBe(null); 69 | }); 70 | } 71 | 72 | availableEffects.forEach(function (effect) { 73 | var taskName = 'should displayed class with effect ' + effect; 74 | availableEffectsTask(taskName, effect); 75 | }); 76 | 77 | 78 | // The directive should work with the above types of content 79 | //--------------------------------------------------------------// 80 | 81 | var staticContent = 'Vel ut solum erant dicit, eum te aperiam efficiendi'; 82 | var availableElements = [{ 83 | content: staticContent, 84 | type: 'String' 85 | }, { 86 | content: ''+ staticContent +'', 87 | type: 'html' 88 | }]; 89 | 90 | function testAvailableElements(taskName, content) { 91 | it(taskName, function () { 92 | scope.content = content; 93 | directiveElem = getCompiledElement(); 94 | 95 | var element = directiveElem[0].querySelector('.tooltip-text').innerHTML; 96 | expect(element).toBeDefined(); 97 | expect(element).not.toBe(null); 98 | }); 99 | } 100 | 101 | availableElements.forEach(function (el) { 102 | var taskName = 'should allow ' + el.type + ' content type'; 103 | testAvailableElements(taskName, el.content); 104 | }); 105 | 106 | 107 | //--------------------------------------------------------------// 108 | 109 | function getCompiledElement() { 110 | element = angular.element(''); 111 | var compiledElement = compile(element)(scope); 112 | scope.$digest(); 113 | return compiledElement; 114 | } 115 | 116 | }); 117 | -------------------------------------------------------------------------------- /test/ng-cooltip-classic.spec.js: -------------------------------------------------------------------------------- 1 | 2 | describe('ng-cooltip classic directive spec', function() { 3 | 4 | var element; 5 | var scope; 6 | var compile; 7 | this.scope = scope; 8 | 9 | beforeEach(module('ng-cooltip')); 10 | 11 | beforeEach(inject(function($compile, $rootScope) { 12 | compile = $compile; 13 | scope = $rootScope.$new(); 14 | 15 | scope.content = 'Vel ut solum erant dicit, eum te aperiam efficiendi, et eos alia eruditi persecuti. Ius ex omnis voluptatum'; 16 | scope.effect = 1; 17 | directiveElem = getCompiledElement(); 18 | })); 19 | 20 | 21 | it('should have 6 span elements', function () { 22 | var element = directiveElem.find('span'); 23 | expect(element.length).toEqual(6); 24 | }); 25 | 26 | 27 | // The directive must have the above elements 28 | //--------------------------------------------------------------// 29 | 30 | var mustHaveElements = [ 31 | { selector: '#', name: 'ng-cooltip' }, 32 | { selector: '#', name: 'cooltip-classic' }, 33 | { selector: '.', name: 'tooltip-effect-1' }, 34 | { selector: '.', name: 'tooltip-item' }, 35 | { selector: '.', name: 'tooltip-content' }, 36 | { selector: '.', name: 'tooltip-text' }, 37 | ]; 38 | 39 | function mustHaveElementTask(taskName, el) { 40 | it(taskName, function () { 41 | var element = directiveElem[0].querySelector(el.selector + el.name); 42 | expect(element).toBeDefined(); 43 | expect(element).not.toBe(null); 44 | }); 45 | } 46 | 47 | mustHaveElements.forEach(function (el) { 48 | var selectorName = el.selector === '#' ? 'id' : 'class'; 49 | var taskName = 'should have an element with '+ selectorName +': \''+ el.name +'\''; 50 | 51 | mustHaveElementTask(taskName, el); 52 | }); 53 | 54 | 55 | // The directive should work with the above effects 56 | //--------------------------------------------------------------// 57 | 58 | var availableEffects = ['1', '2', '3', '4', '5']; 59 | 60 | function availableEffectsTask(taskName, effect) { 61 | it(taskName, function () { 62 | // compile directive with new scope.effect value 63 | scope.effect = effect; 64 | directiveElem = getCompiledElement(); 65 | 66 | var element = directiveElem[0].querySelector('.tooltip-effect-' + effect); 67 | expect(element).toBeDefined(); 68 | expect(element).not.toBe(null); 69 | }); 70 | } 71 | 72 | availableEffects.forEach(function (effect) { 73 | var taskName = 'should displayed class with effect ' + effect; 74 | availableEffectsTask(taskName, effect); 75 | }); 76 | 77 | 78 | // The directive should work with the above types of content 79 | //--------------------------------------------------------------// 80 | 81 | var staticContent = 'Vel ut solum erant dicit, eum te aperiam efficiendi'; 82 | var availableElements = [{ 83 | content: staticContent, 84 | type: 'String' 85 | }, { 86 | content: ''+ staticContent +'', 87 | type: 'html' 88 | }]; 89 | 90 | function testAvailableElements(taskName, content) { 91 | it(taskName, function () { 92 | scope.content = content; 93 | directiveElem = getCompiledElement(); 94 | 95 | var element = directiveElem[0].querySelector('.tooltip-text').innerHTML; 96 | expect(element).toBeDefined(); 97 | expect(element).not.toBe(null); 98 | }); 99 | } 100 | 101 | availableElements.forEach(function (el) { 102 | var taskName = 'should allow ' + el.type + ' content type'; 103 | testAvailableElements(taskName, el.content); 104 | }); 105 | 106 | 107 | //--------------------------------------------------------------// 108 | 109 | function getCompiledElement() { 110 | element = angular.element(''); 111 | var compiledElement = compile(element)(scope); 112 | scope.$digest(); 113 | return compiledElement; 114 | } 115 | 116 | }); 117 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | var globalCtrl = [function () { 5 | this.ttcontent = 'Vel ut solum erant dicit, eum te aperiam efficiendi, et eos alia eruditi persecuti. Ius ex omnis voluptatum'; 6 | }]; 7 | 8 | var roundCtrl = [function () { 9 | this.list = [{ 10 | name: 'Home', 11 | effect: 1, 12 | content: '' 13 | }, { 14 | name: 'About me', 15 | effect: 2, 16 | content: '' 17 | }, { 18 | name: 'Photography', 19 | effect: 3, 20 | content: '' 21 | }, { 22 | name: 'Work', 23 | effect: 4, 24 | content: '' 25 | }, { 26 | name: 'Contact', 27 | effect: 5, 28 | content: '' 29 | }]; 30 | }]; 31 | 32 | function getState(type) { 33 | return { 34 | url: '/' + type, 35 | controller: type === 'round' ? roundCtrl : globalCtrl, 36 | controllerAs: 'Ctrl', 37 | templateUrl: 'partials/' + type + '.html' 38 | }; 39 | } 40 | 41 | angular.module('app', [ 42 | 'ui.router', 43 | 'ng-cooltip' 44 | ]) 45 | 46 | .config(function($stateProvider, $urlRouterProvider) { 47 | 48 | $urlRouterProvider.otherwise('/classic'); 49 | 50 | $stateProvider 51 | .state('classic', getState('classic')) 52 | .state('box', getState('box')) 53 | .state('round', getState('round')); 54 | }) 55 | 56 | .run(['$rootScope', '$state', function ($rootScope, $state) { 57 | $rootScope.$state = $state; 58 | }]) 59 | 60 | .run(['$templateCache', function($templateCache) { 61 | 62 | $templateCache.put('partials/classic.html',[ 63 | '

', 64 | ' ', 65 | 'ipsum dolor sit amet, has in dico ', 66 | ' ', 67 | 'expetendis, per nibh vero mutat no. Qui no copiosae ', 68 | '', 69 | '. Vix in delenit omittam elaboraret, ut ', 70 | ' ', 71 | 'atqui deleniti qui. Quo nisl fuisset id. Ut veniam mollis vix. Veniam iudicabit no pri, ne eam sale cetero ', 72 | '.', 73 | '

' 74 | ].join('\n')); 75 | 76 | $templateCache.put('partials/box.html',[ 77 | '

', 78 | ' ', 79 | 'ipsum dolor sit amet, has in dico ', 80 | ' ', 81 | 'expetendis, per nibh vero mutat no. Qui no copiosae ', 82 | '', 83 | '. Vix in delenit omittam elaboraret, ut ', 84 | ' ', 85 | 'atqui deleniti qui. Quo nisl fuisset id. Ut veniam mollis vix. Veniam iudicabit no pri, ne eam sale cetero ', 86 | '.', 87 | '

' 88 | ].join('\n')); 89 | 90 | $templateCache.put('partials/round.html',[ 91 | '' 96 | ].join('\n')); 97 | 98 | }]); 99 | 100 | })(); 101 | -------------------------------------------------------------------------------- /dist/ng-cooltip.min.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";function t(t){this.trustedHtmlContent=t.trustAsHtml(this.content),this.effect=this.effect>0&&this.effect<6?this.effect:1}function n(t,n){return(n.cooltipType||"classic")+".html"}function o(t){t.put("classic.html",['','','','{{ vm.item }}','','',"","","",""].join("\n")),t.put("box.html",['','','','{{ vm.item }}','','',"","","",""].join("\n")),t.put("round.html",['','',' {{ vm.item }}','',"","",""].join("\n"))}angular.module("ng-cooltip",[]).directive("cooltip",[function(){return{restrict:"AE",scope:{item:"=cooltipItem",content:"=cooltipContent",effect:"=cooltipEffect"},controller:t,controllerAs:"vm",bindToController:!0,templateUrl:n}}]).run(o),t.$inject=["$sce"],o.$inject=["$templateCache"]}(); 2 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5nLWNvb2x0aXAuanMiXSwibmFtZXMiOlsiY29vbFRpcENvbnRyb2xsZXIiLCIkc2NlIiwidGhpcyIsInRydXN0ZWRIdG1sQ29udGVudCIsInRydXN0QXNIdG1sIiwiY29udGVudCIsImVmZmVjdCIsInRlbXBsYXRlVXJsIiwiZWxlbSIsImF0dHJzIiwiY29vbHRpcFR5cGUiLCJydW5UZW1wbGF0ZUNhY2hlIiwiJHRlbXBsYXRlQ2FjaGUiLCJwdXQiLCJqb2luIiwiYW5ndWxhciIsIm1vZHVsZSIsImRpcmVjdGl2ZSIsInJlc3RyaWN0Iiwic2NvcGUiLCJpdGVtIiwiY29udHJvbGxlciIsImNvbnRyb2xsZXJBcyIsImJpbmRUb0NvbnRyb2xsZXIiLCJydW4iLCIkaW5qZWN0Il0sIm1hcHBpbmdzIjoiQ0FBQSxXQUNBLFlBc0JBLFNBQUFBLEdBQUFDLEdBQ0FDLEtBQUFDLG1CQUFBRixFQUFBRyxZQUFBRixLQUFBRyxTQUNBSCxLQUFBSSxPQUFBSixLQUFBSSxPQUFBLEdBQUFKLEtBQUFJLE9BQUEsRUFBQUosS0FBQUksT0FBQSxFQUdBLFFBQUFDLEdBQUFDLEVBQUFDLEdBQ0EsT0FBQUEsRUFBQUMsYUFBQSxXQUFBLFFBSUEsUUFBQUMsR0FBQUMsR0FDQUEsRUFBQUMsSUFBQSxnQkFDQSx5QkFDQSw4QkFDQSx3REFDQSxrREFDQSxpQ0FDQSwwRUFDQSxVQUNBLFVBQ0EsVUFDQSxXQUNBQyxLQUFBLE9BRUFGLEVBQUFDLElBQUEsWUFDQSx5QkFDQSwwQkFDQSx3REFDQSxrREFDQSxpQ0FDQSwwRUFDQSxVQUNBLFVBQ0EsVUFDQSxXQUNBQyxLQUFBLE9BRUFGLEVBQUFDLElBQUEsY0FDQSx5QkFDQSw0QkFDQSw0RUFDQSw2RUFDQSxPQUNBLFVBQ0EsV0FDQUMsS0FBQSxPQWpFQUMsUUFBQUMsT0FBQSxpQkFFQUMsVUFBQSxXQUFBLFdBQ0EsT0FDQUMsU0FBQSxLQUNBQyxPQUNBQyxLQUFBLGVBQ0FmLFFBQUEsa0JBQ0FDLE9BQUEsa0JBRUFlLFdBQUFyQixFQUNBc0IsYUFBQSxLQUNBQyxrQkFBQSxFQUNBaEIsWUFBQUEsTUFJQWlCLElBQUFiLEdBRUFYLEVBQUF5QixTQUFBLFFBVUFkLEVBQUFjLFNBQUEiLCJmaWxlIjoibmctY29vbHRpcC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKCl7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHRhbmd1bGFyLm1vZHVsZSgnbmctY29vbHRpcCcsIFtdKVxuXG5cdC5kaXJlY3RpdmUoJ2Nvb2x0aXAnLCBbZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZXN0cmljdDogJ0FFJyxcblx0XHRcdHNjb3BlOiB7XG5cdFx0XHRcdGl0ZW06ICAgICc9Y29vbHRpcEl0ZW0nLFxuXHRcdFx0XHRjb250ZW50OiAnPWNvb2x0aXBDb250ZW50Jyxcblx0XHRcdFx0ZWZmZWN0OiAgJz1jb29sdGlwRWZmZWN0J1xuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xsZXI6IGNvb2xUaXBDb250cm9sbGVyLFxuICAgICAgY29udHJvbGxlckFzOiAndm0nLFxuICAgICAgYmluZFRvQ29udHJvbGxlcjogdHJ1ZSxcblx0XHRcdHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZVVybFxuXHRcdH07XG5cdH1dKVxuXG5cdC5ydW4ocnVuVGVtcGxhdGVDYWNoZSk7XG5cbiAgY29vbFRpcENvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjZSddO1xuICBmdW5jdGlvbiBjb29sVGlwQ29udHJvbGxlcigkc2NlKSB7XG4gICAgdGhpcy50cnVzdGVkSHRtbENvbnRlbnQgPSAkc2NlLnRydXN0QXNIdG1sKHRoaXMuY29udGVudCk7XG4gICAgdGhpcy5lZmZlY3QgPSAodGhpcy5lZmZlY3QgPiAwICYmIHRoaXMuZWZmZWN0IDwgNikgPyB0aGlzLmVmZmVjdCA6IDE7XG4gIH1cblxuICBmdW5jdGlvbiB0ZW1wbGF0ZVVybChlbGVtLCBhdHRycykge1xuICAgIHJldHVybiAoYXR0cnMuY29vbHRpcFR5cGUgfHwgJ2NsYXNzaWMnKSArICcuaHRtbCc7XG4gIH1cblxuICBydW5UZW1wbGF0ZUNhY2hlLiRpbmplY3QgPSBbJyR0ZW1wbGF0ZUNhY2hlJ107XG4gIGZ1bmN0aW9uIHJ1blRlbXBsYXRlQ2FjaGUoJHRlbXBsYXRlQ2FjaGUpIHtcbiAgICAkdGVtcGxhdGVDYWNoZS5wdXQoJ2NsYXNzaWMuaHRtbCcsIFtcbiAgICAgICc8c3BhbiBpZD1cIm5nLWNvb2x0aXBcIj4nLFxuICAgICAgICAnPHNwYW4gaWQ9XCJjb29sdGlwLWNsYXNzaWNcIj4nLFxuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRvb2x0aXAgdG9vbHRpcC1lZmZlY3Qte3sgdm0uZWZmZWN0IH19XCI+JyxcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRvb2x0aXAtaXRlbVwiPnt7IHZtLml0ZW0gfX08L3NwYW4+JyxcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRvb2x0aXAtY29udGVudFwiPicsXG4gICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRvb2x0aXAtdGV4dFwiIG5nLWJpbmQtaHRtbD1cInZtLnRydXN0ZWRIdG1sQ29udGVudFwiPjwvc3Bhbj4nLFxuICAgICAgICAgICAgJzwvc3Bhbj4nLFxuICAgICAgICAgICc8L3NwYW4+JyxcbiAgICAgICAgJzwvc3Bhbj4nLFxuICAgICAgJzwvc3Bhbj4nXG4gICAgXS5qb2luKCdcXG4nKSk7XG5cbiAgICAkdGVtcGxhdGVDYWNoZS5wdXQoJ2JveC5odG1sJywgW1xuICAgICAgJzxzcGFuIGlkPVwibmctY29vbHRpcFwiPicsXG4gICAgICAgICc8c3BhbiBpZD1cImNvb2x0aXAtYm94XCI+JyxcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0b29sdGlwIHRvb2x0aXAtZWZmZWN0LXt7IHZtLmVmZmVjdCB9fVwiPicsXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0b29sdGlwLWl0ZW1cIj57eyB2bS5pdGVtIH19PC9zcGFuPicsXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0b29sdGlwLWNvbnRlbnRcIj4nLFxuICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0b29sdGlwLXRleHRcIiBuZy1iaW5kLWh0bWw9XCJ2bS50cnVzdGVkSHRtbENvbnRlbnRcIj48L3NwYW4+JyxcbiAgICAgICAgICAgICc8L3NwYW4+JyxcbiAgICAgICAgICAnPC9zcGFuPicsXG4gICAgICAgICc8L3NwYW4+JyxcbiAgICAgICc8L3NwYW4+J1xuICAgIF0uam9pbignXFxuJykpO1xuXG4gICAgJHRlbXBsYXRlQ2FjaGUucHV0KCdyb3VuZC5odG1sJywgW1xuICAgICAgJzxzcGFuIGlkPVwibmctY29vbHRpcFwiPicsXG4gICAgICAgICc8c3BhbiBpZD1cImNvb2x0aXAtcm91bmRcIj4nLFxuICAgICAgICAgICc8YSBjbGFzcz1cInRvb2x0aXAgdG9vbHRpcC1lZmZlY3Qte3sgdm0uZWZmZWN0IH19XCIgaHJlZj1cIiNcIj4ge3sgdm0uaXRlbSB9fScsXG4gICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRvb2x0aXAtY29udGVudFwiIG5nLWJpbmQtaHRtbD1cInZtLnRydXN0ZWRIdG1sQ29udGVudFwiPjwvc3Bhbj4nLFxuICAgICAgICAgICc8L2E+JyxcbiAgICAgICAgJzwvc3Bhbj4nLFxuICAgICAgJzwvc3Bhbj4nXG4gICAgXS5qb2luKCdcXG4nKSk7XG4gIH1cblxufSkoKTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== 3 | -------------------------------------------------------------------------------- /src/styles/scss/ng-cooltip.scss: -------------------------------------------------------------------------------- 1 | #ng-cooltip { 2 | .tooltip { 3 | display: inline; 4 | position: relative; 5 | z-index: 999; 6 | } 7 | 8 | /* cooltip-classic */ 9 | #cooltip-classic { 10 | /* Trigger text */ 11 | .tooltip-item { 12 | background: rgba(0, 0, 0, 0.3); 13 | cursor: pointer; 14 | display: inline-block; 15 | font-weight: 700; 16 | padding: 0 10px; 17 | &::after { 18 | content: ''; 19 | position: absolute; 20 | width: 360px; 21 | height: 20px; 22 | bottom: 100%; 23 | left: 50%; 24 | pointer-events: none; 25 | -webkit-transform: translateX(-50%); 26 | transform: translateX(-50%); 27 | } 28 | } 29 | 30 | /* Gap filler */ 31 | .tooltip:hover .tooltip-item::after { 32 | pointer-events: auto; 33 | } 34 | 35 | /* Tooltip */ 36 | .tooltip-content { 37 | position: absolute; 38 | z-index: 9999; 39 | width: 360px; 40 | left: 50%; 41 | margin: 0 0 20px -180px; 42 | bottom: 100%; 43 | text-align: left; 44 | font-size: 0.765em; 45 | line-height: 1.4; 46 | box-shadow: -5px -5px 15px rgba(48, 54, 61, 0.2); 47 | background: #2a3035; 48 | opacity: 0; 49 | cursor: default; 50 | pointer-events: none; 51 | } 52 | 53 | .tooltip-effect-1 .tooltip-content { 54 | -webkit-transform: translate3d(0, -10px, 0); 55 | transform: translate3d(0, -10px, 0); 56 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 57 | transition: opacity 0.3s, transform 0.3s; 58 | } 59 | 60 | .tooltip-effect-2 .tooltip-content { 61 | -webkit-transform-origin: 50% calc(100% + 10px); 62 | transform-origin: 50% calc(100% + 10px); 63 | -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, 45deg); 64 | transform: perspective(1000px) rotate3d(1, 0, 0, 45deg); 65 | -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; 66 | transition: opacity 0.2s, transform 0.2s; 67 | } 68 | 69 | .tooltip-effect-3 .tooltip-content { 70 | -webkit-transform: translate3d(0, 10px, 0) rotate3d(1, 1, 0, 25deg); 71 | transform: translate3d(0, 10px, 0) rotate3d(1, 1, 0, 25deg); 72 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 73 | transition: opacity 0.3s, transform 0.3s; 74 | } 75 | 76 | .tooltip-effect-4 .tooltip-content { 77 | -webkit-transform-origin: 50% 100%; 78 | transform-origin: 50% 100%; 79 | -webkit-transform: scale3d(0.7, 0.3, 1); 80 | transform: scale3d(0.7, 0.3, 1); 81 | -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; 82 | transition: opacity 0.2s, transform 0.2s; 83 | } 84 | 85 | .tooltip-effect-5 .tooltip-content { 86 | width: 180px; 87 | margin-left: -90px; 88 | -webkit-transform-origin: 50% calc(100% + 6em); 89 | transform-origin: 50% calc(100% + 6em); 90 | -webkit-transform: rotate3d(0, 0, 1, 15deg); 91 | transform: rotate3d(0, 0, 1, 15deg); 92 | -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; 93 | transition: opacity 0.2s, transform 0.2s; 94 | -webkit-transition-timing-function: ease, cubic-bezier(0.17, 0.67, 0.4, 1.39); 95 | transition-timing-function: ease, cubic-bezier(0.17, 0.67, 0.4, 1.39); 96 | } 97 | 98 | .tooltip { 99 | &:hover .tooltip-content { 100 | pointer-events: auto; 101 | opacity: 1; 102 | -webkit-transform: translate3d(0, 0, 0) rotate3d(0, 0, 0, 0); 103 | transform: translate3d(0, 0, 0) rotate3d(0, 0, 0, 0); 104 | } 105 | &.tooltip-effect-2:hover .tooltip-content { 106 | -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, 0deg); 107 | transform: perspective(1000px) rotate3d(1, 0, 0, 0deg); 108 | } 109 | } 110 | 111 | /* Arrow */ 112 | .tooltip-content::after { 113 | content: ''; 114 | top: 100%; 115 | left: 50%; 116 | border: solid transparent; 117 | height: 0; 118 | width: 0; 119 | position: absolute; 120 | pointer-events: none; 121 | border-color: transparent; 122 | border-top-color: #2a3035; 123 | border-width: 10px; 124 | margin-left: -10px; 125 | } 126 | 127 | /* Tooltip content*/ 128 | .tooltip-text { 129 | font-size: 0.68em; 130 | line-height: 1.35; 131 | display: block; 132 | padding: 1.31em 1.21em 1.21em 1.31em; 133 | color: #fff; 134 | } 135 | 136 | .tooltip-effect-5 .tooltip-text { 137 | padding: 1.4em; 138 | } 139 | 140 | .tooltip-text a { 141 | font-weight: bold; 142 | } 143 | } 144 | 145 | 146 | /* cooltip-box */ 147 | #cooltip-box { 148 | /* Trigger text */ 149 | .tooltip-item { 150 | color: #2fa0ec; 151 | cursor: pointer; 152 | z-index: 100; 153 | position: relative; 154 | display: inline-block; 155 | font-weight: 700; 156 | -webkit-transition: background-color 0.3s, color 0.3s, -webkit-transform 0.3s; 157 | transition: background-color 0.3s, color 0.3s, transform 0.3s; 158 | } 159 | 160 | .tooltip:hover .tooltip-item { 161 | color: #fff; 162 | -webkit-transform: translate3d(0, -0.5em, 0); 163 | transform: translate3d(0, -0.5em, 0); 164 | } 165 | 166 | /* Tooltip */ 167 | .tooltip-content { 168 | position: absolute; 169 | z-index: 99; 170 | width: 360px; 171 | left: 50%; 172 | margin-left: -180px; 173 | bottom: -5px; 174 | text-align: left; 175 | background: #2fa0ec; 176 | opacity: 0; 177 | font-size: 0.75em; 178 | line-height: 1.5; 179 | padding: 1.5em; 180 | color: #fff; 181 | border-bottom: 65px solid #2a3035; 182 | cursor: default; 183 | pointer-events: none; 184 | border-radius: 5px; 185 | font-family: 'Indie Flower', cursive; 186 | -webkit-transform: translate3d(0, -0.5em, 0); 187 | transform: translate3d(0, -0.5em, 0); 188 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 189 | transition: opacity 0.3s, transform 0.3s; 190 | a { 191 | color: #32434f; 192 | } 193 | } 194 | 195 | .tooltip-text { 196 | opacity: 0; 197 | -webkit-transform: translate3d(0, 1.5em, 0); 198 | transform: translate3d(0, 1.5em, 0); 199 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 200 | transition: opacity 0.3s, transform 0.3s; 201 | } 202 | 203 | .tooltip:hover { 204 | .tooltip-content, .tooltip-text { 205 | pointer-events: auto; 206 | opacity: 1; 207 | -webkit-transform: translate3d(0, 0, 0); 208 | transform: translate3d(0, 0, 0); 209 | } 210 | } 211 | } 212 | 213 | 214 | /* cooltip-round */ 215 | #cooltip-round { 216 | 217 | /* Tooltip */ 218 | .tooltip-content { 219 | position: absolute; 220 | z-index: 9999; 221 | width: 80px; 222 | height: 80px; 223 | padding-top: 25px; 224 | left: 50%; 225 | margin-left: -40px; 226 | bottom: 100%; 227 | border-radius: 50%; 228 | text-align: center; 229 | background: #fff; 230 | color: #47c9af; 231 | opacity: 0; 232 | margin-bottom: 20px; 233 | cursor: default; 234 | pointer-events: none; 235 | i { 236 | opacity: 0; 237 | } 238 | } 239 | 240 | .tooltip:hover .tooltip-content { 241 | opacity: 1; 242 | i { 243 | opacity: 1; 244 | } 245 | } 246 | 247 | .tooltip-effect-1 .tooltip-content { 248 | -webkit-transform: translate3d(0, 10px, 0) rotate3d(1, 1, 1, 45deg); 249 | transform: translate3d(0, 10px, 0) rotate3d(1, 1, 1, 45deg); 250 | -webkit-transform-origin: 50% 100%; 251 | transform-origin: 50% 100%; 252 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 253 | transition: opacity 0.3s, transform 0.3s; 254 | i { 255 | -webkit-transform: scale3d(0, 0, 1); 256 | transform: scale3d(0, 0, 1); 257 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 258 | transition: opacity 0.3s, transform 0.3s; 259 | } 260 | } 261 | 262 | .tooltip-effect-2 .tooltip-content { 263 | -webkit-transform: translate3d(0, 10px, 0); 264 | transform: translate3d(0, 10px, 0); 265 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 266 | transition: opacity 0.3s, transform 0.3s; 267 | i { 268 | -webkit-transform: translate3d(0, 15px, 0); 269 | transform: translate3d(0, 15px, 0); 270 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 271 | transition: opacity 0.3s, transform 0.3s; 272 | } 273 | } 274 | 275 | .tooltip-effect-3 .tooltip-content { 276 | -webkit-transform: translate3d(0, 10px, 0) rotate3d(0, 1, 0, 90deg); 277 | transform: translate3d(0, 10px, 0) rotate3d(0, 1, 0, 90deg); 278 | -webkit-transform-origin: 50% 100%; 279 | transform-origin: 50% 100%; 280 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 281 | transition: opacity 0.3s, transform 0.3s; 282 | i { 283 | -webkit-transform: scale3d(0, 0, 1); 284 | transform: scale3d(0, 0, 1); 285 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 286 | transition: opacity 0.3s, transform 0.3s; 287 | } 288 | } 289 | 290 | .tooltip-effect-4 .tooltip-content { 291 | -webkit-transform: translate3d(0, -20px, 0); 292 | transform: translate3d(0, -20px, 0); 293 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 294 | transition: opacity 0.3s, transform 0.3s; 295 | i { 296 | -webkit-transform: translate3d(0, 20px, 0); 297 | transform: translate3d(0, 20px, 0); 298 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 299 | transition: opacity 0.3s, transform 0.3s; 300 | } 301 | } 302 | 303 | .tooltip-effect-5 .tooltip-content { 304 | -webkit-transform: scale3d(0, 0, 1); 305 | transform: scale3d(0, 0, 1); 306 | -webkit-transform-origin: 50% 100%; 307 | transform-origin: 50% 100%; 308 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 309 | transition: opacity 0.3s, transform 0.3s; 310 | i { 311 | -webkit-transform: translate3d(0, 20px, 0); 312 | transform: translate3d(0, 20px, 0); 313 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 314 | transition: opacity 0.3s, transform 0.3s; 315 | } 316 | } 317 | 318 | .tooltip:hover .tooltip-content { 319 | pointer-events: auto; 320 | -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); 321 | transform: translate3d(0, 0, 0) scale3d(1, 1, 1); 322 | i { 323 | pointer-events: auto; 324 | -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); 325 | transform: translate3d(0, 0, 0) scale3d(1, 1, 1); 326 | } 327 | } 328 | 329 | .tooltip-effect-1:hover .tooltip-content i { 330 | -webkit-transform: rotate3d(1, 1, 1, 0); 331 | transform: rotate3d(1, 1, 1, 0); 332 | } 333 | 334 | /* Arrow */ 335 | .tooltip-content::after { 336 | content: ''; 337 | position: absolute; 338 | top: 100%; 339 | left: 50%; 340 | margin: -7px 0 0 -15px; 341 | width: 30px; 342 | height: 20px; 343 | background-size: 100%; 344 | } 345 | } 346 | } 347 | -------------------------------------------------------------------------------- /dist/ng-cooltip.min.css: -------------------------------------------------------------------------------- 1 | #ng-cooltip { 2 | /* cooltip-classic */ 3 | /* cooltip-box */ 4 | /* cooltip-round */ } 5 | #ng-cooltip .tooltip { 6 | display: inline; 7 | position: relative; 8 | z-index: 999; } 9 | #ng-cooltip #cooltip-classic { 10 | /* Trigger text */ 11 | /* Gap filler */ 12 | /* Tooltip */ 13 | /* Arrow */ 14 | /* Tooltip content*/ } 15 | #ng-cooltip #cooltip-classic .tooltip-item { 16 | background: rgba(0, 0, 0, 0.3); 17 | cursor: pointer; 18 | display: inline-block; 19 | font-weight: 700; 20 | padding: 0 10px; } 21 | #ng-cooltip #cooltip-classic .tooltip-item::after { 22 | content: ''; 23 | position: absolute; 24 | width: 360px; 25 | height: 20px; 26 | bottom: 100%; 27 | left: 50%; 28 | pointer-events: none; 29 | -webkit-transform: translateX(-50%); 30 | transform: translateX(-50%); } 31 | #ng-cooltip #cooltip-classic .tooltip:hover .tooltip-item::after { 32 | pointer-events: auto; } 33 | #ng-cooltip #cooltip-classic .tooltip-content { 34 | position: absolute; 35 | z-index: 9999; 36 | width: 360px; 37 | left: 50%; 38 | margin: 0 0 20px -180px; 39 | bottom: 100%; 40 | text-align: left; 41 | font-size: 0.765em; 42 | line-height: 1.4; 43 | box-shadow: -5px -5px 15px rgba(48, 54, 61, 0.2); 44 | background: #2a3035; 45 | opacity: 0; 46 | cursor: default; 47 | pointer-events: none; } 48 | #ng-cooltip #cooltip-classic .tooltip-effect-1 .tooltip-content { 49 | -webkit-transform: translate3d(0, -10px, 0); 50 | transform: translate3d(0, -10px, 0); 51 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 52 | transition: opacity 0.3s, transform 0.3s; } 53 | #ng-cooltip #cooltip-classic .tooltip-effect-2 .tooltip-content { 54 | -webkit-transform-origin: 50% calc(100% + 10px); 55 | transform-origin: 50% calc(100% + 10px); 56 | -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, 45deg); 57 | transform: perspective(1000px) rotate3d(1, 0, 0, 45deg); 58 | -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; 59 | transition: opacity 0.2s, transform 0.2s; } 60 | #ng-cooltip #cooltip-classic .tooltip-effect-3 .tooltip-content { 61 | -webkit-transform: translate3d(0, 10px, 0) rotate3d(1, 1, 0, 25deg); 62 | transform: translate3d(0, 10px, 0) rotate3d(1, 1, 0, 25deg); 63 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 64 | transition: opacity 0.3s, transform 0.3s; } 65 | #ng-cooltip #cooltip-classic .tooltip-effect-4 .tooltip-content { 66 | -webkit-transform-origin: 50% 100%; 67 | transform-origin: 50% 100%; 68 | -webkit-transform: scale3d(0.7, 0.3, 1); 69 | transform: scale3d(0.7, 0.3, 1); 70 | -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; 71 | transition: opacity 0.2s, transform 0.2s; } 72 | #ng-cooltip #cooltip-classic .tooltip-effect-5 .tooltip-content { 73 | width: 180px; 74 | margin-left: -90px; 75 | -webkit-transform-origin: 50% calc(100% + 6em); 76 | transform-origin: 50% calc(100% + 6em); 77 | -webkit-transform: rotate3d(0, 0, 1, 15deg); 78 | transform: rotate3d(0, 0, 1, 15deg); 79 | -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; 80 | transition: opacity 0.2s, transform 0.2s; 81 | -webkit-transition-timing-function: ease, cubic-bezier(0.17, 0.67, 0.4, 1.39); 82 | transition-timing-function: ease, cubic-bezier(0.17, 0.67, 0.4, 1.39); } 83 | #ng-cooltip #cooltip-classic .tooltip:hover .tooltip-content { 84 | pointer-events: auto; 85 | opacity: 1; 86 | -webkit-transform: translate3d(0, 0, 0) rotate3d(0, 0, 0, 0); 87 | transform: translate3d(0, 0, 0) rotate3d(0, 0, 0, 0); } 88 | #ng-cooltip #cooltip-classic .tooltip.tooltip-effect-2:hover .tooltip-content { 89 | -webkit-transform: perspective(1000px) rotate3d(1, 0, 0, 0deg); 90 | transform: perspective(1000px) rotate3d(1, 0, 0, 0deg); } 91 | #ng-cooltip #cooltip-classic .tooltip-content::after { 92 | content: ''; 93 | top: 100%; 94 | left: 50%; 95 | border: solid transparent; 96 | height: 0; 97 | width: 0; 98 | position: absolute; 99 | pointer-events: none; 100 | border-color: transparent; 101 | border-top-color: #2a3035; 102 | border-width: 10px; 103 | margin-left: -10px; } 104 | #ng-cooltip #cooltip-classic .tooltip-text { 105 | font-size: 0.68em; 106 | line-height: 1.35; 107 | display: block; 108 | padding: 1.31em 1.21em 1.21em 1.31em; 109 | color: #fff; } 110 | #ng-cooltip #cooltip-classic .tooltip-effect-5 .tooltip-text { 111 | padding: 1.4em; } 112 | #ng-cooltip #cooltip-classic .tooltip-text a { 113 | font-weight: bold; } 114 | #ng-cooltip #cooltip-box { 115 | /* Trigger text */ 116 | /* Tooltip */ } 117 | #ng-cooltip #cooltip-box .tooltip-item { 118 | color: #2fa0ec; 119 | cursor: pointer; 120 | z-index: 100; 121 | position: relative; 122 | display: inline-block; 123 | font-weight: 700; 124 | -webkit-transition: background-color 0.3s, color 0.3s, -webkit-transform 0.3s; 125 | transition: background-color 0.3s, color 0.3s, transform 0.3s; } 126 | #ng-cooltip #cooltip-box .tooltip:hover .tooltip-item { 127 | color: #fff; 128 | -webkit-transform: translate3d(0, -0.5em, 0); 129 | transform: translate3d(0, -0.5em, 0); } 130 | #ng-cooltip #cooltip-box .tooltip-content { 131 | position: absolute; 132 | z-index: 99; 133 | width: 360px; 134 | left: 50%; 135 | margin-left: -180px; 136 | bottom: -5px; 137 | text-align: left; 138 | background: #2fa0ec; 139 | opacity: 0; 140 | font-size: 0.75em; 141 | line-height: 1.5; 142 | padding: 1.5em; 143 | color: #fff; 144 | border-bottom: 65px solid #2a3035; 145 | cursor: default; 146 | pointer-events: none; 147 | border-radius: 5px; 148 | font-family: 'Indie Flower', cursive; 149 | -webkit-transform: translate3d(0, -0.5em, 0); 150 | transform: translate3d(0, -0.5em, 0); 151 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 152 | transition: opacity 0.3s, transform 0.3s; } 153 | #ng-cooltip #cooltip-box .tooltip-content a { 154 | color: #32434f; } 155 | #ng-cooltip #cooltip-box .tooltip-text { 156 | opacity: 0; 157 | -webkit-transform: translate3d(0, 1.5em, 0); 158 | transform: translate3d(0, 1.5em, 0); 159 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 160 | transition: opacity 0.3s, transform 0.3s; } 161 | #ng-cooltip #cooltip-box .tooltip:hover .tooltip-content, #ng-cooltip #cooltip-box .tooltip:hover .tooltip-text { 162 | pointer-events: auto; 163 | opacity: 1; 164 | -webkit-transform: translate3d(0, 0, 0); 165 | transform: translate3d(0, 0, 0); } 166 | #ng-cooltip #cooltip-round { 167 | /* Tooltip */ 168 | /* Arrow */ } 169 | #ng-cooltip #cooltip-round .tooltip-content { 170 | position: absolute; 171 | z-index: 9999; 172 | width: 80px; 173 | height: 80px; 174 | padding-top: 25px; 175 | left: 50%; 176 | margin-left: -40px; 177 | bottom: 100%; 178 | border-radius: 50%; 179 | text-align: center; 180 | background: #fff; 181 | color: #47c9af; 182 | opacity: 0; 183 | margin-bottom: 20px; 184 | cursor: default; 185 | pointer-events: none; } 186 | #ng-cooltip #cooltip-round .tooltip-content i { 187 | opacity: 0; } 188 | #ng-cooltip #cooltip-round .tooltip:hover .tooltip-content { 189 | opacity: 1; } 190 | #ng-cooltip #cooltip-round .tooltip:hover .tooltip-content i { 191 | opacity: 1; } 192 | #ng-cooltip #cooltip-round .tooltip-effect-1 .tooltip-content { 193 | -webkit-transform: translate3d(0, 10px, 0) rotate3d(1, 1, 1, 45deg); 194 | transform: translate3d(0, 10px, 0) rotate3d(1, 1, 1, 45deg); 195 | -webkit-transform-origin: 50% 100%; 196 | transform-origin: 50% 100%; 197 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 198 | transition: opacity 0.3s, transform 0.3s; } 199 | #ng-cooltip #cooltip-round .tooltip-effect-1 .tooltip-content i { 200 | -webkit-transform: scale3d(0, 0, 1); 201 | transform: scale3d(0, 0, 1); 202 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 203 | transition: opacity 0.3s, transform 0.3s; } 204 | #ng-cooltip #cooltip-round .tooltip-effect-2 .tooltip-content { 205 | -webkit-transform: translate3d(0, 10px, 0); 206 | transform: translate3d(0, 10px, 0); 207 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 208 | transition: opacity 0.3s, transform 0.3s; } 209 | #ng-cooltip #cooltip-round .tooltip-effect-2 .tooltip-content i { 210 | -webkit-transform: translate3d(0, 15px, 0); 211 | transform: translate3d(0, 15px, 0); 212 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 213 | transition: opacity 0.3s, transform 0.3s; } 214 | #ng-cooltip #cooltip-round .tooltip-effect-3 .tooltip-content { 215 | -webkit-transform: translate3d(0, 10px, 0) rotate3d(0, 1, 0, 90deg); 216 | transform: translate3d(0, 10px, 0) rotate3d(0, 1, 0, 90deg); 217 | -webkit-transform-origin: 50% 100%; 218 | transform-origin: 50% 100%; 219 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 220 | transition: opacity 0.3s, transform 0.3s; } 221 | #ng-cooltip #cooltip-round .tooltip-effect-3 .tooltip-content i { 222 | -webkit-transform: scale3d(0, 0, 1); 223 | transform: scale3d(0, 0, 1); 224 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 225 | transition: opacity 0.3s, transform 0.3s; } 226 | #ng-cooltip #cooltip-round .tooltip-effect-4 .tooltip-content { 227 | -webkit-transform: translate3d(0, -20px, 0); 228 | transform: translate3d(0, -20px, 0); 229 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 230 | transition: opacity 0.3s, transform 0.3s; } 231 | #ng-cooltip #cooltip-round .tooltip-effect-4 .tooltip-content i { 232 | -webkit-transform: translate3d(0, 20px, 0); 233 | transform: translate3d(0, 20px, 0); 234 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 235 | transition: opacity 0.3s, transform 0.3s; } 236 | #ng-cooltip #cooltip-round .tooltip-effect-5 .tooltip-content { 237 | -webkit-transform: scale3d(0, 0, 1); 238 | transform: scale3d(0, 0, 1); 239 | -webkit-transform-origin: 50% 100%; 240 | transform-origin: 50% 100%; 241 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 242 | transition: opacity 0.3s, transform 0.3s; } 243 | #ng-cooltip #cooltip-round .tooltip-effect-5 .tooltip-content i { 244 | -webkit-transform: translate3d(0, 20px, 0); 245 | transform: translate3d(0, 20px, 0); 246 | -webkit-transition: opacity 0.3s, -webkit-transform 0.3s; 247 | transition: opacity 0.3s, transform 0.3s; } 248 | #ng-cooltip #cooltip-round .tooltip:hover .tooltip-content { 249 | pointer-events: auto; 250 | -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); 251 | transform: translate3d(0, 0, 0) scale3d(1, 1, 1); } 252 | #ng-cooltip #cooltip-round .tooltip:hover .tooltip-content i { 253 | pointer-events: auto; 254 | -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); 255 | transform: translate3d(0, 0, 0) scale3d(1, 1, 1); } 256 | #ng-cooltip #cooltip-round .tooltip-effect-1:hover .tooltip-content i { 257 | -webkit-transform: rotate3d(1, 1, 1, 0); 258 | transform: rotate3d(1, 1, 1, 0); } 259 | #ng-cooltip #cooltip-round .tooltip-content::after { 260 | content: ''; 261 | position: absolute; 262 | top: 100%; 263 | left: 50%; 264 | margin: -7px 0 0 -15px; 265 | width: 30px; 266 | height: 20px; 267 | background-size: 100%; } 268 | 269 | /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY29vbHRpcC5jc3MiLCJzb3VyY2VzIjpbIm5nLWNvb2x0aXAuc2NzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIjbmctY29vbHRpcCB7XG4gIC50b29sdGlwIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDk5OTtcbiAgfVxuXG4gIC8qIGNvb2x0aXAtY2xhc3NpYyAqL1xuICAjY29vbHRpcC1jbGFzc2ljIHtcbiAgICAvKiBUcmlnZ2VyIHRleHQgKi9cbiAgICAudG9vbHRpcC1pdGVtIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAzNjBweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICBib3R0b206IDEwMCU7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogR2FwIGZpbGxlciAqL1xuICAgIC50b29sdGlwOmhvdmVyIC50b29sdGlwLWl0ZW06OmFmdGVyIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIH1cblxuICAgIC8qIFRvb2x0aXAgKi9cbiAgICAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICB3aWR0aDogMzYwcHg7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICBtYXJnaW46IDAgMCAyMHB4IC0xODBweDtcbiAgICAgIGJvdHRvbTogMTAwJTtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICBmb250LXNpemU6IDAuNzY1ZW07XG4gICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgYm94LXNoYWRvdzogLTVweCAtNXB4IDE1cHggcmdiYSg0OCwgNTQsIDYxLCAwLjIpO1xuICAgICAgYmFja2dyb3VuZDogIzJhMzAzNTtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG5cbiAgICAudG9vbHRpcC1lZmZlY3QtMSAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMTBweCwgMCk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0xMHB4LCAwKTtcbiAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCAtd2Via2l0LXRyYW5zZm9ybSAwLjNzO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcbiAgICB9XG5cbiAgICAudG9vbHRpcC1lZmZlY3QtMiAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlIGNhbGMoMTAwJSArIDEwcHgpO1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIGNhbGMoMTAwJSArIDEwcHgpO1xuICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlM2QoMSwgMCwgMCwgNDVkZWcpO1xuICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZTNkKDEsIDAsIDAsIDQ1ZGVnKTtcbiAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzLCAtd2Via2l0LXRyYW5zZm9ybSAwLjJzO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzLCB0cmFuc2Zvcm0gMC4ycztcbiAgICB9XG5cbiAgICAudG9vbHRpcC1lZmZlY3QtMyAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKSByb3RhdGUzZCgxLCAxLCAwLCAyNWRlZyk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApIHJvdGF0ZTNkKDEsIDEsIDAsIDI1ZGVnKTtcbiAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCAtd2Via2l0LXRyYW5zZm9ybSAwLjNzO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcbiAgICB9XG5cbiAgICAudG9vbHRpcC1lZmZlY3QtNCAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlIDEwMCU7XG4gICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTAwJTtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAuNywgMC4zLCAxKTtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLjcsIDAuMywgMSk7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgLXdlYmtpdC10cmFuc2Zvcm0gMC4ycztcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgdHJhbnNmb3JtIDAuMnM7XG4gICAgfVxuXG4gICAgLnRvb2x0aXAtZWZmZWN0LTUgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICB3aWR0aDogMTgwcHg7XG4gICAgICBtYXJnaW4tbGVmdDogLTkwcHg7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSBjYWxjKDEwMCUgKyA2ZW0pO1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIGNhbGMoMTAwJSArIDZlbSk7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMCwgMCwgMSwgMTVkZWcpO1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUzZCgwLCAwLCAxLCAxNWRlZyk7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgLXdlYmtpdC10cmFuc2Zvcm0gMC4ycztcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycywgdHJhbnNmb3JtIDAuMnM7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLCBjdWJpYy1iZXppZXIoMC4xNywgMC42NywgMC40LCAxLjM5KTtcbiAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLCBjdWJpYy1iZXppZXIoMC4xNywgMC42NywgMC40LCAxLjM5KTtcbiAgICB9XG5cbiAgICAudG9vbHRpcCB7XG4gICAgICAmOmhvdmVyIC50b29sdGlwLWNvbnRlbnQge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDAsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApIHJvdGF0ZTNkKDAsIDAsIDAsIDApO1xuICAgICAgfVxuICAgICAgJi50b29sdGlwLWVmZmVjdC0yOmhvdmVyIC50b29sdGlwLWNvbnRlbnQge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGUzZCgxLCAwLCAwLCAwZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZTNkKDEsIDAsIDAsIDBkZWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEFycm93ICovXG4gICAgLnRvb2x0aXAtY29udGVudDo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICB0b3A6IDEwMCU7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICBib3JkZXI6IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgaGVpZ2h0OiAwO1xuICAgICAgd2lkdGg6IDA7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAjMmEzMDM1O1xuICAgICAgYm9yZGVyLXdpZHRoOiAxMHB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICAgIH1cblxuICAgIC8qIFRvb2x0aXAgY29udGVudCovXG4gICAgLnRvb2x0aXAtdGV4dCB7XG4gICAgICBmb250LXNpemU6IDAuNjhlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjM1O1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwYWRkaW5nOiAxLjMxZW0gMS4yMWVtIDEuMjFlbSAxLjMxZW07XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICB9XG5cbiAgICAudG9vbHRpcC1lZmZlY3QtNSAudG9vbHRpcC10ZXh0IHtcbiAgICAgIHBhZGRpbmc6IDEuNGVtO1xuICAgIH1cblxuICAgIC50b29sdGlwLXRleHQgYSB7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB9XG4gIH1cblxuXG4gIC8qIGNvb2x0aXAtYm94ICovXG4gICNjb29sdGlwLWJveCB7XG4gICAgLyogVHJpZ2dlciB0ZXh0ICovXG4gICAgLnRvb2x0aXAtaXRlbSB7XG4gICAgICBjb2xvcjogIzJmYTBlYztcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHotaW5kZXg6IDEwMDtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcywgY29sb3IgMC4zcywgLXdlYmtpdC10cmFuc2Zvcm0gMC4zcztcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcywgY29sb3IgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgfVxuXG4gICAgLnRvb2x0aXA6aG92ZXIgLnRvb2x0aXAtaXRlbSB7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMC41ZW0sIDApO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMC41ZW0sIDApO1xuICAgIH1cblxuICAgIC8qIFRvb2x0aXAgKi9cbiAgICAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHotaW5kZXg6IDk5O1xuICAgICAgd2lkdGg6IDM2MHB4O1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xODBweDtcbiAgICAgIGJvdHRvbTogLTVweDtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICBiYWNrZ3JvdW5kOiAjMmZhMGVjO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NWVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgICAgIHBhZGRpbmc6IDEuNWVtO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgICBib3JkZXItYm90dG9tOiA2NXB4IHNvbGlkICMyYTMwMzU7XG4gICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGZvbnQtZmFtaWx5OiAnSW5kaWUgRmxvd2VyJywgY3Vyc2l2ZTtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMC41ZW0sIDApO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMC41ZW0sIDApO1xuICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xuICAgICAgYSB7XG4gICAgICAgIGNvbG9yOiAjMzI0MzRmO1xuICAgICAgfVxuICAgIH1cblxuICAgIC50b29sdGlwLXRleHQge1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxLjVlbSwgMCk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEuNWVtLCAwKTtcbiAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCAtd2Via2l0LXRyYW5zZm9ybSAwLjNzO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcbiAgICB9XG5cbiAgICAudG9vbHRpcDpob3ZlciB7XG4gICAgICAudG9vbHRpcC1jb250ZW50LCAudG9vbHRpcC10ZXh0IHtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qIGNvb2x0aXAtcm91bmQgKi9cbiAgI2Nvb2x0aXAtcm91bmQge1xuXG4gICAgLyogVG9vbHRpcCAqL1xuICAgIC50b29sdGlwLWNvbnRlbnQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgei1pbmRleDogOTk5OTtcbiAgICAgIHdpZHRoOiA4MHB4O1xuICAgICAgaGVpZ2h0OiA4MHB4O1xuICAgICAgcGFkZGluZy10b3A6IDI1cHg7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICBtYXJnaW4tbGVmdDogLTQwcHg7XG4gICAgICBib3R0b206IDEwMCU7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgICAgY29sb3I6ICM0N2M5YWY7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgaSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnRvb2x0aXA6aG92ZXIgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgaSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnRvb2x0aXAtZWZmZWN0LTEgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCkgcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyk7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSAxMDAlO1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIDEwMCU7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgLXdlYmtpdC10cmFuc2Zvcm0gMC4zcztcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICBpIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMCwgMCwgMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLCAwLCAxKTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnRvb2x0aXAtZWZmZWN0LTIgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCk7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDEwcHgsIDApO1xuICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xuICAgICAgaSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxNXB4LCAwKTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxNXB4LCAwKTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnRvb2x0aXAtZWZmZWN0LTMgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTBweCwgMCkgcm90YXRlM2QoMCwgMSwgMCwgOTBkZWcpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAxMHB4LCAwKSByb3RhdGUzZCgwLCAxLCAwLCA5MGRlZyk7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSAxMDAlO1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIDEwMCU7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgLXdlYmtpdC10cmFuc2Zvcm0gMC4zcztcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICBpIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMCwgMCwgMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLCAwLCAxKTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnRvb2x0aXAtZWZmZWN0LTQgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMjBweCwgMCk7XG4gICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgLXdlYmtpdC10cmFuc2Zvcm0gMC4zcztcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICBpIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwcHgsIDApO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDIwcHgsIDApO1xuICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgLXdlYmtpdC10cmFuc2Zvcm0gMC4zcztcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCB0cmFuc2Zvcm0gMC4zcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAudG9vbHRpcC1lZmZlY3QtNSAudG9vbHRpcC1jb250ZW50IHtcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAsIDAsIDEpO1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsIDAsIDEpO1xuICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTAwJTtcbiAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxMDAlO1xuICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xuICAgICAgaSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMHB4LCAwKTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAyMHB4LCAwKTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIC13ZWJraXQtdHJhbnNmb3JtIDAuM3M7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnRvb2x0aXA6aG92ZXIgLnRvb2x0aXAtY29udGVudCB7XG4gICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKSBzY2FsZTNkKDEsIDEsIDEpO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKSBzY2FsZTNkKDEsIDEsIDEpO1xuICAgICAgaSB7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCkgc2NhbGUzZCgxLCAxLCAxKTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKSBzY2FsZTNkKDEsIDEsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC50b29sdGlwLWVmZmVjdC0xOmhvdmVyIC50b29sdGlwLWNvbnRlbnQgaSB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlM2QoMSwgMSwgMSwgMCk7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZTNkKDEsIDEsIDEsIDApO1xuICAgIH1cblxuICAgIC8qIEFycm93ICovXG4gICAgLnRvb2x0aXAtY29udGVudDo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDEwMCU7XG4gICAgICBsZWZ0OiA1MCU7XG4gICAgICBtYXJnaW46IC03cHggMCAwIC0xNXB4O1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCU7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFdBQVcsQ0FBQztFQU9WLHFCQUFxQjtFQTBJckIsaUJBQWlCO0VBb0VqQixtQkFBbUIsRUFvSXBCO0VBelZELFdBQVcsQ0FDVCxRQUFRLENBQUM7SUFDUCxPQUFPLEVBQUUsTUFBTztJQUNoQixRQUFRLEVBQUUsUUFBUztJQUNuQixPQUFPLEVBQUUsR0FBSSxHQUNkO0VBTEgsV0FBVyxDQVFULGdCQUFnQixDQUFDO0lBQ2Ysa0JBQWtCO0lBb0JsQixnQkFBZ0I7SUFLaEIsYUFBYTtJQTRFYixXQUFXO0lBZ0JYLG9CQUFvQixFQWdCckI7SUE5SUgsV0FBVyxDQVFULGdCQUFnQixDQUVkLGFBQWEsQ0FBQztNQUNaLFVBQVUsRUFBRSxrQkFBSTtNQUNoQixNQUFNLEVBQUUsT0FBUTtNQUNoQixPQUFPLEVBQUUsWUFBYTtNQUN0QixXQUFXLEVBQUUsR0FBSTtNQUNqQixPQUFPLEVBQUUsTUFBTyxHQVlqQjtNQTNCTCxXQUFXLENBUVQsZ0JBQWdCLENBRWQsYUFBYSxBQU1WLE9BQU8sQ0FBQztRQUNQLE9BQU8sRUFBRSxFQUFHO1FBQ1osUUFBUSxFQUFFLFFBQVM7UUFDbkIsS0FBSyxFQUFFLEtBQU07UUFDYixNQUFN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 */ 270 | --------------------------------------------------------------------------------