├── app ├── .gitkeep └── components │ ├── intro-js.js │ └── intro-js │ └── step.js ├── addon ├── .gitkeep ├── intro-js.js └── components │ ├── step.js │ └── intro-js.js ├── vendor └── .gitkeep ├── tests ├── helpers │ ├── .gitkeep │ ├── resolver.js │ └── ember-introjs.js ├── unit │ ├── .gitkeep │ └── components │ │ └── step-test.js ├── dummy │ ├── app │ │ ├── helpers │ │ │ └── .gitkeep │ │ ├── models │ │ │ └── .gitkeep │ │ ├── routes │ │ │ └── .gitkeep │ │ ├── styles │ │ │ └── app.css │ │ ├── components │ │ │ └── .gitkeep │ │ ├── controllers │ │ │ ├── .gitkeep │ │ │ └── application.js │ │ ├── templates │ │ │ ├── components │ │ │ │ └── .gitkeep │ │ │ └── application.hbs │ │ ├── resolver.js │ │ ├── router.js │ │ ├── app.js │ │ └── index.html │ ├── config │ │ ├── optional-features.json │ │ ├── targets.js │ │ └── environment.js │ └── public │ │ └── robots.txt ├── test-helper.js ├── integration │ ├── components │ │ ├── step-test.js │ │ └── intro-js-test.js │ └── test-helpers-test.js └── index.html ├── .github_changelog_generator ├── ember-introjs.png ├── .template-lintrc.js ├── config ├── environment.js └── ember-try.js ├── inch.json ├── jsconfig.json ├── .ember-cli ├── .eslintignore ├── .gitignore ├── .npmignore ├── ember-cli-build.js ├── .editorconfig ├── testem.js ├── CONTRIBUTING.md ├── index.js ├── LICENSE.md ├── .eslintrc.js ├── .travis.yml ├── package.json ├── CODE_OF_CONDUCT.md ├── README.md └── CHANGELOG.md /app/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /addon/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/helpers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/helpers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/models/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/routes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/styles/app.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/controllers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/templates/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github_changelog_generator: -------------------------------------------------------------------------------- 1 | future-release=2.0.0 2 | -------------------------------------------------------------------------------- /addon/intro-js.js: -------------------------------------------------------------------------------- 1 | export { default } from 'intro-js'; 2 | -------------------------------------------------------------------------------- /tests/dummy/config/optional-features.json: -------------------------------------------------------------------------------- 1 | { 2 | "jquery-integration": false 3 | } 4 | -------------------------------------------------------------------------------- /app/components/intro-js.js: -------------------------------------------------------------------------------- 1 | export { default } from 'ember-introjs/components/intro-js'; 2 | -------------------------------------------------------------------------------- /app/components/intro-js/step.js: -------------------------------------------------------------------------------- 1 | export { default } from 'ember-introjs/components/step'; 2 | -------------------------------------------------------------------------------- /tests/dummy/public/robots.txt: -------------------------------------------------------------------------------- 1 | # http://www.robotstxt.org 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /ember-introjs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PoslinskiNet/ember-introjs/HEAD/ember-introjs.png -------------------------------------------------------------------------------- /.template-lintrc.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | extends: 'recommended' 5 | }; 6 | -------------------------------------------------------------------------------- /tests/dummy/app/resolver.js: -------------------------------------------------------------------------------- 1 | import Resolver from 'ember-resolver'; 2 | 3 | export default Resolver; 4 | -------------------------------------------------------------------------------- /config/environment.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function(/* environment, appConfig */) { 4 | return { }; 5 | }; 6 | -------------------------------------------------------------------------------- /inch.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "included": [ 4 | "addon/components/*.js" 5 | ], 6 | "excluded": [] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | {"compilerOptions":{"target":"es6","experimentalDecorators":true},"exclude":["node_modules","bower_components","tmp","vendor",".git","dist"]} -------------------------------------------------------------------------------- /tests/test-helper.js: -------------------------------------------------------------------------------- 1 | import Application from '../app'; 2 | import config from '../config/environment'; 3 | import { setApplication } from '@ember/test-helpers'; 4 | import { start } from 'ember-qunit'; 5 | 6 | setApplication(Application.create(config.APP)); 7 | 8 | start(); 9 | -------------------------------------------------------------------------------- /tests/dummy/app/templates/application.hbs: -------------------------------------------------------------------------------- 1 |

Welcome to Ember.js

2 | 3 | {{outlet}} 4 | 5 | {{intro-js steps=steps start-if=true}} 6 | 7 |
8 | Some sample content 9 |
10 | 11 |
12 | Some more sample content 13 |
14 | -------------------------------------------------------------------------------- /tests/dummy/app/router.js: -------------------------------------------------------------------------------- 1 | import EmberRouter from '@ember/routing/router'; 2 | import config from './config/environment'; 3 | 4 | const Router = EmberRouter.extend({ 5 | location: config.locationType, 6 | rootURL: config.rootURL 7 | }); 8 | 9 | Router.map(function() { 10 | }); 11 | 12 | export default Router; 13 | -------------------------------------------------------------------------------- /.ember-cli: -------------------------------------------------------------------------------- 1 | { 2 | /** 3 | Ember CLI sends analytics information by default. The data is completely 4 | anonymous, but there are times when you might want to disable this behavior. 5 | 6 | Setting `disableAnalytics` to true will prevent any data from being sent. 7 | */ 8 | "disableAnalytics": false 9 | } 10 | -------------------------------------------------------------------------------- /tests/helpers/resolver.js: -------------------------------------------------------------------------------- 1 | import Resolver from 'ember-resolver'; 2 | import config from '../../config/environment'; 3 | 4 | const resolver = Resolver.create(); 5 | 6 | resolver.namespace = { 7 | modulePrefix: config.modulePrefix, 8 | podModulePrefix: config.podModulePrefix 9 | }; 10 | 11 | export default resolver; 12 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | # unconventional js 2 | /blueprints/*/files/ 3 | /vendor/ 4 | 5 | # compiled output 6 | /dist/ 7 | /tmp/ 8 | 9 | # dependencies 10 | /bower_components/ 11 | /node_modules/ 12 | 13 | # misc 14 | /coverage/ 15 | !.* 16 | 17 | # ember-try 18 | /.node_modules.ember-try/ 19 | /bower.json.ember-try 20 | /package.json.ember-try 21 | -------------------------------------------------------------------------------- /tests/dummy/config/targets.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const browsers = [ 4 | 'last 1 Chrome versions', 5 | 'last 1 Firefox versions', 6 | 'last 1 Safari versions' 7 | ]; 8 | 9 | const isCI = !!process.env.CI; 10 | const isProduction = process.env.EMBER_ENV === 'production'; 11 | 12 | if (isCI || isProduction) { 13 | browsers.push('ie 11'); 14 | } 15 | 16 | module.exports = { 17 | browsers 18 | }; 19 | -------------------------------------------------------------------------------- /tests/dummy/app/controllers/application.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { computed } from '@ember/object'; 3 | 4 | export default Controller.extend({ 5 | steps: computed(function() { 6 | return [ 7 | { 8 | intro: 'Step 1!', 9 | element: '#step1' 10 | }, 11 | { 12 | intro: 'Step 2!', 13 | element: '#step2' 14 | } 15 | ]; 16 | }) 17 | }); 18 | -------------------------------------------------------------------------------- /tests/dummy/app/app.js: -------------------------------------------------------------------------------- 1 | import Application from '@ember/application'; 2 | import Resolver from './resolver'; 3 | import loadInitializers from 'ember-load-initializers'; 4 | import config from './config/environment'; 5 | 6 | const App = Application.extend({ 7 | modulePrefix: config.modulePrefix, 8 | podModulePrefix: config.podModulePrefix, 9 | Resolver 10 | }); 11 | 12 | loadInitializers(App, config.modulePrefix); 13 | 14 | export default App; 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist/ 5 | /tmp/ 6 | 7 | # dependencies 8 | /bower_components/ 9 | /node_modules/ 10 | 11 | # misc 12 | /.env* 13 | /.pnp* 14 | /.sass-cache 15 | /connect.lock 16 | /coverage/ 17 | /libpeerconnection.log 18 | /npm-debug.log* 19 | /testem.log 20 | /yarn-error.log 21 | 22 | # ember-try 23 | /.node_modules.ember-try/ 24 | /bower.json.ember-try 25 | /package.json.ember-try 26 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist/ 3 | /tmp/ 4 | 5 | # dependencies 6 | /bower_components/ 7 | 8 | # misc 9 | /.bowerrc 10 | /.editorconfig 11 | /.ember-cli 12 | /.env* 13 | /.eslintignore 14 | /.eslintrc.js 15 | /.gitignore 16 | /.template-lintrc.js 17 | /.travis.yml 18 | /.watchmanconfig 19 | /bower.json 20 | /config/ember-try.js 21 | /CONTRIBUTING.md 22 | /ember-cli-build.js 23 | /testem.js 24 | /tests/ 25 | /yarn.lock 26 | .gitkeep 27 | 28 | # ember-try 29 | /.node_modules.ember-try/ 30 | /bower.json.ember-try 31 | /package.json.ember-try 32 | -------------------------------------------------------------------------------- /ember-cli-build.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); 4 | 5 | module.exports = function(defaults) { 6 | let app = new EmberAddon(defaults, { 7 | // Add options here 8 | }); 9 | 10 | /* 11 | This build file specifies the options for the dummy test app of this 12 | addon, located in `/tests/dummy` 13 | This build file does *not* influence how the addon or the app using it 14 | behave. You most likely want to be modifying `./index.js` or app's build file 15 | */ 16 | 17 | return app.toTree(); 18 | }; 19 | -------------------------------------------------------------------------------- /.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 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.js] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | [*.hbs] 21 | indent_style = space 22 | indent_size = 2 23 | 24 | [*.css] 25 | indent_style = space 26 | indent_size = 2 27 | 28 | [*.html] 29 | indent_style = space 30 | indent_size = 2 31 | 32 | [*.{diff,md}] 33 | trim_trailing_whitespace = false 34 | -------------------------------------------------------------------------------- /testem.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | test_page: 'tests/index.html?hidepassed', 3 | disable_watching: true, 4 | launch_in_ci: [ 5 | 'Chrome' 6 | ], 7 | launch_in_dev: [ 8 | 'Chrome' 9 | ], 10 | browser_args: { 11 | Chrome: { 12 | ci: [ 13 | // --no-sandbox is needed when running Chrome inside a container 14 | process.env.CI ? '--no-sandbox' : null, 15 | '--headless', 16 | '--disable-gpu', 17 | '--disable-dev-shm-usage', 18 | '--disable-software-rasterizer', 19 | '--mute-audio', 20 | '--remote-debugging-port=0', 21 | '--window-size=1440,900' 22 | ].filter(Boolean) 23 | } 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How To Contribute 2 | 3 | ## Installation 4 | 5 | * `git clone git@github.com:PoslinskiNet/ember-introjs.git` 6 | * `cd ember-introjs` 7 | * `npm install` 8 | 9 | ## Linting 10 | 11 | * `npm run lint:hbs` 12 | * `npm run lint:js` 13 | * `npm run lint:js -- --fix` 14 | 15 | ## Running tests 16 | 17 | * `ember test` – Runs the test suite on the current Ember version 18 | * `ember test --server` – Runs the test suite in "watch mode" 19 | * `ember try:each` – Runs the test suite against multiple Ember versions 20 | 21 | ## Running the dummy application 22 | 23 | * `ember serve` 24 | * Visit the dummy application at [http://localhost:4200](http://localhost:4200). 25 | 26 | For more information on using ember-cli, visit [https://ember-cli.com/](https://ember-cli.com/). -------------------------------------------------------------------------------- /tests/dummy/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dummy 7 | 8 | 9 | 10 | {{content-for "head"}} 11 | 12 | 13 | 14 | 15 | {{content-for "head-footer"}} 16 | 17 | 18 | {{content-for "body"}} 19 | 20 | 21 | 22 | 23 | {{content-for "body-footer"}} 24 | 25 | 26 | -------------------------------------------------------------------------------- /tests/integration/components/step-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import hbs from 'htmlbars-inline-precompile'; 3 | import { setupRenderingTest } from 'ember-qunit'; 4 | import { render, find } from '@ember/test-helpers'; 5 | 6 | module('Integration | Component | Step', function(hooks) { 7 | setupRenderingTest(hooks); 8 | 9 | test('renders', async function(assert) { 10 | await render(hbs`{{intro-js/step}}`); 11 | 12 | assert.equal(find('div[data-step]').getAttribute('data-step'), '0'); 13 | }); 14 | 15 | test('renders step as a block', async function(assert) { 16 | await render(hbs` 17 | {{#intro-js/step}} 18 | Step content 19 | {{/intro-js/step}} 20 | `); 21 | assert.equal(find('div[data-step]').getAttribute('data-step'), '0'); 22 | }); 23 | }) 24 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const resolve = require('resolve'); 5 | const Funnel = require('broccoli-funnel'); 6 | const mergeTrees = require('broccoli-merge-trees'); 7 | 8 | module.exports = { 9 | name: require('./package').name, 10 | 11 | included(app) { 12 | this._super.included(app); 13 | 14 | app.import('vendor/ember-introjs/intro.min.js', { 15 | using: [ 16 | { transformation: 'amd', as: 'intro-js' } 17 | ] 18 | }); 19 | app.import('vendor/ember-introjs/introjs.min.css'); 20 | }, 21 | 22 | introJsPath() { 23 | return path.dirname(resolve.sync('intro.js', { basedir: __dirname })) 24 | }, 25 | 26 | treeForVendor(tree) { 27 | const introJsTree = new Funnel(this.introJsPath(), { 28 | srcDir: 'minified', 29 | destDir: 'ember-introjs', 30 | files: ['intro.min.js', 'introjs.min.css'] 31 | }); 32 | 33 | return tree ? new mergeTrees([tree, introJsTree]) : introJsTree; 34 | } 35 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 4 | 5 | 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: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | 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. 10 | -------------------------------------------------------------------------------- /tests/integration/test-helpers-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { visit, find } from '@ember/test-helpers'; 3 | import { setupApplicationTest } from 'ember-qunit'; 4 | import { 5 | introJSNext, 6 | introJSPrevious, 7 | introJSExit, 8 | introJSEnsureClosed, 9 | introJSCurrentStep } from './../helpers/ember-introjs'; 10 | 11 | module('test helpers', function(hooks) { 12 | setupApplicationTest(hooks); 13 | 14 | hooks.beforeEach(async function() { 15 | await visit('/'); 16 | }); 17 | 18 | hooks.afterEach(async function() { 19 | return await introJSEnsureClosed(); 20 | }) 21 | 22 | test('can use the next helper', async function(assert) { 23 | await introJSNext(); 24 | 25 | assert.equal(introJSCurrentStep().intro, 'Step 2!'); 26 | }); 27 | 28 | test('can use the exit helper', async function(assert){ 29 | await introJSExit(); 30 | 31 | assert.equal(find('.introjs-overlay'), null); 32 | }); 33 | 34 | test('can use the previous helper', async function(assert){ 35 | await introJSNext(); 36 | await introJSPrevious(); 37 | 38 | assert.equal(introJSCurrentStep().intro, 'Step 1!'); 39 | }); 40 | }) 41 | -------------------------------------------------------------------------------- /tests/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dummy Tests 7 | 8 | 9 | 10 | {{content-for "head"}} 11 | {{content-for "test-head"}} 12 | 13 | 14 | 15 | 16 | 17 | {{content-for "head-footer"}} 18 | {{content-for "test-head-footer"}} 19 | 20 | 21 | {{content-for "body"}} 22 | {{content-for "test-body"}} 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {{content-for "body-footer"}} 31 | {{content-for "test-body-footer"}} 32 | 33 | 34 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parserOptions: { 4 | ecmaVersion: 2018, 5 | sourceType: 'module' 6 | }, 7 | plugins: [ 8 | 'ember' 9 | ], 10 | extends: [ 11 | 'eslint:recommended', 12 | 'plugin:ember/recommended' 13 | ], 14 | env: { 15 | browser: true 16 | }, 17 | rules: { 18 | 'ember/no-on-calls-in-components': 'off', 19 | 'ember/closure-actions': 'off', 20 | 'ember/no-observers': 'off' 21 | }, 22 | overrides: [ 23 | // node files 24 | { 25 | files: [ 26 | '.eslintrc.js', 27 | '.template-lintrc.js', 28 | 'ember-cli-build.js', 29 | 'index.js', 30 | 'testem.js', 31 | 'blueprints/*/index.js', 32 | 'config/**/*.js', 33 | 'tests/dummy/config/**/*.js' 34 | ], 35 | excludedFiles: [ 36 | 'addon/**', 37 | 'addon-test-support/**', 38 | 'app/**', 39 | 'tests/dummy/app/**' 40 | ], 41 | parserOptions: { 42 | sourceType: 'script', 43 | ecmaVersion: 2015 44 | }, 45 | env: { 46 | browser: false, 47 | node: true 48 | }, 49 | plugins: ['node'], 50 | rules: Object.assign({}, require('eslint-plugin-node').configs.recommended.rules, { 51 | 'node/no-extraneous-require': 'off' 52 | }) 53 | } 54 | ] 55 | }; 56 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: node_js 3 | node_js: 4 | # we recommend testing addons with the same minimum supported node version as Ember CLI 5 | # so that your addon works for all apps 6 | - "8" 7 | 8 | sudo: false 9 | dist: trusty 10 | 11 | addons: 12 | chrome: stable 13 | 14 | cache: 15 | directories: 16 | - $HOME/.npm 17 | 18 | env: 19 | global: 20 | # See https://git.io/vdao3 for details. 21 | - JOBS=1 22 | 23 | branches: 24 | only: 25 | - master 26 | # npm version tags 27 | - /^v\d+\.\d+\.\d+/ 28 | 29 | jobs: 30 | fail_fast: true 31 | allow_failures: 32 | - env: EMBER_TRY_SCENARIO=ember-canary 33 | 34 | include: 35 | # runs linting and tests with current locked deps 36 | 37 | - stage: "Tests" 38 | name: "Tests" 39 | script: 40 | # - npm run lint:hbs 41 | - npm run lint:js 42 | - npm test 43 | 44 | # we recommend new addons test the current and previous LTS 45 | # as well as latest stable release (bonus points to beta/canary) 46 | - stage: "Additional Tests" 47 | env: EMBER_TRY_SCENARIO=ember-lts-2.18 48 | - env: EMBER_TRY_SCENARIO=ember-lts-3.4 49 | - env: EMBER_TRY_SCENARIO=ember-release 50 | - env: EMBER_TRY_SCENARIO=ember-beta 51 | - env: EMBER_TRY_SCENARIO=ember-canary 52 | - env: EMBER_TRY_SCENARIO=ember-default-with-jquery 53 | 54 | script: 55 | - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO -------------------------------------------------------------------------------- /tests/dummy/config/environment.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function(environment) { 4 | let ENV = { 5 | modulePrefix: 'dummy', 6 | environment, 7 | rootURL: '/', 8 | locationType: 'auto', 9 | EmberENV: { 10 | FEATURES: { 11 | // Here you can enable experimental features on an ember canary build 12 | // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true 13 | }, 14 | EXTEND_PROTOTYPES: { 15 | // Prevent Ember Data from overriding Date.parse. 16 | Date: false 17 | } 18 | }, 19 | 20 | APP: { 21 | // Here you can pass flags/options to your application instance 22 | // when it is created 23 | } 24 | }; 25 | 26 | if (environment === 'development') { 27 | // ENV.APP.LOG_RESOLVER = true; 28 | // ENV.APP.LOG_ACTIVE_GENERATION = true; 29 | // ENV.APP.LOG_TRANSITIONS = true; 30 | // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; 31 | // ENV.APP.LOG_VIEW_LOOKUPS = true; 32 | } 33 | 34 | if (environment === 'test') { 35 | // Testem prefers this... 36 | ENV.locationType = 'none'; 37 | 38 | // keep test console output quieter 39 | ENV.APP.LOG_ACTIVE_GENERATION = false; 40 | ENV.APP.LOG_VIEW_LOOKUPS = false; 41 | 42 | ENV.APP.rootElement = '#ember-testing'; 43 | ENV.APP.autoboot = false; 44 | } 45 | 46 | if (environment === 'production') { 47 | // here you can enable a production-specific feature 48 | } 49 | 50 | return ENV; 51 | }; 52 | -------------------------------------------------------------------------------- /addon/components/step.js: -------------------------------------------------------------------------------- 1 | import { readOnly } from '@ember/object/computed'; 2 | import Component from '@ember/component'; 3 | 4 | export default Component.extend({ 5 | // Optionally define the number (priority) of step 6 | step: 0, 7 | 8 | // The tooltip text of step 9 | intro: null, 10 | 11 | // Optionally define a CSS class for tooltip 12 | tooltipClass: null, 13 | 14 | // Optionally append a CSS class to the helperLayer 15 | highlightClass: null, 16 | 17 | // Optionally define the position of tooltip, top, left, right, 18 | // bottom, bottom-left-aligned (same as bottom), bottom-middle-aligned, 19 | // bottom-right-aligned or auto (to detect the position of element 20 | // and assign the correct position automatically). Default is bottom 21 | position: 'bottom', 22 | 23 | // The tooltip text of hint 24 | hint: null, 25 | 26 | // Optionally define the position of hint. Options: top-middle, top-left, 27 | // top-right, bottom-left, bottom-right, bottom-middle, 28 | // middle-left, middle-right, middle-middle. Default: top-middle 29 | hintPosition: 'top-middle', 30 | 31 | // PRIVATE interface - INTRO JS implementation 32 | 33 | attributeBindings: [ 34 | 'data-step', 35 | 'data-intro', 36 | 'data-position', 37 | 'data-tooltipClass', 38 | 'data-highlightClass', 39 | 'data-hint', 40 | 'data-hintPosition' 41 | ], 42 | 43 | 'data-step': readOnly('step'), 44 | 45 | 'data-hint': readOnly('hint'), 46 | 'data-intro': readOnly('intro'), 47 | 48 | 'data-tooltipClass': readOnly('tooltipClass'), 49 | 'data-highlightClass': readOnly('highlightClass'), 50 | 51 | 'data-position': readOnly('position'), 52 | 'data-hintPosition': readOnly('hintPosition'), 53 | }); 54 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ember-introjs", 3 | "version": "2.7.0", 4 | "description": "An Ember Component for intro.js", 5 | "keywords": [ 6 | "ember-addon", 7 | "intro.js", 8 | "ember-intro", 9 | "ember", 10 | "intro" 11 | ], 12 | "repository": "https://github.com/poslinskinet/ember-introjs/", 13 | "license": "MIT", 14 | "author": "", 15 | "directories": { 16 | "doc": "doc", 17 | "test": "tests" 18 | }, 19 | "scripts": { 20 | "build": "ember build", 21 | "lint:hbs": "ember-template-lint .", 22 | "lint:js": "eslint .", 23 | "start": "ember serve", 24 | "test": "ember test", 25 | "test:all": "ember try:each" 26 | }, 27 | "dependencies": { 28 | "broccoli-funnel": "2.0.2", 29 | "ember-cli-babel": "7.18.0", 30 | "broccoli-merge-trees": "4.2.0", 31 | "intro.js": "2.9.3" 32 | }, 33 | "devDependencies": { 34 | "@ember/optional-features": "^1.0.0", 35 | "broccoli-asset-rev": "3.0.0", 36 | "ember-cli": "~3.16.0", 37 | "ember-cli-dependency-checker": "3.2.0", 38 | "ember-cli-eslint": "5.1.0", 39 | "ember-cli-fastboot": "2.2.1", 40 | "ember-cli-htmlbars": "4.3.1", 41 | "ember-cli-htmlbars-inline-precompile": "3.0.0", 42 | "ember-cli-inject-live-reload": "2.0.2", 43 | "ember-cli-qunit": "4.4.0", 44 | "ember-cli-shims": "1.2.0", 45 | "ember-cli-sri": "2.1.1", 46 | "ember-cli-template-lint": "^2.0.0", 47 | "ember-cli-uglify": "3.0.0", 48 | "ember-disable-prototype-extensions": "1.1.3", 49 | "ember-export-application-global": "2.0.0", 50 | "ember-load-initializers": "^2.0.0", 51 | "ember-maybe-import-regenerator": "^0.1.6", 52 | "ember-qunit": "^4.4.1", 53 | "ember-resolver": "8.0.0", 54 | "ember-source": "~3.17.0", 55 | "ember-source-channel-url": "^2.0.1", 56 | "ember-template-lint": "^2.0.0", 57 | "ember-try": "^1.2.1", 58 | "eslint-plugin-ember": "^7.0.0", 59 | "eslint-plugin-node": "^11.0.0", 60 | "loader.js": "4.7.0", 61 | "qunit-dom": "^1.0.0" 62 | }, 63 | "fastbootDependencies": [ 64 | "introJs" 65 | ], 66 | "engines": { 67 | "node": "8.* || >= 10.*" 68 | }, 69 | "ember-addon": { 70 | "configPath": "tests/dummy/config" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /config/ember-try.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const getChannelURL = require('ember-source-channel-url'); 4 | 5 | module.exports = function() { 6 | return Promise.all([ 7 | getChannelURL('release'), 8 | getChannelURL('beta'), 9 | getChannelURL('canary') 10 | ]).then((urls) => { 11 | return { 12 | scenarios: [ 13 | { 14 | name: 'ember-lts-2.18', 15 | env: { 16 | EMBER_OPTIONAL_FEATURES: JSON.stringify({ 'jquery-integration': true }) 17 | }, 18 | npm: { 19 | devDependencies: { 20 | '@ember/jquery': '^0.5.1', 21 | 'ember-source': '~2.18.0' 22 | } 23 | } 24 | }, 25 | { 26 | name: 'ember-lts-3.4', 27 | npm: { 28 | devDependencies: { 29 | 'ember-source': '~3.4.0' 30 | } 31 | } 32 | }, 33 | { 34 | name: 'ember-release', 35 | npm: { 36 | devDependencies: { 37 | 'ember-source': urls[0] 38 | } 39 | } 40 | }, 41 | { 42 | name: 'ember-beta', 43 | npm: { 44 | devDependencies: { 45 | 'ember-source': urls[1] 46 | } 47 | } 48 | }, 49 | { 50 | name: 'ember-canary', 51 | npm: { 52 | devDependencies: { 53 | 'ember-source': urls[2] 54 | } 55 | } 56 | }, 57 | // The default `.travis.yml` runs this scenario via `npm test`, 58 | // not via `ember try`. It's still included here so that running 59 | // `ember try:each` manually or from a customized CI config will run it 60 | // along with all the other scenarios. 61 | { 62 | name: 'ember-default', 63 | npm: { 64 | devDependencies: {} 65 | } 66 | }, 67 | { 68 | name: 'ember-default-with-jquery', 69 | env: { 70 | EMBER_OPTIONAL_FEATURES: JSON.stringify({ 71 | 'jquery-integration': true 72 | }) 73 | }, 74 | npm: { 75 | devDependencies: { 76 | '@ember/jquery': '^0.5.1' 77 | } 78 | } 79 | } 80 | ] 81 | }; 82 | }); 83 | }; 84 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Code of Conduct 2 | 3 | As contributors and maintainers of this project, and in the interest of 4 | fostering an open and welcoming community, we pledge to respect all people who 5 | contribute through reporting issues, posting feature requests, updating 6 | documentation, submitting pull requests or patches, and other activities. 7 | 8 | We are committed to making participation in this project a harassment-free 9 | experience for everyone, regardless of level of experience, gender, gender 10 | identity and expression, sexual orientation, disability, personal appearance, 11 | body size, race, ethnicity, age, religion, or nationality. 12 | 13 | Examples of unacceptable behavior by participants include: 14 | 15 | * The use of sexualized language or imagery 16 | * Personal attacks 17 | * Trolling or insulting/derogatory comments 18 | * Public or private harassment 19 | * Publishing other's private information, such as physical or electronic 20 | addresses, without explicit permission 21 | * Other unethical or unprofessional conduct 22 | 23 | Project maintainers have the right and responsibility to remove, edit, or 24 | reject comments, commits, code, wiki edits, issues, and other contributions 25 | that are not aligned to this Code of Conduct, or to ban temporarily or 26 | permanently any contributor for other behaviors that they deem inappropriate, 27 | threatening, offensive, or harmful. 28 | 29 | By adopting this Code of Conduct, project maintainers commit themselves to 30 | fairly and consistently applying these principles to every aspect of managing 31 | this project. Project maintainers who do not follow or enforce the Code of 32 | Conduct may be permanently removed from the project team. 33 | 34 | This Code of Conduct applies both within project spaces and in public spaces 35 | when an individual is representing the project or its community. 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 38 | reported by contacting a project maintainer at code-of-conduct@frontside.io. All 39 | complaints will be reviewed and investigated and will result in a response that 40 | is deemed necessary and appropriate to the circumstances. Maintainers are 41 | obligated to maintain confidentiality with regard to the reporter of an 42 | incident. 43 | 44 | 45 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 46 | version 1.3.0, available at 47 | [http://contributor-covenant.org/version/1/3/0/][version] 48 | 49 | [homepage]: http://contributor-covenant.org 50 | [version]: http://contributor-covenant.org/version/1/3/0/ 51 | -------------------------------------------------------------------------------- /tests/helpers/ember-introjs.js: -------------------------------------------------------------------------------- 1 | import { on } from '@ember/object/evented'; 2 | 3 | import IntroJSComponent from 'ember-introjs/components/intro-js'; 4 | import { click, waitUntil } from '@ember/test-helpers'; 5 | 6 | let nextCompleted = false; 7 | let currentStep; 8 | let introJS; 9 | 10 | const _checkNextCompleted = async() => { 11 | if (!nextCompleted) { 12 | return await _checkNextCompleted(); 13 | } else { 14 | nextCompleted = false; 15 | } 16 | } 17 | 18 | const _checkExitCompleted = async() => { 19 | const overlay = document.querySelector('.introjs-overlay'); 20 | 21 | if (overlay !== null) { 22 | return await waitUntil(() => document.querySelectorAll('.introjs-overlay').length === 0); 23 | } 24 | } 25 | 26 | /** 27 | * Skip the intro 28 | */ 29 | const introJSSkip = () => { 30 | return click(document.querySelector('.introjs-skipbutton')); 31 | }; 32 | 33 | /** 34 | * Goes to the next step of the intro 35 | */ 36 | const introJSNext = async() => { 37 | await click(document.querySelector('.introjs-nextbutton')); 38 | return _checkNextCompleted(); 39 | }; 40 | 41 | /** 42 | * Goes to the previous step of the intro 43 | */ 44 | const introJSPrevious = async() => { 45 | await click(document.querySelector('.introjs-prevbutton')); 46 | return _checkNextCompleted(); 47 | }; 48 | 49 | /** 50 | * Exits the intro 51 | */ 52 | const introJSExit = async() => { 53 | await click(document.querySelector('.introjs-skipbutton')); 54 | return _checkExitCompleted(); 55 | }; 56 | 57 | /** 58 | * Force exit of the intro 59 | */ 60 | const introJSEnsureClosed = () => { 61 | if (introJS) { 62 | introJS.exit(); 63 | return _checkExitCompleted(); 64 | } 65 | 66 | return; 67 | }; 68 | 69 | /** 70 | * Current step of the intro 71 | */ 72 | const introJSCurrentStep = function() { 73 | return currentStep; 74 | }; 75 | 76 | IntroJSComponent.reopen({ 77 | _setIntroJS(_introJS) { 78 | introJS = _introJS; 79 | this._super(introJS); 80 | }, 81 | 82 | _onExit(){ 83 | this._super(); 84 | }, 85 | 86 | _onAfterChange(targetElement){ 87 | nextCompleted = true; 88 | this._super(targetElement); 89 | }, 90 | 91 | _setCurrentStep(step){ 92 | this._super(step); 93 | currentStep = this.get('currentStep'); 94 | }, 95 | 96 | stopWatchingTestVars: on('willDestroyElement', function(){ 97 | introJS = null; 98 | }) 99 | }); 100 | 101 | export { 102 | introJSSkip, 103 | introJSNext, 104 | introJSPrevious, 105 | introJSExit, 106 | introJSEnsureClosed, 107 | introJSCurrentStep, 108 | IntroJSComponent 109 | }; 110 | -------------------------------------------------------------------------------- /tests/unit/components/step-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | 4 | module('Unit | Component | Step', function(hooks) { 5 | setupTest(hooks); 6 | 7 | module('Step', function(){ 8 | test('does render with 0 as default', function(assert) { 9 | let component = this.owner.factoryFor('component:intro-js/step').create(); 10 | assert.equal(component.get('data-step'), '0'); 11 | }); 12 | 13 | test('does render with a custom value', function(assert) { 14 | let component = this.owner.factoryFor('component:intro-js/step').create({ step: 4 }); 15 | assert.equal(component.get('data-step'), '4'); 16 | }); 17 | }); 18 | 19 | module('Intro', function() { 20 | test('does render with a custom value', function(assert) { 21 | let component = this.owner.factoryFor('component:intro-js/step').create({ intro: 'My text' }); 22 | assert.equal(component.get('data-intro'), 'My text'); 23 | }); 24 | }); 25 | 26 | module('Tooltip class', function() { 27 | test('does render with a custom value', function(assert) { 28 | let component = this.owner.factoryFor('component:intro-js/step').create({ tooltipClass: 'my-class' }); 29 | assert.equal(component.get('data-tooltipClass'), 'my-class'); 30 | }); 31 | }); 32 | 33 | module('Highlight class', function() { 34 | test('does render with a custom value', function(assert) { 35 | let component = this.owner.factoryFor('component:intro-js/step').create({ highlightClass: 'my-class' }); 36 | assert.equal(component.get('data-highlightClass'), 'my-class'); 37 | }); 38 | }); 39 | 40 | module('Position', function() { 41 | test('does render with bottom as default', function(assert) { 42 | let component = this.owner.factoryFor('component:intro-js/step').create(); 43 | assert.equal(component.get('data-position'), 'bottom'); 44 | }); 45 | 46 | test('does render with a custom value', function(assert) { 47 | let component = this.owner.factoryFor('component:intro-js/step').create({ position: 'top' }); 48 | assert.equal(component.get('data-position'), 'top'); 49 | }); 50 | }); 51 | 52 | module('Hint', function() { 53 | test('does render with a custom value', function(assert) { 54 | let component = this.owner.factoryFor('component:intro-js/step').create({ hint: 'My text' }); 55 | assert.equal(component.get('data-hint'), 'My text'); 56 | }); 57 | }); 58 | 59 | module('Hint position', function() { 60 | test('does render with top-middle as default', function(assert) { 61 | let component = this.owner.factoryFor('component:intro-js/step').create(); 62 | assert.equal(component.get('data-hintPosition'), 'top-middle'); 63 | }); 64 | 65 | test('does render with a custom value', function(assert) { 66 | let component = this.owner.factoryFor('component:intro-js/step').create({ hintPosition: 'top' }); 67 | assert.equal(component.get('data-hintPosition'), 'top'); 68 | }); 69 | }); 70 | }); 71 | -------------------------------------------------------------------------------- /tests/integration/components/intro-js-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import hbs from 'htmlbars-inline-precompile'; 3 | import { setupRenderingTest } from 'ember-qunit'; 4 | import { render, waitUntil, find, findAll } from '@ember/test-helpers'; 5 | import { introJSNext, introJSSkip } from './../../helpers/ember-introjs' 6 | 7 | module('Integration | Component | intro js', function(hooks) { 8 | setupRenderingTest(hooks); 9 | 10 | hooks.beforeEach(function() { 11 | const fixture = document.createElement('div'); 12 | this.element.appendChild(fixture); 13 | 14 | const steps = [ 15 | { 16 | element: '#step1', 17 | intro: 'Step 1' 18 | }, 19 | { 20 | element: '#step2', 21 | intro: 'Step 2' 22 | } 23 | ]; 24 | 25 | this.set('fixture', fixture); 26 | this.set('steps', steps); 27 | }); 28 | 29 | hooks.afterEach(function() { 30 | if (this.element) { 31 | this.element.removeChild(this.element.lastChild); 32 | } 33 | }) 34 | 35 | module('start-if', function() { 36 | test('when start-if is falsy does not render the introjs component', async function(assert) { 37 | assert.expect(1); 38 | 39 | this.set('startIf', false); 40 | 41 | await render(hbs`{{intro-js steps=steps start-if=startIf}}`); 42 | 43 | assert.equal(find('.introjs-overlay'), null); 44 | }); 45 | 46 | test('when start-if changes to truthy renders introJS', async function(assert) { 47 | assert.expect(2); 48 | 49 | this.set('startIf', false); 50 | 51 | await render(hbs`{{intro-js steps=steps start-if=startIf}}`); 52 | 53 | assert.equal(find('.introjs-overlay'), null); 54 | 55 | this.set('startIf', true); 56 | 57 | assert.ok(document.querySelector('.introjs-overlay')); 58 | }); 59 | 60 | test('when start-if changes to falsy hides introJS', async function(assert) { 61 | assert.expect(1); 62 | 63 | this.set('startIf', true); 64 | 65 | await render(hbs`{{intro-js steps=steps start-if=startIf}}`); 66 | 67 | 68 | this.set('startIf', false); 69 | 70 | await waitUntil(() => findAll('.introjs-overlay').length === 0); 71 | 72 | assert.equal(find('.introjs-overlay'), null); 73 | }); 74 | }); 75 | 76 | module('when exiting', function() { 77 | 78 | test('fires the on-before-exit action', async function(assert) { 79 | assert.expect(2); 80 | 81 | this.set('onBeforeExit', (step) => { 82 | assert.equal(step, this.steps[0]) 83 | }); 84 | 85 | await render(hbs`{{intro-js steps=steps start-if=true on-before-exit=(action onBeforeExit)}}`); 86 | 87 | await introJSSkip(); 88 | }); 89 | 90 | test('fires the on-exit action', async function(assert) { 91 | assert.expect(3); 92 | 93 | this.set('myExit', (step) => { 94 | assert.equal(step, this.steps[0]) 95 | }); 96 | 97 | await render(hbs`{{intro-js steps=steps start-if=true on-exit=(action myExit)}}`); 98 | 99 | await introJSSkip(); 100 | }); 101 | }); 102 | 103 | module('when skiping', function() { 104 | test('fires the on-skip action', async function(assert) { 105 | assert.expect(1); 106 | 107 | this.set('onSkip', (step) => { 108 | assert.equal(step, this.steps[0]) 109 | }); 110 | 111 | await render(hbs`{{intro-js steps=steps start-if=true on-skip=(action onSkip)}}`); 112 | 113 | await introJSSkip(); 114 | }) 115 | }); 116 | 117 | module('when completing', function() { 118 | test('fires the on-complete action', async function(assert) { 119 | assert.expect(1); 120 | 121 | this.set('myComplete', (step) => { 122 | assert.equal(step, this.steps[1]) 123 | }); 124 | 125 | await render(hbs`{{intro-js steps=steps start-if=true on-complete=(action myComplete)}}`); 126 | 127 | await introJSNext(); 128 | 129 | await introJSSkip(); 130 | }) 131 | }); 132 | 133 | module('when going to the next step', function() { 134 | test('fires the on-before-change action', async function(assert) { 135 | assert.expect(4); 136 | this.set('beforeChange', (currentStep, nextStep, component, step2div) => { 137 | assert.equal(currentStep, this.steps[0]); 138 | assert.equal(nextStep, this.steps[1]); 139 | assert.notEqual(component.introJS, undefined); 140 | assert.ok(step2div); 141 | }); 142 | 143 | await render(hbs`{{intro-js steps=steps start-if=true on-before-change=(action beforeChange)}}`); 144 | 145 | await introJSSkip(); 146 | }); 147 | 148 | test('fires the on-after-change action', async function(assert) { 149 | assert.expect(3); 150 | this.set('afterChange', (nextStep, component, step2div) => { 151 | 152 | assert.equal(nextStep, this.steps[1]); 153 | assert.notEqual(component.introJS, undefined); 154 | assert.ok(step2div); 155 | }); 156 | 157 | await render(hbs`{{intro-js steps=steps start-if=true on-after-change=(action afterChange)}}`); 158 | 159 | await introJSSkip(); 160 | }); 161 | 162 | test('fires the on-change action', async function(assert) { 163 | assert.expect(3); 164 | this.set('onChange', (nextStep, component, step2div) => { 165 | 166 | assert.equal(nextStep, this.steps[1]); 167 | assert.notEqual(component.introJS, undefined); 168 | assert.ok(step2div); 169 | }); 170 | 171 | await render(hbs`{{intro-js steps=steps start-if=true on-change=(action onChange)}}`); 172 | 173 | await introJSSkip(); 174 | }) 175 | }) 176 | }); 177 | -------------------------------------------------------------------------------- /addon/components/intro-js.js: -------------------------------------------------------------------------------- 1 | import { A } from '@ember/array'; 2 | import { camelize, underscore } from '@ember/string'; 3 | import { scheduleOnce, bind } from '@ember/runloop'; 4 | import { observer, computed } from '@ember/object'; 5 | import { on } from '@ember/object/evented'; 6 | import Component from '@ember/component'; 7 | import introJS from 'intro-js' 8 | 9 | let INTRO_JS_OPTIONS = [ 10 | 'next-label', 11 | 'prev-label', 12 | 'skip-label', 13 | 'done-label', 14 | 'tooltip-position', 15 | 'tooltip-class', 16 | 'highlightClass', 17 | 'exit-on-esc', 18 | 'exit-on-overlay-click', 19 | 'show-step-numbers', 20 | 'show-step-numbers', 21 | 'keyboard-navigation', 22 | 'show-buttons', 23 | 'show-bullets', 24 | 'show-progress', 25 | 'scroll-to-element', 26 | 'overlay-opacity', 27 | 'disable-interaction', 28 | 'helper-element-padding' 29 | ]; 30 | 31 | export default Component.extend({ 32 | 33 | setupIntroJS: on('didInsertElement', observer('start-if', function() { 34 | scheduleOnce('afterRender', this, this.startIntroJS); 35 | })), 36 | 37 | /** 38 | * Options passed to IntroJS. You can specify the options when using the 39 | * Handlebars helper: 40 | * 41 | * ```handlebars 42 | * {{intro-js steps=steps show-bullets=true}} 43 | * ``` 44 | * 45 | * Or you could extend your own base class to override defaults 46 | * instead of specifying them every time in the Handlebars helper: 47 | * 48 | * ```javascript 49 | * myapp/app/components/my-intro-js.js 50 | * 51 | * import IntroJSComponent from 'ember-introjs/components/intro-js'; 52 | * 53 | * export default IntroJSComponent.extend({ 54 | * 'exit-on-esc': true 55 | * }); 56 | * ``` 57 | * 58 | * You can also reopen the class: 59 | * 60 | * ```javascript 61 | * import IntroJSComponent from 'ember-introjs/components/intro-js'; 62 | * 63 | * IntroJSComponent.reopen({ 64 | * 'exit-on-esc': true 65 | * }); 66 | * ``` 67 | * 68 | * @property 69 | */ 70 | introJSOptions: computed( 71 | 'next-label', 72 | 'prev-label', 73 | 'skip-label', 74 | 'done-label', 75 | 'tooltip-position', 76 | 'tooltip-class', 77 | 'highlightClass', 78 | 'exit-on-esc', 79 | 'exit-on-overlay-click', 80 | 'show-step-numbers', 81 | 'keyboard-navigation', 82 | 'show-buttons', 83 | 'show-bullets', 84 | 'show-progress', 85 | 'scroll-to-element', 86 | 'overlay-opacity', 87 | 'disable-interaction', 88 | 'helper-element-padding', 89 | 'steps', 90 | 91 | function(){ 92 | let option, normalizedName, value, options = {}; 93 | 94 | for(let i = 0; i < INTRO_JS_OPTIONS.length; i++){ 95 | option = INTRO_JS_OPTIONS[i]; 96 | normalizedName = camelize(underscore(option)); 97 | value = this.get(option); 98 | 99 | if (value !== null && value !== undefined) { 100 | options[normalizedName] = value; 101 | } 102 | } 103 | 104 | options.steps = this.get('steps'); 105 | 106 | return options; 107 | } 108 | ), 109 | 110 | willDestroyElement() { 111 | let intro = this.get('introJS'); 112 | if (intro) { 113 | intro.exit(); 114 | } 115 | 116 | this._super(...arguments); 117 | }, 118 | 119 | startIntroJS(){ 120 | if (!this.get('introJS')) { 121 | this._setIntroJS(introJS()); 122 | } 123 | let intro = this.get('introJS'); 124 | let options = this.get('introJSOptions'); 125 | 126 | if (this.get('start-if')){ 127 | intro.setOptions(options); 128 | this.registerCallbacksWithIntroJS(); 129 | this._setCurrentStep(0); 130 | 131 | intro.start(); 132 | } else { 133 | intro.exit(); 134 | this._setIntroJS(null); 135 | } 136 | }, 137 | 138 | registerCallbacksWithIntroJS(){ 139 | let intro = this.get('introJS'); 140 | 141 | intro.onbeforechange(bind(this, this._onBeforeChange)); 142 | intro.onchange(bind(this, this._onChange)); 143 | intro.onafterchange(bind(this, this._onAfterChange)); 144 | intro.oncomplete(bind(this, this._onComplete)); 145 | intro.onexit(bind(this, this._onExit)); 146 | intro.onskip(bind(this, this._onSkip)); 147 | intro.onbeforeexit(bind(this, this._onBeforeExit)); 148 | }, 149 | 150 | _setIntroJS(introJS){ 151 | this.set('introJS', introJS); 152 | }, 153 | 154 | _sendAction(action, args) { 155 | if (this.get(action)) { 156 | this.get(action)(...args); 157 | } 158 | }, 159 | 160 | _onBeforeChange(elementOfNewStep) { 161 | let prevStep = this.get('currentStep'); 162 | let currentStepIndex = this.get('introJS._currentStep'); 163 | this._setCurrentStep(currentStepIndex); 164 | let nextStep = this._getStep(++currentStepIndex); 165 | 166 | this._sendAction('on-before-change', [prevStep, nextStep, this, elementOfNewStep]); 167 | }, 168 | 169 | _onChange(targetElement) { 170 | this._sendAction('on-change', [this._getNextStep(), this, targetElement]); 171 | }, 172 | 173 | _onAfterChange(targetElement){ 174 | this._sendAction('on-after-change', [this._getNextStep(), this, targetElement]); 175 | }, 176 | 177 | _onExit(){ 178 | this._sendAction('on-exit', [this.get('currentStep'), this]); 179 | }, 180 | 181 | _onSkip(){ 182 | this._sendAction('on-skip', [this.get('currentStep'), this]); 183 | }, 184 | 185 | _onComplete() { 186 | this._sendAction('on-complete', [this.get('currentStep')]); 187 | }, 188 | 189 | _onBeforeExit() { 190 | this._sendAction('on-before-exit', [this.get('currentStep'), this]); 191 | }, 192 | 193 | _setCurrentStep(step){ 194 | this.set('currentStep', this._getStep(step)); 195 | }, 196 | 197 | _getNextStep() { 198 | return this._getStep(this.get('introJS._currentStep') + 1); 199 | }, 200 | 201 | _getStep(step) { 202 | return A(this.get('steps')).objectAt(step); 203 | } 204 | }); 205 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Ember Custom Actions Logo 3 |

4 | 5 | [![Build Status](https://api.travis-ci.org/PoslinskiNet/ember-introjs.svg?branch=master)](http://travis-ci.org/PoslinskiNet/ember-introjs) 6 | [![Greenkeeper badge](https://badges.greenkeeper.io/PoslinskiNet/ember-introjs.svg)](https://greenkeeper.io/) 7 | [![Ember Observer Score](https://emberobserver.com/badges/ember-pell.svg)](https://emberobserver.com/addons/ember-pell) 8 | [![NPM package info for ember-introjs](https://img.shields.io/npm/dm/ember-introjs.svg)](http://npmjs.com/package/ember-introjs)   [![License info](https://img.shields.io/npm/l/ember-introjs.svg)](http://npmjs.com/package/ember-introjs) 9 | 10 | Ember IntroJS wraps [introjs][intro-js] in an Ember Component to guide 11 | users through your app. 12 | 13 | 14 | Compatibility 15 | ------------------------------------------------------------------------------ 16 | 17 | * Ember.js v2.18 or above 18 | * Ember CLI v2.13 or above 19 | * Node.js v8 or above 20 | 21 | 22 | Installation 23 | ------------------------------------------------------------------------------ 24 | 25 | `ember install ember-introjs` 26 | 27 | ## Usage 28 | 29 | ### 1st option (recommended) 30 | #### Use `intro-js/step` component as a wrapper 31 | 32 | ```handlebars 33 | {{#intro-js/step step=1 intro="Step Component"}} 34 |

Hello!

35 | {{/intro-js/step}} 36 | ``` 37 | 38 | You can customize wrapper using: 39 | - `position="top"` 40 | - `intro="Welcome!"` 41 | - `tooltipClass="tooltip-class"` 42 | - `highlightClass="highlight-class"` 43 | - `position="top"` 44 | - `hint="Use it :)"` 45 | - `hintPosition="bottom-left"` 46 | 47 | Options are documented in the code as well as in [IntroJS Docs](http://introjs.com/docs) 48 | 49 | ### 2nd option 50 | #### 1. Declare your steps: 51 | You can declare an array in JavaScript in your controller or parent component: 52 | 53 | ```javascript 54 | // app/controllers/ticket.js 55 | import Controller from '@ember/controller'; 56 | import { computed } from '@ember/object'; 57 | 58 | export default Controller.extend({ 59 | steps: computed(function() { 60 | return [ 61 | { 62 | element: $('#step1'), 63 | intro: 'Step 1!' 64 | }, 65 | { 66 | element: $('#step2'), 67 | intro: 'Step2!' 68 | } 69 | ]; 70 | }) 71 | }); 72 | ``` 73 | 74 | ### 2. Use `intro-js` component 75 | Then to use the steps, you can use the steps in your handlebars template: 76 | 77 | ```handlebars 78 | {{! app/templates/ticket }} 79 | {{intro-js start-if=true}} 80 | ``` 81 | 82 | ## Action Hooks 83 | 84 | IntroJS supports a series of hooks for getting notified for when users switch between steps or exit. You can subscribe to these actions using the typical `actions` hash in your Route or Controller: 85 | 86 | ```javascript 87 | // app/routes/ticket.js 88 | import Ember from 'ember'; 89 | 90 | export default Ember.Route.extend({ 91 | actions: { 92 | introBeforeChange(previousStep, nextStep, introJSComponent, 93 | elementOfNewStep){ 94 | // You could track user interactions here, e.g. analytics. 95 | this.sendAnalytics(prevStep); 96 | } 97 | } 98 | }); 99 | ``` 100 | 101 | Then pass the name of the action in the handlebars helper that renders 102 | the component below. 103 | 104 | ```handlebars 105 | {{intro-js steps=steps start-if=true on-before-change=(action "introBeforeChange")}} 106 | ``` 107 | 108 | ### on-before-change (currentStep, nextStep, introJSComponent, nextElement) 109 | 110 | Called when the user clicks next (or uses their keyboard). Called before 111 | `on-change`. Given the currentStep, the nextStep, the introJSComponent, 112 | and the DOM element of the next step. 113 | 114 | ### on-change (step, introJSComponent, currentElement) 115 | 116 | Called after `on-before-change` when the user moves a step (backwards or 117 | forward) in the introduction. Gives the current step, the introJS 118 | component isntance, and the element of the current step. 119 | 120 | ### on-after-change (step, introJSComponent, currentElement) 121 | 122 | Called after `on-change` when the user moves a step (backwards or 123 | forward) in the introduction. Gives the current step, the introJS 124 | component isntance, and the element of the current step. 125 | 126 | ### on-before-exit (step, introJSComponent) 127 | 128 | Called when the user quits the intro via the "Skip" button, hitting 129 | `escape`, or clicking outside the overlay. Given the current step, and 130 | the introJS component. 131 | 132 | ### on-exit (step, introJSComponent) 133 | 134 | Called after `on-before-exit` when the user quits the intro via the "Skip" button, hitting 135 | `escape`, or clicking outside the overlay. Given the current step, and 136 | the introJS component. 137 | 138 | ### on-complete (step, introJSComponent) 139 | 140 | Called when the user finishes the intro by clicking "Done" or hitting 141 | right on the keyboard until the end. Called with the last step and the 142 | introJS component instance. 143 | 144 | ## Intro JS Options 145 | 146 | Intro JS has a variety of options available to it. You can see the full 147 | list [here](https://github.com/usablica/intro.js#options), but we also 148 | provided the full list below. You'll notice that in the list below 149 | options all follow the dasherized convention of HTML and ember-cli 150 | filenames. The original list uses camelCase names, and so does IntroJS. 151 | Ember IntroJS will do the conversion for you. 152 | 153 | You can also set other options using the Handlebars helper syntax: 154 | ` 155 | ```handlebars 156 | {{intro-js steps=steps show-bullets=true}} 157 | ``` 158 | 159 | Or you could extend your own base class to override defaults 160 | instead of specifying them every time in the Handlebars helper: 161 | 162 | ```javascript 163 | myapp/app/components/my-intro-js.js 164 | import IntroJSComponent from 'ember-introjs/components/intro-js'; 165 | 166 | export default IntroJSComponent.extend({ 167 | 'exit-on-esc': true 168 | }); 169 | ``` 170 | 171 | You can also reopen the class: 172 | 173 | ```javascript 174 | import IntroJSComponent from 'ember-introjs/components/intro-js'; 175 | 176 | IntroJSComponent.reopen({ 177 | 'exit-on-esc': true 178 | }); 179 | ``` 180 | 181 | | property | description | 182 | |---|---| 183 | | `steps` | For defining steps using JSON configuration (see [this](https://github.com/usablica/intro.js/blob/master/example/programmatic/index.html) example) | 184 | | `next-label` | Next button label | 185 | | `prev-label` | Previous button label | 186 | | `skip-label` | Skip button label | 187 | | `done-label` | Done button label | 188 | | `tooltip-position` | Default tooltip position | 189 | | `tooltip-class` | Adding CSS class to all tooltips | 190 | | `highlight-class` | Additional CSS class for the helperLayer | 191 | | `exit-on-esc` | Exit introduction when pressing Escape button, `true` or `false` | 192 | | `exit-on-overlay-click` | Exit introduction when clicking on overlay layer, `true` or `false` | 193 | | `show-step-numbers` | Show steps number in the red circle or not, `true` or `false` | 194 | | `keyboard-navigation` | Navigating with keyboard or not, `true` or `false` | 195 | | `show-buttons` | Show introduction navigation buttons or not, `true` or `false` | 196 | | `show-bullets` | Show introduction bullets or not, `true` or `false` | 197 | | `show-progress` | Show introduction progress or not, `true` or `false` | 198 | | `scroll-to-element` | Auto scroll to highlighted element if it's outside of viewport, `true` or `false` | 199 | | `overlay-opacity` | Adjust the overlay opacity, `Number` | 200 | | `disable-interaction` | Disable an interaction inside element or not, `true` or `false` | 201 | | `helper-element-padding` | Set how much padding to be used around helper element | 202 | 203 | See [setOption](https://github.com/usablica/intro.js/#introjssetoptionoption-value) to see an example. 204 | 205 | ### Testing Helpers 206 | 207 | Ember IntroJS comes with a set of testing helpers. 208 | 209 | To use them, first import them in your `tests/test-helper.js` file: 210 | 211 | ```javascript 212 | // tests/test-helpers.js 213 | import './helpers/ember-introjs'; 214 | ``` 215 | 216 | License 217 | ------------------------------------------------------------------------------ 218 | 219 | See the LICENSE file included in this repository. 220 | 221 | Keep in mind that if you like to use Intro.JS for commercial use, you should buy a commercial license. You can find more information on the intro.js project site: https://introjs.com/#commercial 222 | 223 | 224 | [intro-js]: https://github.com/usablica/intro.js/ 225 | [hooks]: https://github.com/usablica/intro.js#introjsstart 226 | 227 | Contributing 228 | ------------------------------------------------------------------------------ 229 | 230 | See the [Contributing](CONTRIBUTING.md) guide for details. 231 | 232 | ## Code of Conduct 233 | Please note that this project is released with a Contributor Code of 234 | Conduct. By participating in this project you agree to abide by its 235 | terms, which can be found in the `CODE_OF_CONDUCT.md` file in this 236 | repository. 237 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [v2.7.0](https://github.com/PoslinskiNet/ember-introjs/tree/v2.7.0) (2019-11-29) 4 | 5 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.6...v2.7.0) 6 | 7 | **Implemented enhancements:** 8 | 9 | - Added support for the on-before-exit action [\#212](https://github.com/PoslinskiNet/ember-introjs/pull/212) ([CodyAntcliffe](https://github.com/CodyAntcliffe)) 10 | 11 | **Merged pull requests:** 12 | 13 | - Update ember-resolver to the latest version 🚀 [\#211](https://github.com/PoslinskiNet/ember-introjs/pull/211) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 14 | - Update ember-source to the latest version 🚀 [\#207](https://github.com/PoslinskiNet/ember-introjs/pull/207) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 15 | - Update ember-cli-htmlbars to the latest version 🚀 [\#206](https://github.com/PoslinskiNet/ember-introjs/pull/206) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 16 | - Update ember-cli-htmlbars to the latest version 🚀 [\#205](https://github.com/PoslinskiNet/ember-introjs/pull/205) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 17 | - Update ember-cli-inject-live-reload to the latest version 🚀 [\#204](https://github.com/PoslinskiNet/ember-introjs/pull/204) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 18 | - Update ember-cli-htmlbars to the latest version 🚀 [\#203](https://github.com/PoslinskiNet/ember-introjs/pull/203) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 19 | - Update ember-cli-htmlbars to the latest version 🚀 [\#201](https://github.com/PoslinskiNet/ember-introjs/pull/201) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 20 | - Update ember-cli-htmlbars to the latest version 🚀 [\#200](https://github.com/PoslinskiNet/ember-introjs/pull/200) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 21 | - Update ember-cli-babel to the latest version 🚀 [\#199](https://github.com/PoslinskiNet/ember-introjs/pull/199) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 22 | - Update ember-cli to the latest version 🚀 [\#198](https://github.com/PoslinskiNet/ember-introjs/pull/198) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 23 | - Update ember-resolver to the latest version 🚀 [\#197](https://github.com/PoslinskiNet/ember-introjs/pull/197) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 24 | - Update ember-cli-htmlbars to the latest version 🚀 [\#196](https://github.com/PoslinskiNet/ember-introjs/pull/196) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 25 | - Update ember-cli-babel to the latest version 🚀 [\#195](https://github.com/PoslinskiNet/ember-introjs/pull/195) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 26 | - Update @ember/optional-features to the latest version 🚀 [\#194](https://github.com/PoslinskiNet/ember-introjs/pull/194) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 27 | - Update ember-source to the latest version 🚀 [\#193](https://github.com/PoslinskiNet/ember-introjs/pull/193) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 28 | - Update ember-cli-fastboot to the latest version 🚀 [\#192](https://github.com/PoslinskiNet/ember-introjs/pull/192) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 29 | - Update ember-cli-fastboot to the latest version 🚀 [\#191](https://github.com/PoslinskiNet/ember-introjs/pull/191) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 30 | - Update eslint-plugin-node to the latest version 🚀 [\#190](https://github.com/PoslinskiNet/ember-introjs/pull/190) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 31 | - Update ember-cli-htmlbars-inline-precompile to the latest version 🚀 [\#189](https://github.com/PoslinskiNet/ember-introjs/pull/189) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 32 | - Update ember-cli-babel to the latest version 🚀 [\#188](https://github.com/PoslinskiNet/ember-introjs/pull/188) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 33 | - Update eslint-plugin-ember to the latest version 🚀 [\#187](https://github.com/PoslinskiNet/ember-introjs/pull/187) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 34 | - Update ember-cli to the latest version 🚀 [\#186](https://github.com/PoslinskiNet/ember-introjs/pull/186) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 35 | - Update ember-cli-babel to the latest version 🚀 [\#185](https://github.com/PoslinskiNet/ember-introjs/pull/185) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 36 | - Update ember-resolver to the latest version 🚀 [\#184](https://github.com/PoslinskiNet/ember-introjs/pull/184) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 37 | - Update ember-source to the latest version 🚀 [\#183](https://github.com/PoslinskiNet/ember-introjs/pull/183) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 38 | - Update ember-resolver to the latest version 🚀 [\#182](https://github.com/PoslinskiNet/ember-introjs/pull/182) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 39 | - Update ember-cli-fastboot to the latest version 🚀 [\#181](https://github.com/PoslinskiNet/ember-introjs/pull/181) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 40 | - Update ember-cli-fastboot to the latest version 🚀 [\#180](https://github.com/PoslinskiNet/ember-introjs/pull/180) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 41 | - Update ember-cli to the latest version 🚀 [\#179](https://github.com/PoslinskiNet/ember-introjs/pull/179) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 42 | - Update ember-cli-htmlbars to the latest version 🚀 [\#178](https://github.com/PoslinskiNet/ember-introjs/pull/178) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 43 | - Update ember-source to the latest version 🚀 [\#177](https://github.com/PoslinskiNet/ember-introjs/pull/177) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 44 | - Update ember-cli-babel to the latest version 🚀 [\#176](https://github.com/PoslinskiNet/ember-introjs/pull/176) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 45 | - Update qunit-dom to the latest version 🚀 [\#175](https://github.com/PoslinskiNet/ember-introjs/pull/175) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 46 | - Update ember-cli-fastboot to the latest version 🚀 [\#174](https://github.com/PoslinskiNet/ember-introjs/pull/174) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 47 | - Update ember-cli-fastboot to the latest version 🚀 [\#173](https://github.com/PoslinskiNet/ember-introjs/pull/173) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 48 | 49 | ## [v2.6.6](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.6) (2019-05-22) 50 | 51 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.5...v2.6.6) 52 | 53 | **Implemented enhancements:** 54 | 55 | - 3.10 upgrade [\#172](https://github.com/PoslinskiNet/ember-introjs/pull/172) ([PoslinskiNet](https://github.com/PoslinskiNet)) 56 | 57 | **Merged pull requests:** 58 | 59 | - Update ember-cli-dependency-checker to the latest version 🚀 [\#171](https://github.com/PoslinskiNet/ember-introjs/pull/171) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 60 | - Update ember-source to the latest version 🚀 [\#168](https://github.com/PoslinskiNet/ember-introjs/pull/168) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 61 | 62 | ## [v2.6.5](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.5) (2019-04-21) 63 | 64 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.4...v2.6.5) 65 | 66 | **Implemented enhancements:** 67 | 68 | - 3.7, 3.8, 3.9 upgrade [\#155](https://github.com/PoslinskiNet/ember-introjs/pull/155) ([PoslinskiNet](https://github.com/PoslinskiNet)) 69 | 70 | **Merged pull requests:** 71 | 72 | - Update ember-cli to the latest version 🚀 [\#161](https://github.com/PoslinskiNet/ember-introjs/pull/161) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 73 | - Update ember-cli-babel to the latest version 🚀 [\#160](https://github.com/PoslinskiNet/ember-introjs/pull/160) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 74 | - Update ember-source to the latest version 🚀 [\#159](https://github.com/PoslinskiNet/ember-introjs/pull/159) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 75 | 76 | ## [v2.6.4](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.4) (2019-02-15) 77 | 78 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.3...v2.6.4) 79 | 80 | **Implemented enhancements:** 81 | 82 | - Deprecation warnings about sendAction [\#151](https://github.com/PoslinskiNet/ember-introjs/issues/151) 83 | - Removed deprecated sendAction [\#153](https://github.com/PoslinskiNet/ember-introjs/pull/153) ([dknutsen](https://github.com/dknutsen)) 84 | 85 | **Merged pull requests:** 86 | 87 | - Add helper-element-padding option [\#157](https://github.com/PoslinskiNet/ember-introjs/pull/157) ([lsg-braymon](https://github.com/lsg-braymon)) 88 | - Update ember-cli-babel to the latest version 🚀 [\#156](https://github.com/PoslinskiNet/ember-introjs/pull/156) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 89 | - Update broccoli-funnel to the latest version 🚀 [\#154](https://github.com/PoslinskiNet/ember-introjs/pull/154) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 90 | - Update ember-cli-fastboot to the latest version 🚀 [\#152](https://github.com/PoslinskiNet/ember-introjs/pull/152) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 91 | - Update ember-template-lint to the latest version 🚀 [\#149](https://github.com/PoslinskiNet/ember-introjs/pull/149) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 92 | - Update ember-source to the latest version 🚀 [\#148](https://github.com/PoslinskiNet/ember-introjs/pull/148) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 93 | - Update ember-cli-dependency-checker to the latest version 🚀 [\#147](https://github.com/PoslinskiNet/ember-introjs/pull/147) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 94 | 95 | ## [v2.6.3](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.3) (2018-12-30) 96 | 97 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.2...v2.6.3) 98 | 99 | **Implemented enhancements:** 100 | 101 | - Smaller upgrades [\#146](https://github.com/PoslinskiNet/ember-introjs/pull/146) ([PoslinskiNet](https://github.com/PoslinskiNet)) 102 | 103 | ## [v2.6.2](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.2) (2018-12-29) 104 | 105 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.1...v2.6.2) 106 | 107 | **Implemented enhancements:** 108 | 109 | - Ember 3.6 upgrade [\#141](https://github.com/PoslinskiNet/ember-introjs/pull/141) ([PoslinskiNet](https://github.com/PoslinskiNet)) 110 | - Fix travis [\#117](https://github.com/PoslinskiNet/ember-introjs/pull/117) ([PoslinskiNet](https://github.com/PoslinskiNet)) 111 | - Added missing link to commercial license page [\#113](https://github.com/PoslinskiNet/ember-introjs/pull/113) ([gandalfar](https://github.com/gandalfar)) 112 | 113 | **Merged pull requests:** 114 | 115 | - Update ember-cli-htmlbars-inline-precompile to the latest version 🚀 [\#145](https://github.com/PoslinskiNet/ember-introjs/pull/145) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 116 | - Update ember-cli-babel to the latest version 🚀 [\#144](https://github.com/PoslinskiNet/ember-introjs/pull/144) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 117 | - Update ember-cli-babel to the latest version 🚀 [\#142](https://github.com/PoslinskiNet/ember-introjs/pull/142) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 118 | - Update broccoli-merge-trees to the latest version 🚀 [\#140](https://github.com/PoslinskiNet/ember-introjs/pull/140) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 119 | - Update ember-cli-htmlbars-inline-precompile to the latest version 🚀 [\#137](https://github.com/PoslinskiNet/ember-introjs/pull/137) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 120 | - Update ember-cli-babel to the latest version 🚀 [\#136](https://github.com/PoslinskiNet/ember-introjs/pull/136) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 121 | - Update ember-load-initializers to the latest version 🚀 [\#135](https://github.com/PoslinskiNet/ember-introjs/pull/135) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 122 | - Update eslint-plugin-node to the latest version 🚀 [\#134](https://github.com/PoslinskiNet/ember-introjs/pull/134) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 123 | - Update ember-cli-htmlbars-inline-precompile to the latest version 🚀 [\#132](https://github.com/PoslinskiNet/ember-introjs/pull/132) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 124 | - Update ember-cli-qunit to the latest version 🚀 [\#131](https://github.com/PoslinskiNet/ember-introjs/pull/131) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 125 | - Update ember-source to the latest version 🚀 [\#130](https://github.com/PoslinskiNet/ember-introjs/pull/130) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 126 | - Update ember-cli-htmlbars-inline-precompile to the latest version 🚀 [\#129](https://github.com/PoslinskiNet/ember-introjs/pull/129) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 127 | - Update ember-cli-htmlbars to the latest version 🚀 [\#128](https://github.com/PoslinskiNet/ember-introjs/pull/128) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 128 | - Update ember-cli-babel to the latest version 🚀 [\#126](https://github.com/PoslinskiNet/ember-introjs/pull/126) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 129 | - Update ember-cli-babel to the latest version 🚀 [\#125](https://github.com/PoslinskiNet/ember-introjs/pull/125) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 130 | - Update qunit-dom to the latest version 🚀 [\#124](https://github.com/PoslinskiNet/ember-introjs/pull/124) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 131 | - Update ember-cli-fastboot to the latest version 🚀 [\#122](https://github.com/PoslinskiNet/ember-introjs/pull/122) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 132 | - Update ember-try to the latest version 🚀 [\#121](https://github.com/PoslinskiNet/ember-introjs/pull/121) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 133 | - Update ember-cli-babel to the latest version 🚀 [\#120](https://github.com/PoslinskiNet/ember-introjs/pull/120) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 134 | - Update ember-source to the latest version 🚀 [\#119](https://github.com/PoslinskiNet/ember-introjs/pull/119) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 135 | - Update ember-cli-babel to the latest version 🚀 [\#118](https://github.com/PoslinskiNet/ember-introjs/pull/118) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 136 | - docs: use action helper in example [\#114](https://github.com/PoslinskiNet/ember-introjs/pull/114) ([knownasilya](https://github.com/knownasilya)) 137 | 138 | ## [v2.6.1](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.1) (2018-08-04) 139 | 140 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.6.0...v2.6.1) 141 | 142 | **Implemented enhancements:** 143 | 144 | - Codecov setup & 3.12 upgrade [\#98](https://github.com/PoslinskiNet/ember-introjs/pull/98) ([PoslinskiNet](https://github.com/PoslinskiNet)) 145 | 146 | **Closed issues:** 147 | 148 | - Fixed Tooltip [\#102](https://github.com/PoslinskiNet/ember-introjs/issues/102) 149 | - Access DOM from another template [\#101](https://github.com/PoslinskiNet/ember-introjs/issues/101) 150 | - Error during ember install [\#99](https://github.com/PoslinskiNet/ember-introjs/issues/99) 151 | 152 | **Merged pull requests:** 153 | 154 | - Update ember-cli-inject-live-reload to the latest version 🚀 [\#112](https://github.com/PoslinskiNet/ember-introjs/pull/112) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 155 | - Update ember-cli-htmlbars to the latest version 🚀 [\#111](https://github.com/PoslinskiNet/ember-introjs/pull/111) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 156 | - Update ember-cli-htmlbars to the latest version 🚀 [\#109](https://github.com/PoslinskiNet/ember-introjs/pull/109) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 157 | - Update ember-cli-inject-live-reload to the latest version 🚀 [\#108](https://github.com/PoslinskiNet/ember-introjs/pull/108) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 158 | - Update ember-resolver to the latest version 🚀 [\#107](https://github.com/PoslinskiNet/ember-introjs/pull/107) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 159 | - Update ember-cli-babel to the latest version 🚀 [\#106](https://github.com/PoslinskiNet/ember-introjs/pull/106) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 160 | - Update eslint-plugin-node to the latest version 🚀 [\#105](https://github.com/PoslinskiNet/ember-introjs/pull/105) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 161 | - Update ember-source to the latest version 🚀 [\#103](https://github.com/PoslinskiNet/ember-introjs/pull/103) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 162 | 163 | ## [v2.6.0](https://github.com/PoslinskiNet/ember-introjs/tree/v2.6.0) (2018-07-04) 164 | 165 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.5.1...v2.6.0) 166 | 167 | **Fixed bugs:** 168 | 169 | - Error: Compile Error: intro-js is not a helper [\#94](https://github.com/PoslinskiNet/ember-introjs/issues/94) 170 | 171 | **Merged pull requests:** 172 | 173 | - Update ember-cli to the latest version 🚀 [\#97](https://github.com/PoslinskiNet/ember-introjs/pull/97) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 174 | - Introduce QUnit specs for 3.1 Ember [\#89](https://github.com/PoslinskiNet/ember-introjs/pull/89) ([Rxbsxn](https://github.com/Rxbsxn)) 175 | 176 | ## [v2.5.1](https://github.com/PoslinskiNet/ember-introjs/tree/v2.5.1) (2018-06-19) 177 | 178 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.5.0...v2.5.1) 179 | 180 | **Implemented enhancements:** 181 | 182 | - Fix pods support [\#95](https://github.com/PoslinskiNet/ember-introjs/pull/95) ([PoslinskiNet](https://github.com/PoslinskiNet)) 183 | 184 | **Merged pull requests:** 185 | 186 | - Update ember-resolver to the latest version 🚀 [\#93](https://github.com/PoslinskiNet/ember-introjs/pull/93) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 187 | 188 | ## [v2.5.0](https://github.com/PoslinskiNet/ember-introjs/tree/v2.5.0) (2018-05-31) 189 | 190 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.4.0...v2.5.0) 191 | 192 | **Implemented enhancements:** 193 | 194 | - Closure actions instead of normal actions? [\#26](https://github.com/PoslinskiNet/ember-introjs/issues/26) 195 | - 3.1 upgrade [\#78](https://github.com/PoslinskiNet/ember-introjs/pull/78) ([PoslinskiNet](https://github.com/PoslinskiNet)) 196 | 197 | **Merged pull requests:** 198 | 199 | - Make tests green again [\#91](https://github.com/PoslinskiNet/ember-introjs/pull/91) ([mikoscz](https://github.com/mikoscz)) 200 | - Update ember-cli-babel to the latest version 🚀 [\#90](https://github.com/PoslinskiNet/ember-introjs/pull/90) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 201 | - Update ember-cli-babel to the latest version 🚀 [\#88](https://github.com/PoslinskiNet/ember-introjs/pull/88) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 202 | - Update sinon-chai to the latest version 🚀 [\#87](https://github.com/PoslinskiNet/ember-introjs/pull/87) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 203 | - Update ember-cli-dependency-checker to the latest version 🚀 [\#86](https://github.com/PoslinskiNet/ember-introjs/pull/86) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 204 | - Update loader.js to the latest version 🚀 [\#77](https://github.com/PoslinskiNet/ember-introjs/pull/77) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 205 | - Update ember-cli to the latest version 🚀 [\#76](https://github.com/PoslinskiNet/ember-introjs/pull/76) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 206 | 207 | ## [v2.4.0](https://github.com/PoslinskiNet/ember-introjs/tree/v2.4.0) (2018-04-04) 208 | 209 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.3.0...v2.4.0) 210 | 211 | **Implemented enhancements:** 212 | 213 | - Ember 3.0 upgrade [\#62](https://github.com/PoslinskiNet/ember-introjs/pull/62) ([PoslinskiNet](https://github.com/PoslinskiNet)) 214 | 215 | **Merged pull requests:** 216 | 217 | - Get rid of jQuery from the tests [\#74](https://github.com/PoslinskiNet/ember-introjs/pull/74) ([mikoscz](https://github.com/mikoscz)) 218 | - Update broccoli-asset-rev to the latest version 🚀 [\#73](https://github.com/PoslinskiNet/ember-introjs/pull/73) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 219 | - Update ember-cli-uglify to the latest version 🚀 [\#72](https://github.com/PoslinskiNet/ember-introjs/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 220 | - Update ember-resolver to the latest version 🚀 [\#71](https://github.com/PoslinskiNet/ember-introjs/pull/71) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 221 | - Update ember-cli-chai to the latest version 🚀 [\#69](https://github.com/PoslinskiNet/ember-introjs/pull/69) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 222 | - Update ember-sinon to the latest version 🚀 [\#67](https://github.com/PoslinskiNet/ember-introjs/pull/67) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 223 | - Update ember-cli-fastboot to the latest version 🚀 [\#66](https://github.com/PoslinskiNet/ember-introjs/pull/66) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 224 | - Update ember-resolver to the latest version 🚀 [\#63](https://github.com/PoslinskiNet/ember-introjs/pull/63) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 225 | - Update ember-cli-babel to the latest version 🚀 [\#61](https://github.com/PoslinskiNet/ember-introjs/pull/61) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 226 | - Update ember-cli-uglify to the latest version 🚀 [\#60](https://github.com/PoslinskiNet/ember-introjs/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 227 | - Update eslint-plugin-node to the latest version 🚀 [\#56](https://github.com/PoslinskiNet/ember-introjs/pull/56) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 228 | - Update ember-cli-mocha to the latest version 🚀 [\#55](https://github.com/PoslinskiNet/ember-introjs/pull/55) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 229 | - Update ember-cli-fastboot to the latest version 🚀 [\#52](https://github.com/PoslinskiNet/ember-introjs/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 230 | 231 | ## [v2.3.0](https://github.com/PoslinskiNet/ember-introjs/tree/v2.3.0) (2018-02-03) 232 | 233 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.2.1...v2.3.0) 234 | 235 | **Implemented enhancements:** 236 | 237 | - Ember 2.18.1 [\#54](https://github.com/PoslinskiNet/ember-introjs/pull/54) ([PoslinskiNet](https://github.com/PoslinskiNet)) 238 | 239 | ## [v2.2.1](https://github.com/PoslinskiNet/ember-introjs/tree/v2.2.1) (2018-01-28) 240 | 241 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/v2.2.0...v2.2.1) 242 | 243 | **Merged pull requests:** 244 | 245 | - Fix travis build [\#51](https://github.com/PoslinskiNet/ember-introjs/pull/51) ([PoslinskiNet](https://github.com/PoslinskiNet)) 246 | - Only merge tree if present in treeForVendor [\#50](https://github.com/PoslinskiNet/ember-introjs/pull/50) ([oo6](https://github.com/oo6)) 247 | - Update ember-cli-fastboot to the latest version 🚀 [\#49](https://github.com/PoslinskiNet/ember-introjs/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 248 | - Update ember-source to the latest version 🚀 [\#48](https://github.com/PoslinskiNet/ember-introjs/pull/48) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 249 | - Update ember-cli to the latest version 🚀 [\#46](https://github.com/PoslinskiNet/ember-introjs/pull/46) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 250 | - Update ember-cli-mocha to the latest version 🚀 [\#45](https://github.com/PoslinskiNet/ember-introjs/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 251 | - Update ember-cli-babel to the latest version 🚀 [\#44](https://github.com/PoslinskiNet/ember-introjs/pull/44) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 252 | - Update ember-cli-fastboot to the latest version 🚀 [\#43](https://github.com/PoslinskiNet/ember-introjs/pull/43) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 253 | - Update ember-cli to the latest version 🚀 [\#42](https://github.com/PoslinskiNet/ember-introjs/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 254 | - Update ember-cli-mocha to the latest version 🚀 [\#41](https://github.com/PoslinskiNet/ember-introjs/pull/41) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 255 | - Update ember-cli-eslint to the latest version 🚀 [\#40](https://github.com/PoslinskiNet/ember-introjs/pull/40) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 256 | - Update ember-cli to the latest version 🚀 [\#39](https://github.com/PoslinskiNet/ember-introjs/pull/39) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 257 | - Update ember-source to the latest version 🚀 [\#38](https://github.com/PoslinskiNet/ember-introjs/pull/38) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 258 | - Update ember-cli-babel to the latest version 🚀 [\#37](https://github.com/PoslinskiNet/ember-introjs/pull/37) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 259 | - Update ember-cli-shims to the latest version 🚀 [\#36](https://github.com/PoslinskiNet/ember-introjs/pull/36) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 260 | - Update ember-cli-babel to the latest version 🚀 [\#35](https://github.com/PoslinskiNet/ember-introjs/pull/35) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 261 | - Update ember-cli-babel to the latest version 🚀 [\#34](https://github.com/PoslinskiNet/ember-introjs/pull/34) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 262 | - Update ember-cli-dependency-checker to the latest version 🚀 [\#33](https://github.com/PoslinskiNet/ember-introjs/pull/33) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 263 | - Update ember-cli-babel to the latest version 🚀 [\#32](https://github.com/PoslinskiNet/ember-introjs/pull/32) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 264 | - Update ember-cli-eslint to the latest version 🚀 [\#31](https://github.com/PoslinskiNet/ember-introjs/pull/31) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 265 | 266 | ## [v2.2.0](https://github.com/PoslinskiNet/ember-introjs/tree/v2.2.0) (2017-10-19) 267 | 268 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/2.1.1...v2.2.0) 269 | 270 | **Implemented enhancements:** 271 | 272 | - Feature 2.16 [\#30](https://github.com/PoslinskiNet/ember-introjs/pull/30) ([PoslinskiNet](https://github.com/PoslinskiNet)) 273 | 274 | **Closed issues:** 275 | 276 | - 'steps' property may be invalid [\#28](https://github.com/PoslinskiNet/ember-introjs/issues/28) 277 | 278 | **Merged pull requests:** 279 | 280 | - Use AMD transformation when importing, remove shim [\#25](https://github.com/PoslinskiNet/ember-introjs/pull/25) ([fusion2004](https://github.com/fusion2004)) 281 | 282 | ## [2.1.1](https://github.com/PoslinskiNet/ember-introjs/tree/2.1.1) (2017-07-01) 283 | 284 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/2.1.0...2.1.1) 285 | 286 | **Implemented enhancements:** 287 | 288 | - Package upgrades [\#23](https://github.com/PoslinskiNet/ember-introjs/pull/23) ([PoslinskiNet](https://github.com/PoslinskiNet)) 289 | 290 | **Closed issues:** 291 | 292 | - Fix breaking changes in FastBoot 1.0 [\#22](https://github.com/PoslinskiNet/ember-introjs/issues/22) 293 | 294 | ## [2.1.0](https://github.com/PoslinskiNet/ember-introjs/tree/2.1.0) (2017-06-16) 295 | 296 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/2.0.0...2.1.0) 297 | 298 | **Implemented enhancements:** 299 | 300 | - Feature step component [\#19](https://github.com/PoslinskiNet/ember-introjs/pull/19) ([Exelord](https://github.com/Exelord)) 301 | - Housewarming gift [\#15](https://github.com/PoslinskiNet/ember-introjs/pull/15) ([Exelord](https://github.com/Exelord)) 302 | 303 | **Closed issues:** 304 | 305 | - intro-js/step not found [\#20](https://github.com/PoslinskiNet/ember-introjs/issues/20) 306 | - NPM collaborator names [\#18](https://github.com/PoslinskiNet/ember-introjs/issues/18) 307 | - New release? [\#13](https://github.com/PoslinskiNet/ember-introjs/issues/13) 308 | - Bring this addon back to life [\#11](https://github.com/PoslinskiNet/ember-introjs/issues/11) 309 | - Ember.EnumerableUtils is deprecated [\#8](https://github.com/PoslinskiNet/ember-introjs/issues/8) 310 | 311 | **Merged pull requests:** 312 | 313 | - Update dependencies to enable Greenkeeper 🌴 [\#29](https://github.com/PoslinskiNet/ember-introjs/pull/29) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 314 | - Release a Step component [\#21](https://github.com/PoslinskiNet/ember-introjs/pull/21) ([Exelord](https://github.com/Exelord)) 315 | 316 | ## [2.0.0](https://github.com/PoslinskiNet/ember-introjs/tree/2.0.0) (2017-04-20) 317 | 318 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/1.1.0...2.0.0) 319 | 320 | **Implemented enhancements:** 321 | 322 | - Ember Cli 2.12 upgrade without bower dependency [\#16](https://github.com/PoslinskiNet/ember-introjs/pull/16) ([PoslinskiNet](https://github.com/PoslinskiNet)) 323 | 324 | ## [1.1.0](https://github.com/PoslinskiNet/ember-introjs/tree/1.1.0) (2017-04-19) 325 | 326 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/1.0.0...1.1.0) 327 | 328 | **Closed issues:** 329 | 330 | - Installation Error with Ember CLI 1.13.8 [\#7](https://github.com/PoslinskiNet/ember-introjs/issues/7) 331 | - Add `tmp` dir to the .npmignore. [\#5](https://github.com/PoslinskiNet/ember-introjs/issues/5) 332 | 333 | **Merged pull requests:** 334 | 335 | - 1.1.0 release [\#17](https://github.com/PoslinskiNet/ember-introjs/pull/17) ([PoslinskiNet](https://github.com/PoslinskiNet)) 336 | - Ember 2 compatibility [\#12](https://github.com/PoslinskiNet/ember-introjs/pull/12) ([cimtico](https://github.com/cimtico)) 337 | - Add changelog [\#10](https://github.com/PoslinskiNet/ember-introjs/pull/10) ([Robdel12](https://github.com/Robdel12)) 338 | - Fix install issue [\#9](https://github.com/PoslinskiNet/ember-introjs/pull/9) ([xymbol](https://github.com/xymbol)) 339 | 340 | ## [1.0.0](https://github.com/PoslinskiNet/ember-introjs/tree/1.0.0) (2015-08-26) 341 | 342 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/0.2.3...1.0.0) 343 | 344 | **Closed issues:** 345 | 346 | - Is there a way to use this without CLI? [\#4](https://github.com/PoslinskiNet/ember-introjs/issues/4) 347 | 348 | **Merged pull requests:** 349 | 350 | - Fixed bower package name [\#6](https://github.com/PoslinskiNet/ember-introjs/pull/6) ([marcoow](https://github.com/marcoow)) 351 | 352 | ## [0.2.3](https://github.com/PoslinskiNet/ember-introjs/tree/0.2.3) (2015-02-26) 353 | 354 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/0.2.2...0.2.3) 355 | 356 | **Merged pull requests:** 357 | 358 | - Update package.json [\#3](https://github.com/PoslinskiNet/ember-introjs/pull/3) ([kategengler](https://github.com/kategengler)) 359 | 360 | ## [0.2.2](https://github.com/PoslinskiNet/ember-introjs/tree/0.2.2) (2015-02-19) 361 | 362 | [Full Changelog](https://github.com/PoslinskiNet/ember-introjs/compare/5bb1d806f6cc71f734fdea0a6910384a76679a6f...0.2.2) 363 | 364 | **Merged pull requests:** 365 | 366 | - fix introjs opening/closing on start-if value changing [\#2](https://github.com/PoslinskiNet/ember-introjs/pull/2) ([fivetanley](https://github.com/fivetanley)) 367 | - document and expose the introJS options hash [\#1](https://github.com/PoslinskiNet/ember-introjs/pull/1) ([fivetanley](https://github.com/fivetanley)) 368 | 369 | 370 | 371 | \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* 372 | --------------------------------------------------------------------------------