├── .bowerrc ├── .gitignore ├── .jshintrc ├── .travis.yml ├── LICENSE ├── README.md ├── assets ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ └── fontawesome-webfont.woff ├── images │ └── ionic.png ├── index.html └── scss │ ├── font-awesome │ ├── _bordered-pulled.scss │ ├── _core.scss │ ├── _fixed-width.scss │ ├── _icons.scss │ ├── _larger.scss │ ├── _list.scss │ ├── _mixins.scss │ ├── _path.scss │ ├── _rotated-flipped.scss │ ├── _spinning.scss │ ├── _stacked.scss │ ├── _variables.scss │ └── font-awesome.scss │ ├── ionic.app.scss │ └── style.scss ├── bower.json ├── config.xml ├── cucumber.conf.js ├── features ├── components │ ├── home.feature │ └── login.feature ├── step_definitions │ ├── forms.js │ ├── pages.js │ └── text.js └── support │ └── steps.js ├── gulpfile.js ├── ionic.project ├── karma.conf.js ├── lib └── definitions │ ├── e2e-definitions │ ├── angular-protractor │ │ └── angular-protractor.d.ts │ ├── jasmine │ │ └── jasmine.d.ts │ └── selenium-webdriver │ │ └── selenium-webdriver.d.ts │ └── ionic │ └── ionic.d.ts ├── package.json ├── protractor.conf.js ├── src ├── common │ ├── ICoreScope.d.ts │ ├── directives │ │ └── example_tag │ │ │ ├── ExampleTag.ts │ │ │ └── index.html │ └── services │ │ ├── SampleData.spec.ts │ │ └── SampleData.ts ├── components │ ├── home │ │ ├── HomeController.ts │ │ ├── home.e2e.ts │ │ └── home.html │ └── login │ │ ├── LoginController.spec.ts │ │ ├── LoginController.ts │ │ ├── login.e2e.ts │ │ └── login.html ├── definitions.d.ts ├── layout │ ├── AppController.ts │ ├── IAppScope.ts │ └── menu │ │ └── menu.html └── main.ts ├── tsd.json ├── tsd └── tsd.d.ts └── tslint.json /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | node_modules/ 3 | platforms/ 4 | plugins/ 5 | hooks/ 6 | .tmp/ 7 | 8 | # autogenerated files 9 | www/* 10 | tsd/* 11 | !tsd/tsd.d.ts 12 | test_out/* 13 | 14 | # Created by https://www.gitignore.io 15 | 16 | ### WebStorm ### 17 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm 18 | 19 | *.iml 20 | 21 | ## Directory-based project format: 22 | .idea/ 23 | # if you remove the above rule, at least ignore the following: 24 | 25 | # User-specific stuff: 26 | # .idea/workspace.xml 27 | # .idea/tasks.xml 28 | # .idea/dictionaries 29 | 30 | # Sensitive or high-churn files: 31 | # .idea/dataSources.ids 32 | # .idea/dataSources.xml 33 | # .idea/sqlDataSources.xml 34 | # .idea/dynamic.xml 35 | # .idea/uiDesigner.xml 36 | 37 | # Gradle: 38 | # .idea/gradle.xml 39 | # .idea/libraries 40 | 41 | # Mongo Explorer plugin: 42 | # .idea/mongoSettings.xml 43 | 44 | ## File-based project format: 45 | *.ipr 46 | *.iws 47 | 48 | ## Plugin-specific files: 49 | 50 | # IntelliJ 51 | out/ 52 | 53 | # mpeltonen/sbt-idea plugin 54 | .idea_modules/ 55 | 56 | # JIRA plugin 57 | atlassian-ide-plugin.xml 58 | 59 | # Crashlytics plugin (for Android Studio and IntelliJ) 60 | com_crashlytics_export_strings.xml 61 | crashlytics.properties 62 | crashlytics-build.properties 63 | 64 | 65 | ### SublimeText ### 66 | # cache files for sublime text 67 | *.tmlanguage.cache 68 | *.tmPreferences.cache 69 | *.stTheme.cache 70 | 71 | # workspace files are user-specific 72 | *.sublime-workspace 73 | 74 | # project files should be checked into the repository, unless a significant 75 | # proportion of contributors will probably not be using SublimeText 76 | # *.sublime-project 77 | 78 | # sftp configuration file 79 | sftp-config.json 80 | 81 | 82 | ### OSX ### 83 | .DS_Store 84 | .AppleDouble 85 | .LSOverride 86 | 87 | # Icon must end with two \r 88 | Icon 89 | 90 | 91 | # Thumbnails 92 | ._* 93 | 94 | # Files that might appear on external disk 95 | .Spotlight-V100 96 | .Trashes 97 | 98 | # Directories potentially created on remote AFP share 99 | .AppleDB 100 | .AppleDesktop 101 | Network Trash Folder 102 | Temporary Items 103 | .apdisk 104 | 105 | 106 | ### grunt ### 107 | # Grunt usually compiles files inside this directory 108 | dist/ 109 | 110 | # Grunt usually preprocesses files such as coffeescript, compass... inside the .tmp directory 111 | .tmp/ 112 | 113 | 114 | ### Node ### 115 | # Logs 116 | logs 117 | *.log 118 | 119 | # Runtime data 120 | pids 121 | *.pid 122 | *.seed 123 | 124 | # Directory for instrumented libs generated by jscoverage/JSCover 125 | lib-cov 126 | 127 | # Coverage directory used by tools like istanbul 128 | coverage 129 | 130 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 131 | .grunt 132 | 133 | # node-waf configuration 134 | .lock-wscript 135 | 136 | # Compiled binary addons (http://nodejs.org/api/addons.html) 137 | build/Release 138 | 139 | # Dependency directory 140 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 141 | node_modules 142 | 143 | 144 | ### Bower ### 145 | bower_components 146 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "maxerr" : 50, // {int} Maximum error before stopping 3 | 4 | // Enforcing 5 | "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) 6 | "camelcase" : false, // true: Identifiers must be in camelCase 7 | "curly" : true, // true: Require {} for every new block or scope 8 | "eqeqeq" : true, // true: Require triple equals (===) for comparison 9 | "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() 10 | "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. 11 | "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` 12 | "indent" : 4, // {int} Number of spaces to use for indentation 13 | "latedef" : false, // true: Require variables/functions to be defined before being used 14 | "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` 15 | "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` 16 | "noempty" : true, // true: Prohibit use of empty blocks 17 | "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. 18 | "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) 19 | "plusplus" : false, // true: Prohibit use of `++` & `--` 20 | "quotmark" : false, // Quotation mark consistency: 21 | // false : do nothing (default) 22 | // true : ensure whatever is used is consistent 23 | // "single" : require single quotes 24 | // "double" : require double quotes 25 | "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) 26 | "unused" : true, // true: Require all defined variables be used 27 | "strict" : true, // true: Requires all functions run in ES5 Strict Mode 28 | "maxparams" : false, // {int} Max number of formal params allowed per function 29 | "maxdepth" : false, // {int} Max depth of nested blocks (within functions) 30 | "maxstatements" : false, // {int} Max number statements per function 31 | "maxcomplexity" : false, // {int} Max cyclomatic complexity per function 32 | "maxlen" : false, // {int} Max number of characters per line 33 | 34 | // Relaxing 35 | "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) 36 | "boss" : false, // true: Tolerate assignments where comparisons would be expected 37 | "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. 38 | "eqnull" : false, // true: Tolerate use of `== null` 39 | "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) 40 | "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) 41 | "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) 42 | // (ex: `for each`, multiple try/catch, function expression…) 43 | "evil" : false, // true: Tolerate use of `eval` and `new Function()` 44 | "expr" : false, // true: Tolerate `ExpressionStatement` as Programs 45 | "funcscope" : false, // true: Tolerate defining variables inside control statements 46 | "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') 47 | "iterator" : false, // true: Tolerate using the `__iterator__` property 48 | "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block 49 | "laxbreak" : false, // true: Tolerate possibly unsafe line breakings 50 | "laxcomma" : false, // true: Tolerate comma-first style coding 51 | "loopfunc" : false, // true: Tolerate functions being defined in loops 52 | "multistr" : false, // true: Tolerate multi-line strings 53 | "noyield" : false, // true: Tolerate generator functions with no yield statement in them. 54 | "notypeof" : false, // true: Tolerate invalid typeof operator values 55 | "proto" : false, // true: Tolerate using the `__proto__` property 56 | "scripturl" : false, // true: Tolerate script-targeted URLs 57 | "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` 58 | "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation 59 | "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` 60 | "validthis" : false, // true: Tolerate using this in a non-constructor function 61 | 62 | // Environments 63 | "browser" : true, // Web Browser (window, document, etc) 64 | "browserify" : false, // Browserify (node.js code in the browser) 65 | "couch" : false, // CouchDB 66 | "devel" : true, // Development/debugging (alert, confirm, etc) 67 | "dojo" : false, // Dojo Toolkit 68 | "jasmine" : false, // Jasmine 69 | "jquery" : false, // jQuery 70 | "mocha" : true, // Mocha 71 | "mootools" : false, // MooTools 72 | "node" : false, // Node.js 73 | "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) 74 | "prototypejs" : false, // Prototype and Scriptaculous 75 | "qunit" : false, // QUnit 76 | "rhino" : false, // Rhino 77 | "shelljs" : false, // ShellJS 78 | "worker" : false, // Web Workers 79 | "wsh" : false, // Windows Scripting Host 80 | "yui" : false, // Yahoo User Interface 81 | 82 | // Custom Globals 83 | "globals" : {} // additional predefined global variables 84 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - "0.10" 5 | 6 | before_script: 7 | - export DISPLAY=:99.0 8 | - sh -e /etc/init.d/xvfb start 9 | - npm install -g typescript 10 | - npm install tsd@next -g 11 | - npm install -g gulp 12 | - npm install -g ionic 13 | - npm install -g bower 14 | - npm install -g protractor 15 | - npm install -g cucumber 16 | - npm run update-webdriver 17 | - npm run travis-server > /dev/null & 18 | # - npm run web-driver > /dev/null & 19 | - npm run setup 20 | - sleep 3 # give server time to start 21 | 22 | script: 23 | - gulp 24 | - ./node_modules/karma/bin/karma start karma.conf.js --no-auto-watch --single-run --reporters=dots --browsers=Firefox 25 | - protractor protractor.conf.js --browser=firefox 26 | # - protractor cucumber.conf.js --browser=firefox 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2015 Michi Kono. http://michikono.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TypeScript Ionic Seed - Overview [![Build Status](https://travis-ci.org/michikono/typescript-ionic-seed.svg?branch=master)](https://travis-ci.org/michikono/typescript-ionic-seed) 2 | ================================ 3 | 4 | This is a seed for a TypeScript/Ionic project. What makes this seed _awesome_: 5 | 6 | * All code using TypeScript! 7 | * Ready to go for use in Ionic (maybe Angular too, but that's for later...) 8 | * Gulp instead of Grunt (some may debate this choice), but hides this detail from you via `npm run` 9 | * The codebase uses many best practices found [here](https://github.com/johnpapa/angularjs-styleguide) such as the [folders-by-feature-structure](https://github.com/johnpapa/angularjs-styleguide#folders-by-feature-structure) and [module](https://github.com/johnpapa/angularjs-styleguide#many-small-self-contained-modules) patterns 10 | * The convention used for `$scope` (see `ICoreScope`) variable assignment prevents primitives from being assigned ([this avoids many bugs](http://zcourts.com/2013/05/31/angularjs-if-you-dont-have-a-dot-youre-doing-it-wrong/)) 11 | * Comprehensive `.gitignore` and `.jshintrc` (uses `tslint` to keep code clean!) 12 | * Uses OSX notifications for most watcher errors (and enables TDD) 13 | * Unlike most other Ioinc/Angular/folders-by-feature seeds, this one also includes test examples (unit and functional tests in TypeScript) 14 | * Everything uses source maps so failing tests and broken code will show you the `.ts` file that is causing it 15 | * All Font-awesome icons working with no additional configuration! 16 | * A working Travis CI integration ([check it out!](https://travis-ci.org/michikono/typescript-ionic-seed)) 17 | * Minifies all HTML, CSS, and JS (except tests) 18 | * Contains test samples for Protractor+Cucumber+Chai and Protractor+Jasmine. [Choose the one you prefer.](http://angular.github.io/protractor/#/frameworks) 19 | 20 | Setup 21 | ===== 22 | 23 | This setup requires npm and xcode to be installed. 24 | 25 | ```bash 26 | npm install -g typescript 27 | npm install -g gulp 28 | npm install -g ionic 29 | npm install tsd@next -g 30 | npm install -g bower 31 | npm install -g protractor 32 | npm install -g cucumber 33 | npm run setup 34 | ionic platform add ios 35 | ``` 36 | 37 | Development 38 | =========== 39 | 40 | ***Do not enable IDE compilation of TypeScript as the file watcher in this project will handle this for you and keep the conventions in place.*** 41 | 42 | To enable automatic SASS compilation, TypeScript compilation, and test running: 43 | 44 | ```bash 45 | npm run watch 46 | ``` 47 | 48 | If you'd rather be more granular... 49 | 50 | To compile SASS: 51 | 52 | ```bash 53 | npm run css 54 | ``` 55 | 56 | To compile TypeScript files: 57 | 58 | ```bash 59 | npm run ts 60 | ``` 61 | 62 | Testing 63 | ------- 64 | 65 | To run unit tests (will run all dependency tasks): 66 | 67 | ```bash 68 | npm run test 69 | ``` 70 | 71 | To run functional tests, try one of the following. 72 | 73 | For Protractor + Jasmine: 74 | 75 | 1. `npm run server` (start this in its own tab) 76 | 2. `npm run protractor` 77 | 78 | Protractor tests are located at `src/**/*.e2e.ts` in each folder they are related to. 79 | 80 | For Protractor + Cucumber: 81 | 82 | 1. `npm run server` (start this in its own tab) 83 | 2. `npm run web-driver` (start this in its own tab too; drives the browser) 84 | 3. `npm run cucumber` (uses protractor to drive) 85 | 86 | Cucumber tests are located at `features/**/*.feature` -- these were placed outside of the TypeScript definitions for convenience to allow IDEs to better parse the definitions. The `step_definitions` contains the definition mappings and is roughly organized by type. 87 | 88 | Adding dependencies 89 | ----------------------- 90 | 91 | * For [TSDs](http://definitelytyped.org/tsd/) (to have TypeScript detection), use `tsd install --save`. This may break the `.tsd.d.ts` file -- if this happens, just review the generated file paths carefully before proceeding. 92 | * For bower (things used in the browser), use `bower install --save` 93 | * For npm (things used to build stuff), use `npm install --save-dev` 94 | * For 3rd party, non-TSD definitions, placed them in `lib/definitions/`, and don't touch `lib/definitions/e2e-definitions/` unless you want something added to the E2E test build 95 | 96 | Runing the application 97 | ====================== 98 | 99 | Web 100 | --- 101 | 102 | ```bash 103 | npm run server 104 | ``` 105 | 106 | iPhone 107 | ------ 108 | 109 | ```bash 110 | ionic build ios 111 | ionic emulate ios 112 | ``` 113 | 114 | Notes 115 | ===== 116 | 117 | * The `module` syntax is used to create actual TypeScript modules -- code inside a module is scoped to it. Each feature folder uses its own module name and the shared scope is used in the unit tests to access the declarations without requiring verbose prefixes. 118 | * The `angular.module` syntax is an Angular thing for componentizing code. To avoid confusion, wherever possible, the two types of module references should be the same in a file/feature. 119 | * You will need to add new `src/**/.ts` files to `src/definitions.d.ts` to ensure the TypeScript compiler doesn't get confused (see next caveat); if anything breaks in your `tsd/tsd.d.ts` file, [double check the paths didn't get munged](https://github.com/DefinitelyTyped/tsd/issues/112) 120 | * When creating interfaces in `.d.ts` files, you can declare them by [prefixing the `module` declaration with `declare`](http://stackoverflow.com/questions/17635033/error-ts1046-declare-modifier-required-for-top-level-element). 121 | * Always assume the `www/` folder is scratch space -- including `index.html`! 122 | * Place images, fonts, scss, etc. in `assets/` 123 | * Don't mess with files in `www`! For example, `test/e2e.js` - compiled end to end tests will end up here (from `src/**/*.e2e.ts`); `test/unit.js` - compiled unit tests will end up here (from `src/**/*.spec.ts`) 124 | * The strange-looking testing convention in the E2E files is the [Page Object pattern](https://code.google.com/p/selenium/wiki/PageObjects). Basically you hide DOM-level details from tests. 125 | * Note that since functional code doesn't technically touch the main code base directly, it doesn't need all the same dependencies (or any) that the rest of the code needs. Modules are entirely optional, but I used them for consistency. 126 | * The travis integration for Selenium requires a 3rd party, so it is not enabled (but protractor is!) 127 | 128 | -------------------------------------------------------------------------------- /assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michikono/typescript-ionic-seed/3c8dcfef76e06825e4fb4a787324943c228bbdea/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michikono/typescript-ionic-seed/3c8dcfef76e06825e4fb4a787324943c228bbdea/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michikono/typescript-ionic-seed/3c8dcfef76e06825e4fb4a787324943c228bbdea/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michikono/typescript-ionic-seed/3c8dcfef76e06825e4fb4a787324943c228bbdea/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /assets/images/ionic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michikono/typescript-ionic-seed/3c8dcfef76e06825e4fb4a787324943c228bbdea/assets/images/ionic.png -------------------------------------------------------------------------------- /assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .pull-right { float: right; } 11 | .pull-left { float: left; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.pull-left { margin-right: .3em; } 15 | &.pull-right { margin-left: .3em; } 16 | } 17 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_icons.scss: -------------------------------------------------------------------------------- 1 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 2 | readers do not read off random characters that represent icons */ 3 | 4 | .#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } 5 | .#{$fa-css-prefix}-music:before { content: $fa-var-music; } 6 | .#{$fa-css-prefix}-search:before { content: $fa-var-search; } 7 | .#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } 8 | .#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } 9 | .#{$fa-css-prefix}-star:before { content: $fa-var-star; } 10 | .#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } 11 | .#{$fa-css-prefix}-user:before { content: $fa-var-user; } 12 | .#{$fa-css-prefix}-film:before { content: $fa-var-film; } 13 | .#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } 14 | .#{$fa-css-prefix}-th:before { content: $fa-var-th; } 15 | .#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } 16 | .#{$fa-css-prefix}-check:before { content: $fa-var-check; } 17 | .#{$fa-css-prefix}-remove:before, 18 | .#{$fa-css-prefix}-close:before, 19 | .#{$fa-css-prefix}-times:before { content: $fa-var-times; } 20 | .#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } 21 | .#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } 22 | .#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } 23 | .#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } 24 | .#{$fa-css-prefix}-gear:before, 25 | .#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } 26 | .#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } 27 | .#{$fa-css-prefix}-home:before { content: $fa-var-home; } 28 | .#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } 29 | .#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } 30 | .#{$fa-css-prefix}-road:before { content: $fa-var-road; } 31 | .#{$fa-css-prefix}-download:before { content: $fa-var-download; } 32 | .#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } 33 | .#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } 34 | .#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } 35 | .#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } 36 | .#{$fa-css-prefix}-rotate-right:before, 37 | .#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } 38 | .#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } 39 | .#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } 40 | .#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } 41 | .#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } 42 | .#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } 43 | .#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } 44 | .#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } 45 | .#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } 46 | .#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } 47 | .#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } 48 | .#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } 49 | .#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } 50 | .#{$fa-css-prefix}-book:before { content: $fa-var-book; } 51 | .#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } 52 | .#{$fa-css-prefix}-print:before { content: $fa-var-print; } 53 | .#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } 54 | .#{$fa-css-prefix}-font:before { content: $fa-var-font; } 55 | .#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } 56 | .#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } 57 | .#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } 58 | .#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } 59 | .#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } 60 | .#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } 61 | .#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } 62 | .#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } 63 | .#{$fa-css-prefix}-list:before { content: $fa-var-list; } 64 | .#{$fa-css-prefix}-dedent:before, 65 | .#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } 66 | .#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } 67 | .#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } 68 | .#{$fa-css-prefix}-photo:before, 69 | .#{$fa-css-prefix}-image:before, 70 | .#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } 71 | .#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } 72 | .#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } 73 | .#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } 74 | .#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } 75 | .#{$fa-css-prefix}-edit:before, 76 | .#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } 77 | .#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } 78 | .#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } 79 | .#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } 80 | .#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } 81 | .#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } 82 | .#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } 83 | .#{$fa-css-prefix}-play:before { content: $fa-var-play; } 84 | .#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } 85 | .#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } 86 | .#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } 87 | .#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } 88 | .#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } 89 | .#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } 90 | .#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } 91 | .#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } 92 | .#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } 93 | .#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } 94 | .#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } 95 | .#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } 96 | .#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } 97 | .#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } 98 | .#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } 99 | .#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } 100 | .#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } 101 | .#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } 102 | .#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } 103 | .#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } 104 | .#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } 105 | .#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } 106 | .#{$fa-css-prefix}-mail-forward:before, 107 | .#{$fa-css-prefix}-share:before { content: $fa-var-share; } 108 | .#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } 109 | .#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } 110 | .#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } 111 | .#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } 112 | .#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } 113 | .#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } 114 | .#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } 115 | .#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } 116 | .#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } 117 | .#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } 118 | .#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } 119 | .#{$fa-css-prefix}-warning:before, 120 | .#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } 121 | .#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } 122 | .#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } 123 | .#{$fa-css-prefix}-random:before { content: $fa-var-random; } 124 | .#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } 125 | .#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } 126 | .#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } 127 | .#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } 128 | .#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } 129 | .#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } 130 | .#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } 131 | .#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } 132 | .#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } 133 | .#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } 134 | .#{$fa-css-prefix}-bar-chart-o:before, 135 | .#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } 136 | .#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } 137 | .#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } 138 | .#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } 139 | .#{$fa-css-prefix}-key:before { content: $fa-var-key; } 140 | .#{$fa-css-prefix}-gears:before, 141 | .#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } 142 | .#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } 143 | .#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } 144 | .#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } 145 | .#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } 146 | .#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } 147 | .#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } 148 | .#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } 149 | .#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } 150 | .#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } 151 | .#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } 152 | .#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } 153 | .#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } 154 | .#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } 155 | .#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } 156 | .#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } 157 | .#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } 158 | .#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } 159 | .#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } 160 | .#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } 161 | .#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } 162 | .#{$fa-css-prefix}-github:before { content: $fa-var-github; } 163 | .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } 164 | .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } 165 | .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } 166 | .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } 167 | .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } 168 | .#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } 169 | .#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } 170 | .#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } 171 | .#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } 172 | .#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } 173 | .#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } 174 | .#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } 175 | .#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } 176 | .#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } 177 | .#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } 178 | .#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } 179 | .#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } 180 | .#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } 181 | .#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } 182 | .#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } 183 | .#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } 184 | .#{$fa-css-prefix}-group:before, 185 | .#{$fa-css-prefix}-users:before { content: $fa-var-users; } 186 | .#{$fa-css-prefix}-chain:before, 187 | .#{$fa-css-prefix}-link:before { content: $fa-var-link; } 188 | .#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } 189 | .#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } 190 | .#{$fa-css-prefix}-cut:before, 191 | .#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } 192 | .#{$fa-css-prefix}-copy:before, 193 | .#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } 194 | .#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } 195 | .#{$fa-css-prefix}-save:before, 196 | .#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } 197 | .#{$fa-css-prefix}-square:before { content: $fa-var-square; } 198 | .#{$fa-css-prefix}-navicon:before, 199 | .#{$fa-css-prefix}-reorder:before, 200 | .#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } 201 | .#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } 202 | .#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } 203 | .#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } 204 | .#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } 205 | .#{$fa-css-prefix}-table:before { content: $fa-var-table; } 206 | .#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } 207 | .#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } 208 | .#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } 209 | .#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } 210 | .#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } 211 | .#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } 212 | .#{$fa-css-prefix}-money:before { content: $fa-var-money; } 213 | .#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } 214 | .#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } 215 | .#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } 216 | .#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } 217 | .#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } 218 | .#{$fa-css-prefix}-unsorted:before, 219 | .#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } 220 | .#{$fa-css-prefix}-sort-down:before, 221 | .#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } 222 | .#{$fa-css-prefix}-sort-up:before, 223 | .#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } 224 | .#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } 225 | .#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } 226 | .#{$fa-css-prefix}-rotate-left:before, 227 | .#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } 228 | .#{$fa-css-prefix}-legal:before, 229 | .#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } 230 | .#{$fa-css-prefix}-dashboard:before, 231 | .#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } 232 | .#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } 233 | .#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } 234 | .#{$fa-css-prefix}-flash:before, 235 | .#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } 236 | .#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } 237 | .#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } 238 | .#{$fa-css-prefix}-paste:before, 239 | .#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } 240 | .#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } 241 | .#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } 242 | .#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } 243 | .#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } 244 | .#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } 245 | .#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } 246 | .#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } 247 | .#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } 248 | .#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } 249 | .#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } 250 | .#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } 251 | .#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } 252 | .#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } 253 | .#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } 254 | .#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } 255 | .#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } 256 | .#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } 257 | .#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } 258 | .#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } 259 | .#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } 260 | .#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } 261 | .#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } 262 | .#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } 263 | .#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } 264 | .#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } 265 | .#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } 266 | .#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } 267 | .#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } 268 | .#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } 269 | .#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } 270 | .#{$fa-css-prefix}-mobile-phone:before, 271 | .#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } 272 | .#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } 273 | .#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } 274 | .#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } 275 | .#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } 276 | .#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } 277 | .#{$fa-css-prefix}-mail-reply:before, 278 | .#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } 279 | .#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } 280 | .#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } 281 | .#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } 282 | .#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } 283 | .#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } 284 | .#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } 285 | .#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } 286 | .#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } 287 | .#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } 288 | .#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } 289 | .#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } 290 | .#{$fa-css-prefix}-code:before { content: $fa-var-code; } 291 | .#{$fa-css-prefix}-mail-reply-all:before, 292 | .#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } 293 | .#{$fa-css-prefix}-star-half-empty:before, 294 | .#{$fa-css-prefix}-star-half-full:before, 295 | .#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } 296 | .#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } 297 | .#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } 298 | .#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } 299 | .#{$fa-css-prefix}-unlink:before, 300 | .#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } 301 | .#{$fa-css-prefix}-question:before { content: $fa-var-question; } 302 | .#{$fa-css-prefix}-info:before { content: $fa-var-info; } 303 | .#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } 304 | .#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } 305 | .#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } 306 | .#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } 307 | .#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } 308 | .#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } 309 | .#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } 310 | .#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } 311 | .#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } 312 | .#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } 313 | .#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } 314 | .#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } 315 | .#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } 316 | .#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } 317 | .#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } 318 | .#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } 319 | .#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } 320 | .#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } 321 | .#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } 322 | .#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } 323 | .#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } 324 | .#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } 325 | .#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } 326 | .#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } 327 | .#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } 328 | .#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } 329 | .#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } 330 | .#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } 331 | .#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } 332 | .#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } 333 | .#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } 334 | .#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } 335 | .#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } 336 | .#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } 337 | .#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } 338 | .#{$fa-css-prefix}-toggle-down:before, 339 | .#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } 340 | .#{$fa-css-prefix}-toggle-up:before, 341 | .#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } 342 | .#{$fa-css-prefix}-toggle-right:before, 343 | .#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } 344 | .#{$fa-css-prefix}-euro:before, 345 | .#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } 346 | .#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } 347 | .#{$fa-css-prefix}-dollar:before, 348 | .#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } 349 | .#{$fa-css-prefix}-rupee:before, 350 | .#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } 351 | .#{$fa-css-prefix}-cny:before, 352 | .#{$fa-css-prefix}-rmb:before, 353 | .#{$fa-css-prefix}-yen:before, 354 | .#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } 355 | .#{$fa-css-prefix}-ruble:before, 356 | .#{$fa-css-prefix}-rouble:before, 357 | .#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } 358 | .#{$fa-css-prefix}-won:before, 359 | .#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } 360 | .#{$fa-css-prefix}-bitcoin:before, 361 | .#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } 362 | .#{$fa-css-prefix}-file:before { content: $fa-var-file; } 363 | .#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } 364 | .#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } 365 | .#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } 366 | .#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } 367 | .#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } 368 | .#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } 369 | .#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } 370 | .#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } 371 | .#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } 372 | .#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } 373 | .#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } 374 | .#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } 375 | .#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } 376 | .#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } 377 | .#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } 378 | .#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } 379 | .#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } 380 | .#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } 381 | .#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } 382 | .#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } 383 | .#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } 384 | .#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } 385 | .#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } 386 | .#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } 387 | .#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } 388 | .#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } 389 | .#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } 390 | .#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } 391 | .#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } 392 | .#{$fa-css-prefix}-android:before { content: $fa-var-android; } 393 | .#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } 394 | .#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } 395 | .#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } 396 | .#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } 397 | .#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } 398 | .#{$fa-css-prefix}-female:before { content: $fa-var-female; } 399 | .#{$fa-css-prefix}-male:before { content: $fa-var-male; } 400 | .#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; } 401 | .#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } 402 | .#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } 403 | .#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } 404 | .#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } 405 | .#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } 406 | .#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } 407 | .#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } 408 | .#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } 409 | .#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } 410 | .#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } 411 | .#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } 412 | .#{$fa-css-prefix}-toggle-left:before, 413 | .#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } 414 | .#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } 415 | .#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } 416 | .#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } 417 | .#{$fa-css-prefix}-turkish-lira:before, 418 | .#{$fa-css-prefix}-try:before { content: $fa-var-try; } 419 | .#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } 420 | .#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } 421 | .#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } 422 | .#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } 423 | .#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } 424 | .#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } 425 | .#{$fa-css-prefix}-institution:before, 426 | .#{$fa-css-prefix}-bank:before, 427 | .#{$fa-css-prefix}-university:before { content: $fa-var-university; } 428 | .#{$fa-css-prefix}-mortar-board:before, 429 | .#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } 430 | .#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } 431 | .#{$fa-css-prefix}-google:before { content: $fa-var-google; } 432 | .#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } 433 | .#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } 434 | .#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } 435 | .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } 436 | .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } 437 | .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } 438 | .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } 439 | .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } 440 | .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } 441 | .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } 442 | .#{$fa-css-prefix}-language:before { content: $fa-var-language; } 443 | .#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } 444 | .#{$fa-css-prefix}-building:before { content: $fa-var-building; } 445 | .#{$fa-css-prefix}-child:before { content: $fa-var-child; } 446 | .#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } 447 | .#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } 448 | .#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } 449 | .#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } 450 | .#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } 451 | .#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } 452 | .#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } 453 | .#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } 454 | .#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } 455 | .#{$fa-css-prefix}-automobile:before, 456 | .#{$fa-css-prefix}-car:before { content: $fa-var-car; } 457 | .#{$fa-css-prefix}-cab:before, 458 | .#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } 459 | .#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } 460 | .#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } 461 | .#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } 462 | .#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } 463 | .#{$fa-css-prefix}-database:before { content: $fa-var-database; } 464 | .#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } 465 | .#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } 466 | .#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } 467 | .#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } 468 | .#{$fa-css-prefix}-file-photo-o:before, 469 | .#{$fa-css-prefix}-file-picture-o:before, 470 | .#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } 471 | .#{$fa-css-prefix}-file-zip-o:before, 472 | .#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } 473 | .#{$fa-css-prefix}-file-sound-o:before, 474 | .#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } 475 | .#{$fa-css-prefix}-file-movie-o:before, 476 | .#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } 477 | .#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } 478 | .#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } 479 | .#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } 480 | .#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } 481 | .#{$fa-css-prefix}-life-bouy:before, 482 | .#{$fa-css-prefix}-life-buoy:before, 483 | .#{$fa-css-prefix}-life-saver:before, 484 | .#{$fa-css-prefix}-support:before, 485 | .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } 486 | .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } 487 | .#{$fa-css-prefix}-ra:before, 488 | .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } 489 | .#{$fa-css-prefix}-ge:before, 490 | .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } 491 | .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } 492 | .#{$fa-css-prefix}-git:before { content: $fa-var-git; } 493 | .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } 494 | .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } 495 | .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } 496 | .#{$fa-css-prefix}-wechat:before, 497 | .#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } 498 | .#{$fa-css-prefix}-send:before, 499 | .#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } 500 | .#{$fa-css-prefix}-send-o:before, 501 | .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } 502 | .#{$fa-css-prefix}-history:before { content: $fa-var-history; } 503 | .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } 504 | .#{$fa-css-prefix}-header:before { content: $fa-var-header; } 505 | .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } 506 | .#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } 507 | .#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } 508 | .#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } 509 | .#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } 510 | .#{$fa-css-prefix}-soccer-ball-o:before, 511 | .#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } 512 | .#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } 513 | .#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } 514 | .#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } 515 | .#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } 516 | .#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } 517 | .#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } 518 | .#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } 519 | .#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } 520 | .#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } 521 | .#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } 522 | .#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } 523 | .#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } 524 | .#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } 525 | .#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } 526 | .#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } 527 | .#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } 528 | .#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } 529 | .#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } 530 | .#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } 531 | .#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } 532 | .#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } 533 | .#{$fa-css-prefix}-at:before { content: $fa-var-at; } 534 | .#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } 535 | .#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } 536 | .#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } 537 | .#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } 538 | .#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } 539 | .#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } 540 | .#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } 541 | .#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } 542 | .#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } 543 | .#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } 544 | .#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } 545 | .#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } 546 | .#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } 547 | .#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } 548 | .#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } 549 | .#{$fa-css-prefix}-shekel:before, 550 | .#{$fa-css-prefix}-sheqel:before, 551 | .#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } 552 | .#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } 553 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal 14px/1 FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | @mixin fa-icon-rotate($degrees, $rotation) { 14 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 15 | -webkit-transform: rotate($degrees); 16 | -ms-transform: rotate($degrees); 17 | transform: rotate($degrees); 18 | } 19 | 20 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 21 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); 22 | -webkit-transform: scale($horiz, $vert); 23 | -ms-transform: scale($horiz, $vert); 24 | transform: scale($horiz, $vert); 25 | } 26 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 9 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 10 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 11 | //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_spinning.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | @-webkit-keyframes fa-spin { 10 | 0% { 11 | -webkit-transform: rotate(0deg); 12 | transform: rotate(0deg); 13 | } 14 | 100% { 15 | -webkit-transform: rotate(359deg); 16 | transform: rotate(359deg); 17 | } 18 | } 19 | 20 | @keyframes fa-spin { 21 | 0% { 22 | -webkit-transform: rotate(0deg); 23 | transform: rotate(0deg); 24 | } 25 | 100% { 26 | -webkit-transform: rotate(359deg); 27 | transform: rotate(359deg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | $fa-font-path: "../fonts" !default; 5 | //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly 6 | $fa-css-prefix: fa !default; 7 | $fa-version: "4.2.0" !default; 8 | $fa-border-color: #eee !default; 9 | $fa-inverse: #fff !default; 10 | $fa-li-width: (30em / 14) !default; 11 | 12 | $fa-var-adjust: "\f042"; 13 | $fa-var-adn: "\f170"; 14 | $fa-var-align-center: "\f037"; 15 | $fa-var-align-justify: "\f039"; 16 | $fa-var-align-left: "\f036"; 17 | $fa-var-align-right: "\f038"; 18 | $fa-var-ambulance: "\f0f9"; 19 | $fa-var-anchor: "\f13d"; 20 | $fa-var-android: "\f17b"; 21 | $fa-var-angellist: "\f209"; 22 | $fa-var-angle-double-down: "\f103"; 23 | $fa-var-angle-double-left: "\f100"; 24 | $fa-var-angle-double-right: "\f101"; 25 | $fa-var-angle-double-up: "\f102"; 26 | $fa-var-angle-down: "\f107"; 27 | $fa-var-angle-left: "\f104"; 28 | $fa-var-angle-right: "\f105"; 29 | $fa-var-angle-up: "\f106"; 30 | $fa-var-apple: "\f179"; 31 | $fa-var-archive: "\f187"; 32 | $fa-var-area-chart: "\f1fe"; 33 | $fa-var-arrow-circle-down: "\f0ab"; 34 | $fa-var-arrow-circle-left: "\f0a8"; 35 | $fa-var-arrow-circle-o-down: "\f01a"; 36 | $fa-var-arrow-circle-o-left: "\f190"; 37 | $fa-var-arrow-circle-o-right: "\f18e"; 38 | $fa-var-arrow-circle-o-up: "\f01b"; 39 | $fa-var-arrow-circle-right: "\f0a9"; 40 | $fa-var-arrow-circle-up: "\f0aa"; 41 | $fa-var-arrow-down: "\f063"; 42 | $fa-var-arrow-left: "\f060"; 43 | $fa-var-arrow-right: "\f061"; 44 | $fa-var-arrow-up: "\f062"; 45 | $fa-var-arrows: "\f047"; 46 | $fa-var-arrows-alt: "\f0b2"; 47 | $fa-var-arrows-h: "\f07e"; 48 | $fa-var-arrows-v: "\f07d"; 49 | $fa-var-asterisk: "\f069"; 50 | $fa-var-at: "\f1fa"; 51 | $fa-var-automobile: "\f1b9"; 52 | $fa-var-backward: "\f04a"; 53 | $fa-var-ban: "\f05e"; 54 | $fa-var-bank: "\f19c"; 55 | $fa-var-bar-chart: "\f080"; 56 | $fa-var-bar-chart-o: "\f080"; 57 | $fa-var-barcode: "\f02a"; 58 | $fa-var-bars: "\f0c9"; 59 | $fa-var-beer: "\f0fc"; 60 | $fa-var-behance: "\f1b4"; 61 | $fa-var-behance-square: "\f1b5"; 62 | $fa-var-bell: "\f0f3"; 63 | $fa-var-bell-o: "\f0a2"; 64 | $fa-var-bell-slash: "\f1f6"; 65 | $fa-var-bell-slash-o: "\f1f7"; 66 | $fa-var-bicycle: "\f206"; 67 | $fa-var-binoculars: "\f1e5"; 68 | $fa-var-birthday-cake: "\f1fd"; 69 | $fa-var-bitbucket: "\f171"; 70 | $fa-var-bitbucket-square: "\f172"; 71 | $fa-var-bitcoin: "\f15a"; 72 | $fa-var-bold: "\f032"; 73 | $fa-var-bolt: "\f0e7"; 74 | $fa-var-bomb: "\f1e2"; 75 | $fa-var-book: "\f02d"; 76 | $fa-var-bookmark: "\f02e"; 77 | $fa-var-bookmark-o: "\f097"; 78 | $fa-var-briefcase: "\f0b1"; 79 | $fa-var-btc: "\f15a"; 80 | $fa-var-bug: "\f188"; 81 | $fa-var-building: "\f1ad"; 82 | $fa-var-building-o: "\f0f7"; 83 | $fa-var-bullhorn: "\f0a1"; 84 | $fa-var-bullseye: "\f140"; 85 | $fa-var-bus: "\f207"; 86 | $fa-var-cab: "\f1ba"; 87 | $fa-var-calculator: "\f1ec"; 88 | $fa-var-calendar: "\f073"; 89 | $fa-var-calendar-o: "\f133"; 90 | $fa-var-camera: "\f030"; 91 | $fa-var-camera-retro: "\f083"; 92 | $fa-var-car: "\f1b9"; 93 | $fa-var-caret-down: "\f0d7"; 94 | $fa-var-caret-left: "\f0d9"; 95 | $fa-var-caret-right: "\f0da"; 96 | $fa-var-caret-square-o-down: "\f150"; 97 | $fa-var-caret-square-o-left: "\f191"; 98 | $fa-var-caret-square-o-right: "\f152"; 99 | $fa-var-caret-square-o-up: "\f151"; 100 | $fa-var-caret-up: "\f0d8"; 101 | $fa-var-cc: "\f20a"; 102 | $fa-var-cc-amex: "\f1f3"; 103 | $fa-var-cc-discover: "\f1f2"; 104 | $fa-var-cc-mastercard: "\f1f1"; 105 | $fa-var-cc-paypal: "\f1f4"; 106 | $fa-var-cc-stripe: "\f1f5"; 107 | $fa-var-cc-visa: "\f1f0"; 108 | $fa-var-certificate: "\f0a3"; 109 | $fa-var-chain: "\f0c1"; 110 | $fa-var-chain-broken: "\f127"; 111 | $fa-var-check: "\f00c"; 112 | $fa-var-check-circle: "\f058"; 113 | $fa-var-check-circle-o: "\f05d"; 114 | $fa-var-check-square: "\f14a"; 115 | $fa-var-check-square-o: "\f046"; 116 | $fa-var-chevron-circle-down: "\f13a"; 117 | $fa-var-chevron-circle-left: "\f137"; 118 | $fa-var-chevron-circle-right: "\f138"; 119 | $fa-var-chevron-circle-up: "\f139"; 120 | $fa-var-chevron-down: "\f078"; 121 | $fa-var-chevron-left: "\f053"; 122 | $fa-var-chevron-right: "\f054"; 123 | $fa-var-chevron-up: "\f077"; 124 | $fa-var-child: "\f1ae"; 125 | $fa-var-circle: "\f111"; 126 | $fa-var-circle-o: "\f10c"; 127 | $fa-var-circle-o-notch: "\f1ce"; 128 | $fa-var-circle-thin: "\f1db"; 129 | $fa-var-clipboard: "\f0ea"; 130 | $fa-var-clock-o: "\f017"; 131 | $fa-var-close: "\f00d"; 132 | $fa-var-cloud: "\f0c2"; 133 | $fa-var-cloud-download: "\f0ed"; 134 | $fa-var-cloud-upload: "\f0ee"; 135 | $fa-var-cny: "\f157"; 136 | $fa-var-code: "\f121"; 137 | $fa-var-code-fork: "\f126"; 138 | $fa-var-codepen: "\f1cb"; 139 | $fa-var-coffee: "\f0f4"; 140 | $fa-var-cog: "\f013"; 141 | $fa-var-cogs: "\f085"; 142 | $fa-var-columns: "\f0db"; 143 | $fa-var-comment: "\f075"; 144 | $fa-var-comment-o: "\f0e5"; 145 | $fa-var-comments: "\f086"; 146 | $fa-var-comments-o: "\f0e6"; 147 | $fa-var-compass: "\f14e"; 148 | $fa-var-compress: "\f066"; 149 | $fa-var-copy: "\f0c5"; 150 | $fa-var-copyright: "\f1f9"; 151 | $fa-var-credit-card: "\f09d"; 152 | $fa-var-crop: "\f125"; 153 | $fa-var-crosshairs: "\f05b"; 154 | $fa-var-css3: "\f13c"; 155 | $fa-var-cube: "\f1b2"; 156 | $fa-var-cubes: "\f1b3"; 157 | $fa-var-cut: "\f0c4"; 158 | $fa-var-cutlery: "\f0f5"; 159 | $fa-var-dashboard: "\f0e4"; 160 | $fa-var-database: "\f1c0"; 161 | $fa-var-dedent: "\f03b"; 162 | $fa-var-delicious: "\f1a5"; 163 | $fa-var-desktop: "\f108"; 164 | $fa-var-deviantart: "\f1bd"; 165 | $fa-var-digg: "\f1a6"; 166 | $fa-var-dollar: "\f155"; 167 | $fa-var-dot-circle-o: "\f192"; 168 | $fa-var-download: "\f019"; 169 | $fa-var-dribbble: "\f17d"; 170 | $fa-var-dropbox: "\f16b"; 171 | $fa-var-drupal: "\f1a9"; 172 | $fa-var-edit: "\f044"; 173 | $fa-var-eject: "\f052"; 174 | $fa-var-ellipsis-h: "\f141"; 175 | $fa-var-ellipsis-v: "\f142"; 176 | $fa-var-empire: "\f1d1"; 177 | $fa-var-envelope: "\f0e0"; 178 | $fa-var-envelope-o: "\f003"; 179 | $fa-var-envelope-square: "\f199"; 180 | $fa-var-eraser: "\f12d"; 181 | $fa-var-eur: "\f153"; 182 | $fa-var-euro: "\f153"; 183 | $fa-var-exchange: "\f0ec"; 184 | $fa-var-exclamation: "\f12a"; 185 | $fa-var-exclamation-circle: "\f06a"; 186 | $fa-var-exclamation-triangle: "\f071"; 187 | $fa-var-expand: "\f065"; 188 | $fa-var-external-link: "\f08e"; 189 | $fa-var-external-link-square: "\f14c"; 190 | $fa-var-eye: "\f06e"; 191 | $fa-var-eye-slash: "\f070"; 192 | $fa-var-eyedropper: "\f1fb"; 193 | $fa-var-facebook: "\f09a"; 194 | $fa-var-facebook-square: "\f082"; 195 | $fa-var-fast-backward: "\f049"; 196 | $fa-var-fast-forward: "\f050"; 197 | $fa-var-fax: "\f1ac"; 198 | $fa-var-female: "\f182"; 199 | $fa-var-fighter-jet: "\f0fb"; 200 | $fa-var-file: "\f15b"; 201 | $fa-var-file-archive-o: "\f1c6"; 202 | $fa-var-file-audio-o: "\f1c7"; 203 | $fa-var-file-code-o: "\f1c9"; 204 | $fa-var-file-excel-o: "\f1c3"; 205 | $fa-var-file-image-o: "\f1c5"; 206 | $fa-var-file-movie-o: "\f1c8"; 207 | $fa-var-file-o: "\f016"; 208 | $fa-var-file-pdf-o: "\f1c1"; 209 | $fa-var-file-photo-o: "\f1c5"; 210 | $fa-var-file-picture-o: "\f1c5"; 211 | $fa-var-file-powerpoint-o: "\f1c4"; 212 | $fa-var-file-sound-o: "\f1c7"; 213 | $fa-var-file-text: "\f15c"; 214 | $fa-var-file-text-o: "\f0f6"; 215 | $fa-var-file-video-o: "\f1c8"; 216 | $fa-var-file-word-o: "\f1c2"; 217 | $fa-var-file-zip-o: "\f1c6"; 218 | $fa-var-files-o: "\f0c5"; 219 | $fa-var-film: "\f008"; 220 | $fa-var-filter: "\f0b0"; 221 | $fa-var-fire: "\f06d"; 222 | $fa-var-fire-extinguisher: "\f134"; 223 | $fa-var-flag: "\f024"; 224 | $fa-var-flag-checkered: "\f11e"; 225 | $fa-var-flag-o: "\f11d"; 226 | $fa-var-flash: "\f0e7"; 227 | $fa-var-flask: "\f0c3"; 228 | $fa-var-flickr: "\f16e"; 229 | $fa-var-floppy-o: "\f0c7"; 230 | $fa-var-folder: "\f07b"; 231 | $fa-var-folder-o: "\f114"; 232 | $fa-var-folder-open: "\f07c"; 233 | $fa-var-folder-open-o: "\f115"; 234 | $fa-var-font: "\f031"; 235 | $fa-var-forward: "\f04e"; 236 | $fa-var-foursquare: "\f180"; 237 | $fa-var-frown-o: "\f119"; 238 | $fa-var-futbol-o: "\f1e3"; 239 | $fa-var-gamepad: "\f11b"; 240 | $fa-var-gavel: "\f0e3"; 241 | $fa-var-gbp: "\f154"; 242 | $fa-var-ge: "\f1d1"; 243 | $fa-var-gear: "\f013"; 244 | $fa-var-gears: "\f085"; 245 | $fa-var-gift: "\f06b"; 246 | $fa-var-git: "\f1d3"; 247 | $fa-var-git-square: "\f1d2"; 248 | $fa-var-github: "\f09b"; 249 | $fa-var-github-alt: "\f113"; 250 | $fa-var-github-square: "\f092"; 251 | $fa-var-gittip: "\f184"; 252 | $fa-var-glass: "\f000"; 253 | $fa-var-globe: "\f0ac"; 254 | $fa-var-google: "\f1a0"; 255 | $fa-var-google-plus: "\f0d5"; 256 | $fa-var-google-plus-square: "\f0d4"; 257 | $fa-var-google-wallet: "\f1ee"; 258 | $fa-var-graduation-cap: "\f19d"; 259 | $fa-var-group: "\f0c0"; 260 | $fa-var-h-square: "\f0fd"; 261 | $fa-var-hacker-news: "\f1d4"; 262 | $fa-var-hand-o-down: "\f0a7"; 263 | $fa-var-hand-o-left: "\f0a5"; 264 | $fa-var-hand-o-right: "\f0a4"; 265 | $fa-var-hand-o-up: "\f0a6"; 266 | $fa-var-hdd-o: "\f0a0"; 267 | $fa-var-header: "\f1dc"; 268 | $fa-var-headphones: "\f025"; 269 | $fa-var-heart: "\f004"; 270 | $fa-var-heart-o: "\f08a"; 271 | $fa-var-history: "\f1da"; 272 | $fa-var-home: "\f015"; 273 | $fa-var-hospital-o: "\f0f8"; 274 | $fa-var-html5: "\f13b"; 275 | $fa-var-ils: "\f20b"; 276 | $fa-var-image: "\f03e"; 277 | $fa-var-inbox: "\f01c"; 278 | $fa-var-indent: "\f03c"; 279 | $fa-var-info: "\f129"; 280 | $fa-var-info-circle: "\f05a"; 281 | $fa-var-inr: "\f156"; 282 | $fa-var-instagram: "\f16d"; 283 | $fa-var-institution: "\f19c"; 284 | $fa-var-ioxhost: "\f208"; 285 | $fa-var-italic: "\f033"; 286 | $fa-var-joomla: "\f1aa"; 287 | $fa-var-jpy: "\f157"; 288 | $fa-var-jsfiddle: "\f1cc"; 289 | $fa-var-key: "\f084"; 290 | $fa-var-keyboard-o: "\f11c"; 291 | $fa-var-krw: "\f159"; 292 | $fa-var-language: "\f1ab"; 293 | $fa-var-laptop: "\f109"; 294 | $fa-var-lastfm: "\f202"; 295 | $fa-var-lastfm-square: "\f203"; 296 | $fa-var-leaf: "\f06c"; 297 | $fa-var-legal: "\f0e3"; 298 | $fa-var-lemon-o: "\f094"; 299 | $fa-var-level-down: "\f149"; 300 | $fa-var-level-up: "\f148"; 301 | $fa-var-life-bouy: "\f1cd"; 302 | $fa-var-life-buoy: "\f1cd"; 303 | $fa-var-life-ring: "\f1cd"; 304 | $fa-var-life-saver: "\f1cd"; 305 | $fa-var-lightbulb-o: "\f0eb"; 306 | $fa-var-line-chart: "\f201"; 307 | $fa-var-link: "\f0c1"; 308 | $fa-var-linkedin: "\f0e1"; 309 | $fa-var-linkedin-square: "\f08c"; 310 | $fa-var-linux: "\f17c"; 311 | $fa-var-list: "\f03a"; 312 | $fa-var-list-alt: "\f022"; 313 | $fa-var-list-ol: "\f0cb"; 314 | $fa-var-list-ul: "\f0ca"; 315 | $fa-var-location-arrow: "\f124"; 316 | $fa-var-lock: "\f023"; 317 | $fa-var-long-arrow-down: "\f175"; 318 | $fa-var-long-arrow-left: "\f177"; 319 | $fa-var-long-arrow-right: "\f178"; 320 | $fa-var-long-arrow-up: "\f176"; 321 | $fa-var-magic: "\f0d0"; 322 | $fa-var-magnet: "\f076"; 323 | $fa-var-mail-forward: "\f064"; 324 | $fa-var-mail-reply: "\f112"; 325 | $fa-var-mail-reply-all: "\f122"; 326 | $fa-var-male: "\f183"; 327 | $fa-var-map-marker: "\f041"; 328 | $fa-var-maxcdn: "\f136"; 329 | $fa-var-meanpath: "\f20c"; 330 | $fa-var-medkit: "\f0fa"; 331 | $fa-var-meh-o: "\f11a"; 332 | $fa-var-microphone: "\f130"; 333 | $fa-var-microphone-slash: "\f131"; 334 | $fa-var-minus: "\f068"; 335 | $fa-var-minus-circle: "\f056"; 336 | $fa-var-minus-square: "\f146"; 337 | $fa-var-minus-square-o: "\f147"; 338 | $fa-var-mobile: "\f10b"; 339 | $fa-var-mobile-phone: "\f10b"; 340 | $fa-var-money: "\f0d6"; 341 | $fa-var-moon-o: "\f186"; 342 | $fa-var-mortar-board: "\f19d"; 343 | $fa-var-music: "\f001"; 344 | $fa-var-navicon: "\f0c9"; 345 | $fa-var-newspaper-o: "\f1ea"; 346 | $fa-var-openid: "\f19b"; 347 | $fa-var-outdent: "\f03b"; 348 | $fa-var-pagelines: "\f18c"; 349 | $fa-var-paint-brush: "\f1fc"; 350 | $fa-var-paper-plane: "\f1d8"; 351 | $fa-var-paper-plane-o: "\f1d9"; 352 | $fa-var-paperclip: "\f0c6"; 353 | $fa-var-paragraph: "\f1dd"; 354 | $fa-var-paste: "\f0ea"; 355 | $fa-var-pause: "\f04c"; 356 | $fa-var-paw: "\f1b0"; 357 | $fa-var-paypal: "\f1ed"; 358 | $fa-var-pencil: "\f040"; 359 | $fa-var-pencil-square: "\f14b"; 360 | $fa-var-pencil-square-o: "\f044"; 361 | $fa-var-phone: "\f095"; 362 | $fa-var-phone-square: "\f098"; 363 | $fa-var-photo: "\f03e"; 364 | $fa-var-picture-o: "\f03e"; 365 | $fa-var-pie-chart: "\f200"; 366 | $fa-var-pied-piper: "\f1a7"; 367 | $fa-var-pied-piper-alt: "\f1a8"; 368 | $fa-var-pinterest: "\f0d2"; 369 | $fa-var-pinterest-square: "\f0d3"; 370 | $fa-var-plane: "\f072"; 371 | $fa-var-play: "\f04b"; 372 | $fa-var-play-circle: "\f144"; 373 | $fa-var-play-circle-o: "\f01d"; 374 | $fa-var-plug: "\f1e6"; 375 | $fa-var-plus: "\f067"; 376 | $fa-var-plus-circle: "\f055"; 377 | $fa-var-plus-square: "\f0fe"; 378 | $fa-var-plus-square-o: "\f196"; 379 | $fa-var-power-off: "\f011"; 380 | $fa-var-print: "\f02f"; 381 | $fa-var-puzzle-piece: "\f12e"; 382 | $fa-var-qq: "\f1d6"; 383 | $fa-var-qrcode: "\f029"; 384 | $fa-var-question: "\f128"; 385 | $fa-var-question-circle: "\f059"; 386 | $fa-var-quote-left: "\f10d"; 387 | $fa-var-quote-right: "\f10e"; 388 | $fa-var-ra: "\f1d0"; 389 | $fa-var-random: "\f074"; 390 | $fa-var-rebel: "\f1d0"; 391 | $fa-var-recycle: "\f1b8"; 392 | $fa-var-reddit: "\f1a1"; 393 | $fa-var-reddit-square: "\f1a2"; 394 | $fa-var-refresh: "\f021"; 395 | $fa-var-remove: "\f00d"; 396 | $fa-var-renren: "\f18b"; 397 | $fa-var-reorder: "\f0c9"; 398 | $fa-var-repeat: "\f01e"; 399 | $fa-var-reply: "\f112"; 400 | $fa-var-reply-all: "\f122"; 401 | $fa-var-retweet: "\f079"; 402 | $fa-var-rmb: "\f157"; 403 | $fa-var-road: "\f018"; 404 | $fa-var-rocket: "\f135"; 405 | $fa-var-rotate-left: "\f0e2"; 406 | $fa-var-rotate-right: "\f01e"; 407 | $fa-var-rouble: "\f158"; 408 | $fa-var-rss: "\f09e"; 409 | $fa-var-rss-square: "\f143"; 410 | $fa-var-rub: "\f158"; 411 | $fa-var-ruble: "\f158"; 412 | $fa-var-rupee: "\f156"; 413 | $fa-var-save: "\f0c7"; 414 | $fa-var-scissors: "\f0c4"; 415 | $fa-var-search: "\f002"; 416 | $fa-var-search-minus: "\f010"; 417 | $fa-var-search-plus: "\f00e"; 418 | $fa-var-send: "\f1d8"; 419 | $fa-var-send-o: "\f1d9"; 420 | $fa-var-share: "\f064"; 421 | $fa-var-share-alt: "\f1e0"; 422 | $fa-var-share-alt-square: "\f1e1"; 423 | $fa-var-share-square: "\f14d"; 424 | $fa-var-share-square-o: "\f045"; 425 | $fa-var-shekel: "\f20b"; 426 | $fa-var-sheqel: "\f20b"; 427 | $fa-var-shield: "\f132"; 428 | $fa-var-shopping-cart: "\f07a"; 429 | $fa-var-sign-in: "\f090"; 430 | $fa-var-sign-out: "\f08b"; 431 | $fa-var-signal: "\f012"; 432 | $fa-var-sitemap: "\f0e8"; 433 | $fa-var-skype: "\f17e"; 434 | $fa-var-slack: "\f198"; 435 | $fa-var-sliders: "\f1de"; 436 | $fa-var-slideshare: "\f1e7"; 437 | $fa-var-smile-o: "\f118"; 438 | $fa-var-soccer-ball-o: "\f1e3"; 439 | $fa-var-sort: "\f0dc"; 440 | $fa-var-sort-alpha-asc: "\f15d"; 441 | $fa-var-sort-alpha-desc: "\f15e"; 442 | $fa-var-sort-amount-asc: "\f160"; 443 | $fa-var-sort-amount-desc: "\f161"; 444 | $fa-var-sort-asc: "\f0de"; 445 | $fa-var-sort-desc: "\f0dd"; 446 | $fa-var-sort-down: "\f0dd"; 447 | $fa-var-sort-numeric-asc: "\f162"; 448 | $fa-var-sort-numeric-desc: "\f163"; 449 | $fa-var-sort-up: "\f0de"; 450 | $fa-var-soundcloud: "\f1be"; 451 | $fa-var-space-shuttle: "\f197"; 452 | $fa-var-spinner: "\f110"; 453 | $fa-var-spoon: "\f1b1"; 454 | $fa-var-spotify: "\f1bc"; 455 | $fa-var-square: "\f0c8"; 456 | $fa-var-square-o: "\f096"; 457 | $fa-var-stack-exchange: "\f18d"; 458 | $fa-var-stack-overflow: "\f16c"; 459 | $fa-var-star: "\f005"; 460 | $fa-var-star-half: "\f089"; 461 | $fa-var-star-half-empty: "\f123"; 462 | $fa-var-star-half-full: "\f123"; 463 | $fa-var-star-half-o: "\f123"; 464 | $fa-var-star-o: "\f006"; 465 | $fa-var-steam: "\f1b6"; 466 | $fa-var-steam-square: "\f1b7"; 467 | $fa-var-step-backward: "\f048"; 468 | $fa-var-step-forward: "\f051"; 469 | $fa-var-stethoscope: "\f0f1"; 470 | $fa-var-stop: "\f04d"; 471 | $fa-var-strikethrough: "\f0cc"; 472 | $fa-var-stumbleupon: "\f1a4"; 473 | $fa-var-stumbleupon-circle: "\f1a3"; 474 | $fa-var-subscript: "\f12c"; 475 | $fa-var-suitcase: "\f0f2"; 476 | $fa-var-sun-o: "\f185"; 477 | $fa-var-superscript: "\f12b"; 478 | $fa-var-support: "\f1cd"; 479 | $fa-var-table: "\f0ce"; 480 | $fa-var-tablet: "\f10a"; 481 | $fa-var-tachometer: "\f0e4"; 482 | $fa-var-tag: "\f02b"; 483 | $fa-var-tags: "\f02c"; 484 | $fa-var-tasks: "\f0ae"; 485 | $fa-var-taxi: "\f1ba"; 486 | $fa-var-tencent-weibo: "\f1d5"; 487 | $fa-var-terminal: "\f120"; 488 | $fa-var-text-height: "\f034"; 489 | $fa-var-text-width: "\f035"; 490 | $fa-var-th: "\f00a"; 491 | $fa-var-th-large: "\f009"; 492 | $fa-var-th-list: "\f00b"; 493 | $fa-var-thumb-tack: "\f08d"; 494 | $fa-var-thumbs-down: "\f165"; 495 | $fa-var-thumbs-o-down: "\f088"; 496 | $fa-var-thumbs-o-up: "\f087"; 497 | $fa-var-thumbs-up: "\f164"; 498 | $fa-var-ticket: "\f145"; 499 | $fa-var-times: "\f00d"; 500 | $fa-var-times-circle: "\f057"; 501 | $fa-var-times-circle-o: "\f05c"; 502 | $fa-var-tint: "\f043"; 503 | $fa-var-toggle-down: "\f150"; 504 | $fa-var-toggle-left: "\f191"; 505 | $fa-var-toggle-off: "\f204"; 506 | $fa-var-toggle-on: "\f205"; 507 | $fa-var-toggle-right: "\f152"; 508 | $fa-var-toggle-up: "\f151"; 509 | $fa-var-trash: "\f1f8"; 510 | $fa-var-trash-o: "\f014"; 511 | $fa-var-tree: "\f1bb"; 512 | $fa-var-trello: "\f181"; 513 | $fa-var-trophy: "\f091"; 514 | $fa-var-truck: "\f0d1"; 515 | $fa-var-try: "\f195"; 516 | $fa-var-tty: "\f1e4"; 517 | $fa-var-tumblr: "\f173"; 518 | $fa-var-tumblr-square: "\f174"; 519 | $fa-var-turkish-lira: "\f195"; 520 | $fa-var-twitch: "\f1e8"; 521 | $fa-var-twitter: "\f099"; 522 | $fa-var-twitter-square: "\f081"; 523 | $fa-var-umbrella: "\f0e9"; 524 | $fa-var-underline: "\f0cd"; 525 | $fa-var-undo: "\f0e2"; 526 | $fa-var-university: "\f19c"; 527 | $fa-var-unlink: "\f127"; 528 | $fa-var-unlock: "\f09c"; 529 | $fa-var-unlock-alt: "\f13e"; 530 | $fa-var-unsorted: "\f0dc"; 531 | $fa-var-upload: "\f093"; 532 | $fa-var-usd: "\f155"; 533 | $fa-var-user: "\f007"; 534 | $fa-var-user-md: "\f0f0"; 535 | $fa-var-users: "\f0c0"; 536 | $fa-var-video-camera: "\f03d"; 537 | $fa-var-vimeo-square: "\f194"; 538 | $fa-var-vine: "\f1ca"; 539 | $fa-var-vk: "\f189"; 540 | $fa-var-volume-down: "\f027"; 541 | $fa-var-volume-off: "\f026"; 542 | $fa-var-volume-up: "\f028"; 543 | $fa-var-warning: "\f071"; 544 | $fa-var-wechat: "\f1d7"; 545 | $fa-var-weibo: "\f18a"; 546 | $fa-var-weixin: "\f1d7"; 547 | $fa-var-wheelchair: "\f193"; 548 | $fa-var-wifi: "\f1eb"; 549 | $fa-var-windows: "\f17a"; 550 | $fa-var-won: "\f159"; 551 | $fa-var-wordpress: "\f19a"; 552 | $fa-var-wrench: "\f0ad"; 553 | $fa-var-xing: "\f168"; 554 | $fa-var-xing-square: "\f169"; 555 | $fa-var-yahoo: "\f19e"; 556 | $fa-var-yelp: "\f1e9"; 557 | $fa-var-yen: "\f157"; 558 | $fa-var-youtube: "\f167"; 559 | $fa-var-youtube-play: "\f16a"; 560 | $fa-var-youtube-square: "\f166"; 561 | 562 | -------------------------------------------------------------------------------- /assets/scss/font-awesome/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "spinning"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | -------------------------------------------------------------------------------- /assets/scss/ionic.app.scss: -------------------------------------------------------------------------------- 1 | /* 2 | To customize the look and feel of Ionic, you can override the variables 3 | in ionic's _variables.scss file. 4 | 5 | For example, you might change some of the default colors: 6 | 7 | $light: #fff !default; 8 | $stable: #f8f8f8 !default; 9 | $positive: #387ef5 !default; 10 | $calm: #11c1f3 !default; 11 | $balanced: #33cd5f !default; 12 | $energized: #ffc900 !default; 13 | $assertive: #ef473a !default; 14 | $royal: #886aea !default; 15 | $dark: #444 !default; 16 | */ 17 | 18 | // The path for our ionicons font files, relative to the built CSS in www/css 19 | // relative to www/css 20 | $ionicons-font-path: "../fonts" !default; 21 | 22 | // Include all of Ionic 23 | @import "../../bower_components/ionic/scss/ionic"; 24 | @import "style"; 25 | 26 | -------------------------------------------------------------------------------- /assets/scss/style.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * This entire file is automatically loaded into ionic.app.scss so do not add it to index.html 3 | */ 4 | 5 | @font-face { 6 | font-family: 'fontawesome'; 7 | src:url('../fonts/fontawesome-webfont.eot'); 8 | src:url('../fonts/fontawesome-webfont.eot') format('embedded-opentype'), 9 | url('../fonts/fontawesome-webfont.woff') format('woff'), 10 | url('../fonts/fontawesome-webfont.ttf') format('truetype'), 11 | url('../fonts/fontawesome-webfont.svg') format('svg'); 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | 16 | .fa { 17 | font-family: "fontawesome"; 18 | } 19 | 20 | @import "font-awesome/font-awesome"; 21 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typeScriptIonic", 3 | "private": "true", 4 | "devDependencies": { 5 | "ionic": "driftyco/ionic-bower#1.0.0-beta.14", 6 | "angular-mocks": "1.3.6" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | app 4 | 5 | An Ionic Framework and Cordova project. 6 | 7 | 8 | Ionic Framework Team 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /cucumber.conf.js: -------------------------------------------------------------------------------- 1 | // protractor configuration file for cucumber 2 | exports.config = { 3 | allScriptsTimeout: 11000, 4 | 5 | specs: [ 6 | 'features/**/*.feature' 7 | ], 8 | 9 | capabilities: { 10 | 'browserName': 'chrome' 11 | }, 12 | 13 | baseUrl: 'http://localhost:8000/', 14 | 15 | framework: 'cucumber', 16 | cucumberOpts: { 17 | require: 'features/', 18 | format: "pretty" 19 | } 20 | }; -------------------------------------------------------------------------------- /features/components/home.feature: -------------------------------------------------------------------------------- 1 | Feature: Home 2 | As a user 3 | I want to visit the home page 4 | So that I can see the welcome message and log out 5 | 6 | Scenario: Redirect to home 7 | Given I visit "/" 8 | Then I should be redirected to the home page 9 | 10 | Scenario: See welcome message 11 | Given I visit the home page 12 | Then I should see "Welcome to ionic" 13 | And see a "Logout" button 14 | And see an instance of "ion-navicon" 15 | 16 | Scenario: Logout of application 17 | Given I visit "/app/home" 18 | And I see a "Logout" control 19 | And I click on "Logout" 20 | Given I should be redirected to the login page 21 | -------------------------------------------------------------------------------- /features/components/login.feature: -------------------------------------------------------------------------------- 1 | Feature: Login 2 | As a user 3 | I want to visit the login page 4 | So that I can access the application 5 | 6 | Scenario: See login page 7 | Given I visit the login page 8 | Then I should see heading "Login" 9 | And see a "Login" button 10 | And not see an instance of "ion-navicon.activated" 11 | 12 | Scenario: Fill in login form 13 | Given I visit the login page 14 | And fill in "username" with "Julie" 15 | And fill in "password" with "myPassword" 16 | Then "username" should be "defaultJulie" 17 | And "password" should be "myPassword" 18 | 19 | Scenario: Submit the login form 20 | Given I visit the login page 21 | And press "Login" 22 | Then I should be redirected to the home page 23 | -------------------------------------------------------------------------------- /features/step_definitions/forms.js: -------------------------------------------------------------------------------- 1 | var chai = require('chai'); 2 | chai.use(require('chai-as-promised')); 3 | var expect = chai.expect; 4 | 5 | var steps = function () { 6 | var Given = When = Then = this.defineStep 7 | 8 | Given(/press "([^"]*)"$/, function (text, next) { 9 | this.browser.findElement(this.by.cssContainingText('a,button,[ng-click]', text)).click(); 10 | next(); 11 | }); 12 | 13 | this.Then(/^fill in "([^"]*)" with "([^"]*)"$/, function (fieldName, value, next) { 14 | this.browser.element(this.by.model('vm.' + fieldName)).sendKeys(value); 15 | next(); 16 | }); 17 | 18 | this.Then(/^"([^"]*)" should be "([^"]*)"$/, function (fieldName, value, next) { 19 | expect(this.browser.element(this.by.model('vm.' + fieldName)).getAttribute('value')).to.become(value).and.notify(next); 20 | }); 21 | 22 | 23 | }; 24 | 25 | module.exports = steps; -------------------------------------------------------------------------------- /features/step_definitions/pages.js: -------------------------------------------------------------------------------- 1 | var chai = require('chai'); 2 | chai.use(require('chai-as-promised')); 3 | var expect = chai.expect; 4 | 5 | var steps = function () { 6 | var Given = When = Then = this.defineStep 7 | 8 | // centralize page definitions and navigation to them 9 | var pages = { 10 | 'home': '/app/home', 11 | 'login': '/app/login' 12 | } 13 | 14 | Given(/visit the (\w+) page$/, function (pageName, next) { 15 | this.browser.get('http://localhost:8000/#' + pages[pageName]); 16 | next(); 17 | }); 18 | 19 | Given(/visit "([^"]*)"$/, function (link, next) { 20 | this.browser.get('http://localhost:8000/#' + link); 21 | next(); 22 | }); 23 | 24 | Given(/click on "([^"]*)"$/, function (text, next) { 25 | this.browser.findElement(this.by.cssContainingText('a,button,[ng-click]', text)).click(); 26 | next(); 27 | }); 28 | 29 | Then(/^I? ?(should )?be redirected to "([^"]*)"$/, function (ignore1, newLink, next) { 30 | expect(this.browser.getLocationAbsUrl()).to.become(newLink).and.notify(next); 31 | }); 32 | 33 | Then(/^I? ?(should )?be redirected to the (\w+) page$/, function (ignore1, pageName, next) { 34 | expect(this.browser.getLocationAbsUrl()).to.become(pages[pageName]).and.notify(next); 35 | }); 36 | }; 37 | 38 | module.exports = steps; -------------------------------------------------------------------------------- /features/step_definitions/text.js: -------------------------------------------------------------------------------- 1 | var chai = require('chai'); 2 | chai.use(require('chai-as-promised')); 3 | var expect = chai.expect; 4 | 5 | var steps = function () { 6 | var Given = When = Then = this.defineStep 7 | 8 | Then(/^I? ?(should )?see heading "([^"]*)"$/, function (ignore1, text, next) { 9 | expect(this.browser.isElementPresent(this.by.cssContainingText('h1,h2,h3,h4,h5,h6', text))).to.become(true).and.notify(next); 10 | }); 11 | 12 | Then(/^I? ?(should )?not see heading "([^"]*)"$/, function (ignore1, text, next) { 13 | expect(this.browser.isElementPresent(this.by.cssContainingText('h1,h2,h3,h4,h5,h6', text))).to.become(false).and.notify(next); 14 | }); 15 | 16 | Then(/^I? ?(should )?see a "([^"]*)" control$/, function (ignore1, text, next) { 17 | expect(this.browser.isElementPresent(this.by.cssContainingText('a,button,[ng-click]', text))).to.become(true).and.notify(next); 18 | }); 19 | 20 | Then(/^I? ?(should )?not see a "([^"]*)" control$/, function (ignore1, text, next) { 21 | expect(this.browser.isElementPresent(this.by.cssContainingText('a,button,[ng-click]', text))).to.become(false).and.notify(next); 22 | }); 23 | 24 | Then(/^I? ?(should )?see a "([^"]*)" button$/, function (ignore1, text, next) { 25 | expect(this.browser.isElementPresent(this.by.partialButtonText(text))).to.become(true).and.notify(next); 26 | }); 27 | 28 | Then(/^I? ?(should )?not see a "([^"]*)" button$/, function (ignore1, text, next) { 29 | expect(this.browser.isElementPresent(this.by.partialButtonText(text))).to.become(false).and.notify(next); 30 | }); 31 | 32 | Then(/^I? ?(should )?not see an instance of "([^"]*)"$/, function (ignore1, cssClass, next) { 33 | expect(this.browser.isElementPresent(this.by.css('.' + cssClass))).to.become(false).and.notify(next); 34 | }); 35 | 36 | Then(/^I? ?(should )?see an instance of "([^"]*)"$/, function (ignore1, cssClass, next) { 37 | expect(this.browser.isElementPresent(this.by.css('.' + cssClass))).to.become(true).and.notify(next); 38 | }); 39 | 40 | Then(/^I? ?(should )?see "([^"]*)"$/, function (ignore1, text, next) { 41 | expect(this.browser.isElementPresent(this.by.cssContainingText('body', text))).to.become(true).and.notify(next); 42 | }); 43 | 44 | Then(/^I? ?(should )?not see "([^"]*)"$/, function (ignore1, text, next) { 45 | expect(this.browser.isElementPresent(this.by.cssContainingText('body', text))).to.become(false).and.notify(next); 46 | }); 47 | }; 48 | 49 | module.exports = steps; -------------------------------------------------------------------------------- /features/support/steps.js: -------------------------------------------------------------------------------- 1 | var pc = require('protractor-cucumber'); 2 | 3 | var steps = function () { 4 | this.World = pc.world('http://localhost:4444/wd/hub', { 5 | browser: 'chrome', 6 | timeout: 100000 7 | }); 8 | 9 | this.After(function (callback) { 10 | this.quit(callback); 11 | }); 12 | }; 13 | 14 | module.exports = steps; -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var argv = require('yargs').argv; // for args parsing 3 | var spawn = require('child_process').spawn; 4 | var gutil = require('gulp-util'); 5 | var bower = require('bower'); 6 | var concat = require('gulp-concat-sourcemap'); 7 | var sass = require('gulp-sass'); 8 | var minifyCss = require('gulp-minify-css'); 9 | var rename = require('gulp-rename'); 10 | var sh = require('shelljs'); 11 | var notify = require("gulp-notify"); 12 | var sourcemaps = require('gulp-sourcemaps'); 13 | 14 | var testFilePattern = 'src/**/*.spec.ts'; 15 | var paths = { 16 | e2e: ['src/**/*.e2e.ts', './lib/definitions/e2e-definitions/**/*.d.ts'], 17 | sass: ['./assets/scss/**/*.scss', './assets/scss/*.scss'], 18 | ts: ['src/*.ts', 'src/**/*.ts', 'lib/**/*.ts', '!lib/definitions/e2e-definitions/**/*.d.ts', '!src/*.js', '!src/**/*.js'], 19 | tsds: ['*.d.ts', 'tsd/**/*.d.ts', 'src/*.d.ts', 'src/**/*.d.ts', 'lib/definitions/**/*.d.ts', '!lib/definitions/e2e-definitions/**/*.d.ts', '!src/**/*.e2e.ts'], 20 | tsSpec: ['src/**/*.spec.ts'], 21 | html: ['src/**/*.html'], 22 | lib: ['lib/**/*.js'], 23 | fonts: ['bower_components/ionic/fonts/*', 'assets/fonts/*'], 24 | index: ['assets/index.html'], 25 | images: ['assets/images/*'], 26 | testJs: ['www/test/unit.js'] 27 | }; 28 | 29 | gulp.task('default', ['html', 'lib', 'css', 'fonts', 'images', 'index', 'ts', 'tsTest', 'tsE2E']); 30 | 31 | /* 32 | * this task re-builds the project before watching it 33 | */ 34 | gulp.task('watch', function () { 35 | var p; 36 | 37 | gulp.watch('gulpfile.js', spawnChildren); 38 | 39 | function spawnChildren(e) { 40 | // kill previous spawned process 41 | if (p) { 42 | p.kill(); 43 | } 44 | 45 | // `spawn` a child `gulp` process linked to the parent `stdio` 46 | p = spawn('gulp', ['watch-tasks'], {stdio: 'inherit'}); 47 | } 48 | spawnChildren(); 49 | }); 50 | 51 | gulp.task('watch-tasks', function () { 52 | gulp.watch(paths.e2e, ['tsE2E', 'tslint']); 53 | gulp.watch(paths.sass, ['css']); 54 | gulp.watch(paths.ts.concat(paths.tsds), ['ts', 'tsTest', 'tsE2E', 'tslint']); 55 | gulp.watch(paths.html, ['html']); 56 | gulp.watch(paths.fonts, ['fonts']); 57 | gulp.watch(paths.images, ['images']); 58 | gulp.watch(paths.index, ['index']); 59 | gulp.watch(paths.lib, ['lib']); 60 | gulp.watch(paths.testJs, ['runJustTest']); 61 | }) 62 | 63 | /* 64 | * purges all generated files 65 | */ 66 | var clean = require('gulp-clean'); 67 | gulp.task('clean', ['cleanCss', 'cleanHtml', 'cleanFonts', 'cleanImages', 'cleanIndex']); 68 | gulp.task('cleanCss', function () { 69 | return gulp.src(['www/css'], {read: false}) 70 | .pipe(clean()); 71 | }); 72 | gulp.task('cleanFonts', function () { 73 | return gulp.src(['www/fonts'], {read: false}) 74 | .pipe(clean()); 75 | }); 76 | gulp.task('cleanImages', function () { 77 | return gulp.src(['www/images'], {read: false}) 78 | .pipe(clean()); 79 | }); 80 | gulp.task('cleanHtml', function () { 81 | return gulp.src(['www/js/template.js'], {read: false}) 82 | .pipe(clean()); 83 | }); 84 | gulp.task('cleanIndex', function () { 85 | return gulp.src(['www/index.html'], {read: false}) 86 | .pipe(clean()); 87 | }); 88 | 89 | /* 90 | * copies important external dependencies into the working folder 91 | */ 92 | var mainBowerFiles = require('main-bower-files'); 93 | gulp.task('lib', function () { 94 | return gulp.src(['bower_components/ionic/js/ionic.bundle.js'].concat(paths.lib, mainBowerFiles(), '!**/*.css')) 95 | .pipe(sourcemaps.init({debug: true})) 96 | .pipe(concat('lib.js')) 97 | .pipe(sourcemaps.write('./maps')) 98 | .pipe(gulp.dest('www/js')); 99 | }); 100 | 101 | /* 102 | * copies fonts from external dependencies 103 | */ 104 | gulp.task('fonts', ['cleanFonts'], function () { 105 | return gulp.src(paths.fonts) 106 | .pipe(gulp.dest('www/fonts')); 107 | }); 108 | 109 | /* 110 | * copies images from external dependencies 111 | */ 112 | gulp.task('images', ['cleanImages'], function () { 113 | return gulp.src(paths.images) 114 | .pipe(gulp.dest('www/images')); 115 | }); 116 | 117 | /* 118 | * copies index.html from assets folder 119 | */ 120 | gulp.task('index', ['cleanIndex'], function () { 121 | return gulp.src(paths.index) 122 | .pipe(htmlmin({collapseWhitespace: true})) 123 | .pipe(gulp.dest('www')); 124 | }); 125 | 126 | /* 127 | * compiles CSS from SCSS 128 | */ 129 | gulp.task('css', ['cleanCss'], function (done) { 130 | gulp.src(paths.sass) 131 | .pipe(sourcemaps.init()) 132 | .pipe(sass({errLogToConsole: true, sync: true})) 133 | .pipe(minifyCss({ 134 | keepSpecialComments: 0 135 | })) 136 | .pipe(sourcemaps.write('./map')) 137 | .pipe(gulp.dest('www/css')) 138 | .on('end', done); 139 | }); 140 | 141 | /* 142 | * Compiles TypeScript 143 | */ 144 | var ts = require('gulp-typescript'); 145 | var ngAnnotate = require('gulp-ng-annotate'); 146 | var uglify = require('gulp-uglify'); 147 | var tsProject = ts.createProject({ 148 | noImplicitAny: false, 149 | removeComments: true, 150 | module: 'commonjs', 151 | target: 'ES5', 152 | sortOutput: true, 153 | declarationFiles: false, 154 | noExternalResolve: true 155 | }); 156 | gulp.task('ts', function () { 157 | return gulp.src(paths.ts.concat(paths.tsds, ['!' + testFilePattern])) 158 | .pipe(sourcemaps.init({debug: true})) 159 | .pipe(ts(tsProject)) 160 | .pipe(concat('app.js')) 161 | .pipe(ngAnnotate({remove: true, add: true, single_quotes: true})) 162 | .pipe(uglify({mangle: true})) 163 | .pipe(sourcemaps.write('./maps')) 164 | .pipe(gulp.dest('www/js')) 165 | }); 166 | 167 | var tsTestProject = ts.createProject({ 168 | noImplicitAny: false, 169 | removeComments: false, 170 | module: 'commonjs', 171 | target: 'ES5', 172 | sortOutput: true, 173 | declarationFiles: false, 174 | noExternalResolve: false 175 | }); 176 | gulp.task('tsTest', ['ts'], function () { 177 | return gulp.src(paths.tsSpec) 178 | .pipe(sourcemaps.init({debug: true})) 179 | .pipe(ts(tsTestProject)) 180 | .pipe(concat('unit.js')) 181 | .pipe(ngAnnotate({remove: true, add: true, single_quotes: true})) 182 | .pipe(sourcemaps.write('./maps')) 183 | .pipe(gulp.dest('www/test')) 184 | }); 185 | 186 | var tsE2EProject = ts.createProject({ 187 | noImplicitAny: false, 188 | removeComments: false, 189 | module: 'commonjs', 190 | target: 'ES5', 191 | sortOutput: true, 192 | declarationFiles: false, 193 | noExternalResolve: true 194 | }); 195 | gulp.task('tsE2E', ['ts'], function () { 196 | return gulp.src(paths.e2e) 197 | .pipe(sourcemaps.init({debug: true})) 198 | .pipe(ts(tsE2EProject)) 199 | .pipe(concat('e2e.js')) 200 | .pipe(ngAnnotate({remove: true, add: true, single_quotes: true})) 201 | .pipe(sourcemaps.write('./maps')) 202 | .pipe(gulp.dest('www/test')) 203 | }); 204 | 205 | /* 206 | * runs TypeScript linter 207 | */ 208 | var tslint = require('gulp-tslint'); 209 | gulp.task('tslint', [], function () { 210 | gulp.src(['src/**/*.ts', '!src/**/*.d.ts']) 211 | .pipe(tslint()) 212 | .pipe(notify(function (file) { 213 | if (file.tslint.failureCount === 0) { 214 | // Don't show something if success 215 | return false; 216 | } 217 | var errors = JSON.parse(file.tslint.output).map(function (data) { 218 | if (data.failure) { 219 | return file.relative + '[' + data.startPosition.line + ',' + data.startPosition.character + ']: ' + data.failure + ' (' + data.ruleName + ')'; 220 | } 221 | }); 222 | return file.relative + " (" + errors.length + " errors)\n" + errors.join("\n"); 223 | })) 224 | }); 225 | 226 | /* 227 | * Stringifies all templates 228 | */ 229 | var templateCache = require('gulp-angular-templatecache'); 230 | var htmlmin = require('gulp-htmlmin'); 231 | gulp.task('html', ['cleanHtml'], function () { 232 | return gulp.src(paths.html) 233 | .pipe(sourcemaps.init({debug: true})) 234 | .pipe(htmlmin({collapseWhitespace: true})) 235 | .pipe(templateCache({standalone: true})) 236 | .pipe(concat('templates.js')) 237 | .pipe(sourcemaps.write('./maps')) 238 | .pipe(gulp.dest('www/js')); 239 | }); 240 | 241 | /* 242 | * just runs existing compiled tests (not good for standalone, but good for watcher) 243 | */ 244 | var karma = require('gulp-karma'); 245 | gulp.task('runJustTest', [], function (done) { 246 | // Be sure to return the stream 247 | // NOTE: Using the fake 'foobar' so as to run the files 248 | // listed in karma.conf.js INSTEAD of what was passed to 249 | // gulp.src ! 250 | return gulp.src('foobar') 251 | .pipe(karma({ 252 | configFile: 'karma.conf.js', 253 | action: 'run' 254 | })); 255 | }); 256 | 257 | // compiles AND runs the tests 258 | gulp.task('test', ['tsTest', 'lib', 'html'], function (done) { 259 | // Be sure to return the stream 260 | // NOTE: Using the fake 'foobar' so as to run the files 261 | // listed in karma.conf.js INSTEAD of what was passed to 262 | // gulp.src ! 263 | return gulp.src('foobar') 264 | .pipe(karma({ 265 | configFile: 'karma.conf.js', 266 | action: 'run' 267 | })); 268 | }); 269 | 270 | gulp.task('install', ['git-check'], function () { 271 | return bower.commands.install() 272 | .on('log', function (data) { 273 | gutil.log('bower', gutil.colors.cyan(data.id), data.message); 274 | }); 275 | }); 276 | 277 | gulp.task('git-check', function (done) { 278 | if (!sh.which('git')) { 279 | console.log( 280 | ' ' + gutil.colors.red('Git is not installed.'), 281 | '\n Git, the version control system, is required to download Ionic.', 282 | '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', 283 | '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' 284 | ); 285 | process.exit(1); 286 | } 287 | done(); 288 | }); 289 | -------------------------------------------------------------------------------- /ionic.project: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typeScriptIonic", 3 | "app_id": "" 4 | } -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // Generated on Tue Dec 30 2014 02:13:52 GMT-0800 (PST) 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | 7 | // base path that will be used to resolve all patterns (eg. files, exclude) 8 | basePath: './', 9 | 10 | 11 | // frameworks to use 12 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 13 | frameworks: ['jasmine'], 14 | 15 | 16 | // list of files / patterns to load in the browser 17 | files: [ 18 | 'www/js/lib.js', 19 | 'bower_components/angular-mocks/angular-mocks.js', 20 | 'www/js/app.js', 21 | 'www/js/templates.js', 22 | 'www/test/unit.js' 23 | ], 24 | 25 | 26 | // list of files to exclude 27 | exclude: [], 28 | 29 | 30 | // preprocess matching files before serving them to the browser 31 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 32 | preprocessors: { 33 | '**/*.js': ['sourcemap'] 34 | }, 35 | 36 | 37 | // test results reporter to use 38 | // possible values: 'dots', 'progress' 39 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 40 | reporters: ['progress', 'notify', 'junit'], 41 | 42 | // https://www.npmjs.com/package/karma-notify-reporter 43 | notifyReporter: { 44 | reportEachFailure: true, // Default: false, Will notify on every failed sepc 45 | reportSuccess: false, // Default: true, Will notify when a suite was successful 46 | }, 47 | 48 | // web server port 49 | port: 9876, 50 | 51 | 52 | // enable / disable colors in the output (reporters and logs) 53 | colors: true, 54 | 55 | 56 | // level of logging 57 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 58 | logLevel: config.LOG_INFO, 59 | 60 | 61 | // enable / disable watching file and executing tests whenever any file changes 62 | autoWatch: true, 63 | 64 | 65 | // start these browsers 66 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 67 | browsers: ['Chrome'], 68 | 69 | // junit output for use in CI 70 | junitReporter: { 71 | outputFile: 'test_out/unit.xml', 72 | suite: 'unit' 73 | }, 74 | 75 | 76 | // Continuous Integration mode 77 | // if true, Karma captures browsers, runs the tests and exits 78 | singleRun: false 79 | }); 80 | }; 81 | -------------------------------------------------------------------------------- /lib/definitions/e2e-definitions/jasmine/jasmine.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for Jasmine 2.0 2 | // Project: http://pivotal.github.com/jasmine/ 3 | // Definitions by: Boris Yankov , Theodore Brown 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | 7 | // For ddescribe / iit use : https://github.com/borisyankov/DefinitelyTyped/blob/master/karma-jasmine/karma-jasmine.d.ts 8 | 9 | declare function describe(description: string, specDefinitions: () => void): void; 10 | // declare function ddescribe(description: string, specDefinitions: () => void): void; Not a part of jasmine. Angular team adds these 11 | declare function xdescribe(description: string, specDefinitions: () => void): void; 12 | 13 | declare function it(expectation: string, assertion?: () => void): void; 14 | declare function it(expectation: string, assertion?: (done: () => void) => void): void; 15 | // declare function iit(expectation: string, assertion?: () => void): void; Not a part of jasmine. Angular team adds these 16 | // declare function iit(expectation: string, assertion?: (done: () => void) => void): void; Not a part of jasmine. Angular team adds these 17 | declare function xit(expectation: string, assertion?: () => void): void; 18 | declare function xit(expectation: string, assertion?: (done: () => void) => void): void; 19 | 20 | /** If you call the function pending anywhere in the spec body, no matter the expectations, the spec will be marked pending. */ 21 | declare function pending(): void; 22 | 23 | declare function beforeEach(action: () => void): void; 24 | declare function beforeEach(action: (done: () => void) => void): void; 25 | declare function afterEach(action: () => void): void; 26 | declare function afterEach(action: (done: () => void) => void): void; 27 | 28 | declare function expect(spy: Function): jasmine.Matchers; 29 | declare function expect(actual: any): jasmine.Matchers; 30 | 31 | declare function spyOn(object: any, method: string): jasmine.Spy; 32 | 33 | declare function runs(asyncMethod: Function): void; 34 | declare function waitsFor(latchMethod: () => boolean, failureMessage?: string, timeout?: number): void; 35 | declare function waits(timeout?: number): void; 36 | 37 | declare module jasmine { 38 | 39 | var clock: () => Clock; 40 | 41 | function any(aclass: any): Any; 42 | function objectContaining(sample: any): ObjectContaining; 43 | function createSpy(name: string, originalFn?: Function): Spy; 44 | function createSpyObj(baseName: string, methodNames: any[]): any; 45 | function createSpyObj(baseName: string, methodNames: any[]): T; 46 | function pp(value: any): string; 47 | function getEnv(): Env; 48 | function addMatchers(matchers: any): Any; 49 | 50 | interface Any { 51 | 52 | new (expectedClass: any): any; 53 | 54 | jasmineMatches(other: any): boolean; 55 | jasmineToString(): string; 56 | } 57 | 58 | interface ObjectContaining { 59 | new (sample: any): any; 60 | 61 | jasmineMatches(other: any, mismatchKeys: any[], mismatchValues: any[]): boolean; 62 | jasmineToString(): string; 63 | } 64 | 65 | interface Block { 66 | 67 | new (env: Env, func: SpecFunction, spec: Spec): any; 68 | 69 | execute(onComplete: () => void): void; 70 | } 71 | 72 | interface WaitsBlock extends Block { 73 | new (env: Env, timeout: number, spec: Spec): any; 74 | } 75 | 76 | interface WaitsForBlock extends Block { 77 | new (env: Env, timeout: number, latchFunction: SpecFunction, message: string, spec: Spec): any; 78 | } 79 | 80 | interface Clock { 81 | install(): void; 82 | uninstall(): void; 83 | /** Calls to any registered callback are triggered when the clock is ticked forward via the jasmine.clock().tick function, which takes a number of milliseconds. */ 84 | tick(ms: number): void; 85 | } 86 | 87 | interface Env { 88 | setTimeout: any; 89 | clearTimeout: void; 90 | setInterval: any; 91 | clearInterval: void; 92 | updateInterval: number; 93 | 94 | currentSpec: Spec; 95 | 96 | matchersClass: Matchers; 97 | 98 | version(): any; 99 | versionString(): string; 100 | nextSpecId(): number; 101 | addReporter(reporter: Reporter): void; 102 | execute(): void; 103 | describe(description: string, specDefinitions: () => void): Suite; 104 | // ddescribe(description: string, specDefinitions: () => void): Suite; Not a part of jasmine. Angular team adds these 105 | beforeEach(beforeEachFunction: () => void): void; 106 | currentRunner(): Runner; 107 | afterEach(afterEachFunction: () => void): void; 108 | xdescribe(desc: string, specDefinitions: () => void): XSuite; 109 | it(description: string, func: () => void): Spec; 110 | // iit(description: string, func: () => void): Spec; Not a part of jasmine. Angular team adds these 111 | xit(desc: string, func: () => void): XSpec; 112 | compareRegExps_(a: RegExp, b: RegExp, mismatchKeys: string[], mismatchValues: string[]): boolean; 113 | compareObjects_(a: any, b: any, mismatchKeys: string[], mismatchValues: string[]): boolean; 114 | equals_(a: any, b: any, mismatchKeys: string[], mismatchValues: string[]): boolean; 115 | contains_(haystack: any, needle: any): boolean; 116 | addEqualityTester(equalityTester: (a: any, b: any, env: Env, mismatchKeys: string[], mismatchValues: string[]) => boolean): void; 117 | specFilter(spec: Spec): boolean; 118 | } 119 | 120 | interface FakeTimer { 121 | 122 | new (): any; 123 | 124 | reset(): void; 125 | tick(millis: number): void; 126 | runFunctionsWithinRange(oldMillis: number, nowMillis: number): void; 127 | scheduleFunction(timeoutKey: any, funcToCall: () => void, millis: number, recurring: boolean): void; 128 | } 129 | 130 | interface HtmlReporter { 131 | new (): any; 132 | } 133 | 134 | interface HtmlSpecFilter { 135 | new (): any; 136 | } 137 | 138 | interface Result { 139 | type: string; 140 | } 141 | 142 | interface NestedResults extends Result { 143 | description: string; 144 | 145 | totalCount: number; 146 | passedCount: number; 147 | failedCount: number; 148 | 149 | skipped: boolean; 150 | 151 | rollupCounts(result: NestedResults): void; 152 | log(values: any): void; 153 | getItems(): Result[]; 154 | addResult(result: Result): void; 155 | passed(): boolean; 156 | } 157 | 158 | interface MessageResult extends Result { 159 | values: any; 160 | trace: Trace; 161 | } 162 | 163 | interface ExpectationResult extends Result { 164 | matcherName: string; 165 | passed(): boolean; 166 | expected: any; 167 | actual: any; 168 | message: string; 169 | trace: Trace; 170 | } 171 | 172 | interface Trace { 173 | name: string; 174 | message: string; 175 | stack: any; 176 | } 177 | 178 | interface PrettyPrinter { 179 | 180 | new (): any; 181 | 182 | format(value: any): void; 183 | iterateObject(obj: any, fn: (property: string, isGetter: boolean) => void): void; 184 | emitScalar(value: any): void; 185 | emitString(value: string): void; 186 | emitArray(array: any[]): void; 187 | emitObject(obj: any): void; 188 | append(value: any): void; 189 | } 190 | 191 | interface StringPrettyPrinter extends PrettyPrinter { 192 | } 193 | 194 | interface Queue { 195 | 196 | new (env: any): any; 197 | 198 | env: Env; 199 | ensured: boolean[]; 200 | blocks: Block[]; 201 | running: boolean; 202 | index: number; 203 | offset: number; 204 | abort: boolean; 205 | 206 | addBefore(block: Block, ensure?: boolean): void; 207 | add(block: any, ensure?: boolean): void; 208 | insertNext(block: any, ensure?: boolean): void; 209 | start(onComplete?: () => void): void; 210 | isRunning(): boolean; 211 | next_(): void; 212 | results(): NestedResults; 213 | } 214 | 215 | interface Matchers { 216 | 217 | new (env: Env, actual: any, spec: Env, isNot?: boolean): any; 218 | 219 | env: Env; 220 | actual: any; 221 | spec: Env; 222 | isNot?: boolean; 223 | message(): any; 224 | 225 | toBe(expected: any): boolean; 226 | toEqual(expected: any): boolean; 227 | toMatch(expected: any): boolean; 228 | toBeDefined(): boolean; 229 | toBeUndefined(): boolean; 230 | toBeNull(): boolean; 231 | toBeNaN(): boolean; 232 | toBeTruthy(): boolean; 233 | toBeFalsy(): boolean; 234 | toHaveBeenCalled(): boolean; 235 | toHaveBeenCalledWith(...params: any[]): boolean; 236 | toContain(expected: any): boolean; 237 | toBeLessThan(expected: any): boolean; 238 | toBeGreaterThan(expected: any): boolean; 239 | toBeCloseTo(expected: any, precision: any): boolean; 240 | toContainHtml(expected: string): boolean; 241 | toContainText(expected: string): boolean; 242 | toThrow(expected?: any): boolean; 243 | toThrowError(expected?: any): boolean; 244 | not: Matchers; 245 | 246 | Any: Any; 247 | } 248 | 249 | interface Reporter { 250 | reportRunnerStarting(runner: Runner): void; 251 | reportRunnerResults(runner: Runner): void; 252 | reportSuiteResults(suite: Suite): void; 253 | reportSpecStarting(spec: Spec): void; 254 | reportSpecResults(spec: Spec): void; 255 | log(str: string): void; 256 | } 257 | 258 | interface MultiReporter extends Reporter { 259 | addReporter(reporter: Reporter): void; 260 | } 261 | 262 | interface Runner { 263 | 264 | new (env: Env): any; 265 | 266 | execute(): void; 267 | beforeEach(beforeEachFunction: SpecFunction): void; 268 | afterEach(afterEachFunction: SpecFunction): void; 269 | finishCallback(): void; 270 | addSuite(suite: Suite): void; 271 | add(block: Block): void; 272 | specs(): Spec[]; 273 | suites(): Suite[]; 274 | topLevelSuites(): Suite[]; 275 | results(): NestedResults; 276 | } 277 | 278 | interface SpecFunction { 279 | (spec?: Spec): void; 280 | } 281 | 282 | interface SuiteOrSpec { 283 | id: number; 284 | env: Env; 285 | description: string; 286 | queue: Queue; 287 | } 288 | 289 | interface Spec extends SuiteOrSpec { 290 | 291 | new (env: Env, suite: Suite, description: string): any; 292 | 293 | suite: Suite; 294 | 295 | afterCallbacks: SpecFunction[]; 296 | spies_: Spy[]; 297 | 298 | results_: NestedResults; 299 | matchersClass: Matchers; 300 | 301 | getFullName(): string; 302 | results(): NestedResults; 303 | log(arguments: any): any; 304 | runs(func: SpecFunction): Spec; 305 | addToQueue(block: Block): void; 306 | addMatcherResult(result: Result): void; 307 | expect(actual: any): any; 308 | waits(timeout: number): Spec; 309 | waitsFor(latchFunction: SpecFunction, timeoutMessage?: string, timeout?: number): Spec; 310 | fail(e?: any): void; 311 | getMatchersClass_(): Matchers; 312 | addMatchers(matchersPrototype: any): void; 313 | finishCallback(): void; 314 | finish(onComplete?: () => void): void; 315 | after(doAfter: SpecFunction): void; 316 | execute(onComplete?: () => void): any; 317 | addBeforesAndAftersToQueue(): void; 318 | explodes(): void; 319 | spyOn(obj: any, methodName: string, ignoreMethodDoesntExist: boolean): Spy; 320 | removeAllSpies(): void; 321 | } 322 | 323 | interface XSpec { 324 | id: number; 325 | runs(): void; 326 | } 327 | 328 | interface Suite extends SuiteOrSpec { 329 | 330 | new (env: Env, description: string, specDefinitions: () => void, parentSuite: Suite): any; 331 | 332 | parentSuite: Suite; 333 | 334 | getFullName(): string; 335 | finish(onComplete?: () => void): void; 336 | beforeEach(beforeEachFunction: SpecFunction): void; 337 | afterEach(afterEachFunction: SpecFunction): void; 338 | results(): NestedResults; 339 | add(suiteOrSpec: SuiteOrSpec): void; 340 | specs(): Spec[]; 341 | suites(): Suite[]; 342 | children(): any[]; 343 | execute(onComplete?: () => void): void; 344 | } 345 | 346 | interface XSuite { 347 | execute(): void; 348 | } 349 | 350 | interface Spy { 351 | (...params: any[]): any; 352 | 353 | identity: string; 354 | and: SpyAnd; 355 | calls: Calls; 356 | mostRecentCall: { args: any[]; }; 357 | argsForCall: any[]; 358 | wasCalled: boolean; 359 | callCount: number; 360 | } 361 | 362 | interface SpyAnd { 363 | /** By chaining the spy with and.callThrough, the spy will still track all calls to it but in addition it will delegate to the actual implementation. */ 364 | callThrough(): void; 365 | /** By chaining the spy with and.returnValue, all calls to the function will return a specific value. */ 366 | returnValue(val: any): void; 367 | /** By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied function. */ 368 | callFake(fn: Function): void; 369 | /** By chaining the spy with and.throwError, all calls to the spy will throw the specified value. */ 370 | throwError(msg: string): void; 371 | /** When a calling strategy is used for a spy, the original stubbing behavior can be returned at any time with and.stub. */ 372 | stub(): void; 373 | } 374 | 375 | interface Calls { 376 | /** By chaining the spy with calls.any(), will return false if the spy has not been called at all, and then true once at least one call happens. **/ 377 | any(): boolean; 378 | /** By chaining the spy with calls.count(), will return the number of times the spy was called **/ 379 | count(): number; 380 | /** By chaining the spy with calls.argsFor(), will return the arguments passed to call number index **/ 381 | argsFor(index: number): any[]; 382 | /** By chaining the spy with calls.allArgs(), will return the arguments to all calls **/ 383 | allArgs(): any[]; 384 | /** By chaining the spy with calls.all(), will return the context (the this) and arguments passed all calls **/ 385 | all(): any; 386 | /** By chaining the spy with calls.mostRecent(), will return the context (the this) and arguments for the most recent call **/ 387 | mostRecent(): any; 388 | /** By chaining the spy with calls.first(), will return the context (the this) and arguments for the first call **/ 389 | first(): any; 390 | /** By chaining the spy with calls.reset(), will clears all tracking for a spy **/ 391 | reset(): void; 392 | } 393 | 394 | interface Util { 395 | inherit(childClass: Function, parentClass: Function): any; 396 | formatException(e: any): any; 397 | htmlEscape(str: string): string; 398 | argsToArray(args: any): any; 399 | extend(destination: any, source: any): any; 400 | } 401 | 402 | interface JsApiReporter extends Reporter { 403 | 404 | started: boolean; 405 | finished: boolean; 406 | result: any; 407 | messages: any; 408 | 409 | new (): any; 410 | 411 | suites(): Suite[]; 412 | summarize_(suiteOrSpec: SuiteOrSpec): any; 413 | results(): any; 414 | resultsForSpec(specId: any): any; 415 | log(str: any): any; 416 | resultsForSpecs(specIds: any): any; 417 | summarizeResult_(result: any): any; 418 | } 419 | 420 | interface Jasmine { 421 | Spec: Spec; 422 | clock: Clock; 423 | util: Util; 424 | } 425 | 426 | export var HtmlReporter: HtmlReporter; 427 | export var HtmlSpecFilter: HtmlSpecFilter; 428 | export var DEFAULT_TIMEOUT_INTERVAL: number; 429 | } 430 | -------------------------------------------------------------------------------- /lib/definitions/ionic/ionic.d.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Define a global ionic object 4 | */ 5 | declare var ionic: Ionic.IBase; 6 | 7 | declare module Ionic 8 | { 9 | 10 | //#region Base 11 | interface IBase 12 | { 13 | Platform: IPlatform; 14 | DomUtil: IDomUtil; 15 | EventController: IEventController; 16 | 17 | //#region EventController Aliases 18 | /** 19 | * @param eventType The event to trigger 20 | * @param data The data for the event. Hint: pass in {target: targetElement} 21 | * @param bubbles Whether the event should bubble up the DOM 22 | * @param cancelable Whether the event should be cancelable 23 | */ 24 | trigger(eventType: string, data: Object, bubbles?: boolean, cancelable?: boolean): void; 25 | 26 | /** 27 | * Listen to an event on an element. 28 | * 29 | * @param type The event to listen for 30 | * @param callback The listener to be called 31 | * @param element The element to listen for the event on 32 | */ 33 | on(type: string, callback: () => void, element: Element): void; 34 | 35 | 36 | /** 37 | * Remove an event listener 38 | * 39 | * @param type The event to listen for 40 | * @param callback The listener to be called 41 | * @param element The element to listen for the event on 42 | */ 43 | off(type: string, callback: () => void, element: Element): void; 44 | 45 | /** 46 | * Add an event listener for a gesture on an element. 47 | * 48 | * @param eventType The gesture event to listen for 49 | * @param callback The function to call when the gesture happens 50 | * @param element The angular element to listen for the event on 51 | */ 52 | onGesture(eventType: string, callback: () => void, element: Element): void; 53 | onGesture(eventType: "hold", callback: () => void, element: Element): void; 54 | onGesture(eventType: "tap", callback: () => void, element: Element): void; 55 | onGesture(eventType: "doubletap", callback: () => void, element: Element): void; 56 | onGesture(eventType: "drag", callback: () => void, element: Element): void; 57 | onGesture(eventType: "dragstart", callback: () => void, element: Element): void; 58 | onGesture(eventType: "dragend", callback: () => void, element: Element): void; 59 | onGesture(eventType: "dragup", callback: () => void, element: Element): void; 60 | onGesture(eventType: "dragdown", callback: () => void, element: Element): void; 61 | onGesture(eventType: "dragleft", callback: () => void, element: Element): void; 62 | onGesture(eventType: "dragright", callback: () => void, element: Element): void; 63 | onGesture(eventType: "swipe", callback: () => void, element: Element): void; 64 | onGesture(eventType: "swipeup", callback: () => void, element: Element): void; 65 | onGesture(eventType: "swipedown", callback: () => void, element: Element): void; 66 | onGesture(eventType: "swipeleft", callback: () => void, element: Element): void; 67 | onGesture(eventType: "swiperight", callback: () => void, element: Element): void; 68 | onGesture(eventType: "transform", callback: () => void, element: Element): void; 69 | onGesture(eventType: "transformstart", callback: () => void, element: Element): void; 70 | onGesture(eventType: "transformend", callback: () => void, element: Element): void; 71 | onGesture(eventType: "rotate", callback: () => void, element: Element): void; 72 | onGesture(eventType: "pinch", callback: () => void, element: Element): void; 73 | onGesture(eventType: "pinchin", callback: () => void, element: Element): void; 74 | onGesture(eventType: "pinchout", callback: () => void, element: Element): void; 75 | onGesture(eventType: "touch", callback: () => void, element: Element): void; 76 | onGesture(eventType: "release", callback: () => void, element: Element): void; 77 | 78 | /** 79 | * Remove an event listener for a gesture on an element. 80 | * 81 | * @param eventType The gesture event 82 | * @param callback The listener that was added earlier 83 | * @param element The element the listener was added on 84 | */ 85 | offGesture(eventType: string, callback: () => void, element: Element): void; 86 | offGesture(eventType: "hold", callback: () => void, element: Element): void; 87 | offGesture(eventType: "tap", callback: () => void, element: Element): void; 88 | offGesture(eventType: "doubletap", callback: () => void, element: Element): void; 89 | offGesture(eventType: "drag", callback: () => void, element: Element): void; 90 | offGesture(eventType: "dragstart", callback: () => void, element: Element): void; 91 | offGesture(eventType: "dragend", callback: () => void, element: Element): void; 92 | offGesture(eventType: "dragup", callback: () => void, element: Element): void; 93 | offGesture(eventType: "dragdown", callback: () => void, element: Element): void; 94 | offGesture(eventType: "dragleft", callback: () => void, element: Element): void; 95 | offGesture(eventType: "dragright", callback: () => void, element: Element): void; 96 | offGesture(eventType: "swipe", callback: () => void, element: Element): void; 97 | offGesture(eventType: "swipeup", callback: () => void, element: Element): void; 98 | offGesture(eventType: "swipedown", callback: () => void, element: Element): void; 99 | offGesture(eventType: "swipeleft", callback: () => void, element: Element): void; 100 | offGesture(eventType: "swiperight", callback: () => void, element: Element): void; 101 | offGesture(eventType: "transform", callback: () => void, element: Element): void; 102 | offGesture(eventType: "transformstart", callback: () => void, element: Element): void; 103 | offGesture(eventType: "transformend", callback: () => void, element: Element): void; 104 | offGesture(eventType: "rotate", callback: () => void, element: Element): void; 105 | offGesture(eventType: "pinch", callback: () => void, element: Element): void; 106 | offGesture(eventType: "pinchin", callback: () => void, element: Element): void; 107 | offGesture(eventType: "pinchout", callback: () => void, element: Element): void; 108 | offGesture(eventType: "touch", callback: () => void, element: Element): void; 109 | offGesture(eventType: "release", callback: () => void, element: Element): void; 110 | 111 | //#endregion 112 | 113 | //#region DomUtil Aliases 114 | 115 | /** 116 | * Calls requestAnimationFrame, or a polyfill if not available. 117 | * 118 | * @param callback The function to call when the next frame happens 119 | */ 120 | requestAnimationFrame(callback: () => void): void; 121 | 122 | /** 123 | * When given a callback, if that callback is called 100 times between animation frames, adding Throttle will make it only run the last of the 100 calls. 124 | * 125 | * @param callback a function which will be throttled to requestAnimationFrame 126 | */ 127 | animationFrameThrottle(callback: () => void): void; 128 | 129 | //#endregion 130 | } 131 | //#endregion 132 | 133 | //#region Config Provider 134 | /** 135 | * Angular service: $ionicConfigProvider 136 | * 137 | * $ionicConfigProvider can be used during the configuration phase of your app to change how Ionic works. 138 | */ 139 | interface IConfigProvider 140 | { 141 | /** 142 | * Set whether Ionic should prefetch all templateUrls defined in $stateProvider.state. Default true. 143 | * If set to false, the user will have to wait for a template to be fetched the first time he/she is going to a a new page. 144 | * 145 | * @param shouldPrefetch Whether Ionic should prefetch templateUrls defined in $stateProvider.state(). Default true. 146 | */ 147 | prefetchTemplates(shouldPrefetch: boolean): boolean; 148 | } 149 | //#endregion 150 | 151 | //#region Platform 152 | 153 | interface IDevice 154 | { 155 | /** Get the version of Cordova running on the device. */ 156 | cordova: string; 157 | /** 158 | * The device.model returns the name of the device's model or product. The value is set 159 | * by the device manufacturer and may be different across versions of the same product. 160 | */ 161 | model: string; 162 | /** device.name is deprecated as of version 2.3.0. Use device.model instead. */ 163 | name: string; 164 | /** Get the device's operating system name. */ 165 | platform: string; 166 | /** Get the device's Universally Unique Identifier (UUID). */ 167 | uuid: string; 168 | /** Get the operating system version. */ 169 | version: string; 170 | } 171 | 172 | 173 | interface IPlatform 174 | { 175 | //#region Properties 176 | /** 177 | * Whether the device is ready 178 | */ 179 | isReady: boolean; 180 | 181 | /** 182 | * Whether the device is full screen. 183 | */ 184 | isFullScreen: boolean; 185 | 186 | /** 187 | * An array of all platforms found. 188 | */ 189 | platforms: string[]; 190 | 191 | /** 192 | * What grade the current platform is. 193 | */ 194 | grade: string; 195 | //#endregion 196 | 197 | 198 | /** 199 | * Trigger a callback once the device is ready, or immediately if the device is already ready. 200 | * This method can be run from anywhere and does not need to be wrapped by any additional methods. 201 | * When the app is within a WebView (Cordova), it'll fire the callback once the device is ready. 202 | * If the app is within a web browser, it'll fire the callback after window.load. 203 | */ 204 | ready(callback: () => void): void; 205 | 206 | /** 207 | * Set the grade of the device: 'a', 'b', or 'c'. 'a' is the best (most css features enabled), 208 | * 'c' is the worst. By default, sets the grade depending on the current device. 209 | */ 210 | setGrade(grade): void; 211 | 212 | /** 213 | * Return the current device (given by Cordova). 214 | */ 215 | device(): IDevice; 216 | 217 | /** 218 | * Check if we are running within a WebView (such as Cordova). 219 | */ 220 | isWebView(): boolean; 221 | 222 | /** 223 | * Whether we are running on iPad. 224 | */ 225 | isIPad(): boolean; 226 | 227 | /** 228 | * Whether we are running on iOS. 229 | */ 230 | isIOS(): boolean; 231 | 232 | /** 233 | * Whether we are running on Android 234 | */ 235 | isAndroid(): boolean; 236 | 237 | /** 238 | * Whether we are running on Windows Phone. 239 | */ 240 | isWindowsPhone(): boolean; 241 | 242 | /** 243 | * The name of the current platform. 244 | */ 245 | platform(): string; 246 | 247 | /** 248 | * The version of the current device platform. 249 | */ 250 | version(): string; 251 | 252 | /** 253 | * Exit the application. 254 | */ 255 | exitApp(): void; 256 | 257 | /** 258 | * Shows or hides the device status bar (in Cordova). 259 | * 260 | * @param showShould Whether or not to show the status bar. 261 | */ 262 | showStatusBar(shouldShow: boolean): void; 263 | 264 | /** 265 | * Sets whether the app is full screen or not (in Cordova). 266 | * 267 | * @param showFullScreen Whether or not to set the app to full screen. Defaults to true. 268 | * @param showStatusBar Whether or not to show the device's status bar. Defaults to false. 269 | */ 270 | fullScreen(showFullScreen: boolean, showStatusBar: boolean): void; 271 | } 272 | //#endregion 273 | 274 | // #region Dom Utils 275 | 276 | /** 277 | * ionic.DomUtil 278 | */ 279 | interface IDomUtil 280 | { 281 | /** 282 | * alias: ionic.requestAnimationFrame 283 | * 284 | * Calls requestAnimationFrame, or a polyfill if not available. 285 | * 286 | * @param callback The function to call when the next frame happens 287 | */ 288 | requestAnimationFrame(callback: () => void): void; 289 | 290 | /** 291 | * alias: ionic.animationFrameThrottle 292 | * 293 | * When given a callback, if that callback is called 100 times between animation frames, adding Throttle will make it only run the last of the 100 calls. 294 | * 295 | * @param callback a function which will be throttled to requestAnimationFrame 296 | */ 297 | animationFrameThrottle(callback: () => void): void; 298 | 299 | /** 300 | * Find an element's scroll offset within its container 301 | * 302 | * @param element The element to find the offset of 303 | */ 304 | getPositionInParent(element: Element): void; 305 | 306 | /** 307 | * The Window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser 308 | * call a specified function to update an animation before the next repaint. 309 | * The method takes as an argument a callback to be invoked before the repaint. 310 | * 311 | * @param callback The function to be called 312 | */ 313 | ready(callback: () => void): void; 314 | 315 | /** 316 | * Get a rect representing the bounds of the given textNode. 317 | */ 318 | getTextBounds(textNode: Element): { 319 | left: number; 320 | right: number; 321 | top: number; 322 | bottom: number; 323 | width: number; 324 | height: number; 325 | }; 326 | 327 | /** 328 | * Get the first index of a child node within the given element of the specified type. 329 | * 330 | * @param element The element to find the index of. 331 | * @param type The nodeName to match children of element against. 332 | */ 333 | getChildIndex(element: Element, type: string): number; 334 | 335 | /** 336 | * Returns the closest parent of element matching the className, or null. 337 | * 338 | * @param element 339 | * @param className 340 | */ 341 | getParentWithClass(element: Element, className: string): Element 342 | 343 | /** 344 | * Returns the closest parent or self matching the className, or null. 345 | */ 346 | getParentOrSelfWithClass(element: Element, className: string): Element; 347 | 348 | 349 | /** 350 | * Returns whether {x,y} fits within the rectangle defined by {x1,y1,x2,y2}. 351 | * 352 | * @param x 353 | * @param y 354 | * @param x1 355 | * @param y1 356 | * @param x2 357 | * @param y2 358 | */ 359 | rectContains(x: number, y: number, x1: number, y1: number, x2: number, y2: number): boolean; 360 | } 361 | //#endregion 362 | 363 | //#region EventController 364 | 365 | /** 366 | * Angular service: $ionicGesture 367 | */ 368 | interface IEventController 369 | { 370 | /** 371 | * alias: ionic.trigger 372 | * 373 | * @param eventType The event to trigger 374 | * @param data The data for the event. Hint: pass in {target: targetElement} 375 | * @param bubbles Whether the event should bubble up the DOM 376 | * @param cancelable Whether the event should be cancelable 377 | */ 378 | trigger(eventType: string, data: Object, bubbles?: boolean, cancelable?: boolean): void; 379 | 380 | /** 381 | * alias: ionic.on 382 | * 383 | * Listen to an event on an element 384 | * 385 | * @param type The event to listen for 386 | * @param callback The listener to be called 387 | * @param element The element to listen for the event on 388 | */ 389 | on(type: string, callback: () => void, element: Element): void; 390 | 391 | /** 392 | * alias: ionic.off 393 | * 394 | * Remove an event listener 395 | * 396 | * @param type The event to listen for 397 | * @param callback The listener to be called 398 | * @param element The element to listen for the event on 399 | */ 400 | off(type: string, callback: () => void, element: Element): void; 401 | 402 | /** 403 | * alias: ionic.onGesture 404 | * 405 | * Add an event listener for a gesture on an element. 406 | * 407 | * @param eventType The gesture event to listen for 408 | * @param callback The function to call when the gesture happens 409 | * @param element The angular element to listen for the event on 410 | */ 411 | onGesture(eventType: string, callback: () => void, element: Element): void; 412 | onGesture(eventType: "hold", callback: () => void, element: Element): void; 413 | onGesture(eventType: "tap", callback: () => void, element: Element): void; 414 | onGesture(eventType: "doubletap", callback: () => void, element: Element): void; 415 | onGesture(eventType: "drag", callback: () => void, element: Element): void; 416 | onGesture(eventType: "dragstart", callback: () => void, element: Element): void; 417 | onGesture(eventType: "dragend", callback: () => void, element: Element): void; 418 | onGesture(eventType: "dragup", callback: () => void, element: Element): void; 419 | onGesture(eventType: "dragdown", callback: () => void, element: Element): void; 420 | onGesture(eventType: "dragleft", callback: () => void, element: Element): void; 421 | onGesture(eventType: "dragright", callback: () => void, element: Element): void; 422 | onGesture(eventType: "swipe", callback: () => void, element: Element): void; 423 | onGesture(eventType: "swipeup", callback: () => void, element: Element): void; 424 | onGesture(eventType: "swipedown", callback: () => void, element: Element): void; 425 | onGesture(eventType: "swipeleft", callback: () => void, element: Element): void; 426 | onGesture(eventType: "swiperight", callback: () => void, element: Element): void; 427 | onGesture(eventType: "transform", callback: () => void, element: Element): void; 428 | onGesture(eventType: "transformstart", callback: () => void, element: Element): void; 429 | onGesture(eventType: "transformend", callback: () => void, element: Element): void; 430 | onGesture(eventType: "rotate", callback: () => void, element: Element): void; 431 | onGesture(eventType: "pinch", callback: () => void, element: Element): void; 432 | onGesture(eventType: "pinchin", callback: () => void, element: Element): void; 433 | onGesture(eventType: "pinchout", callback: () => void, element: Element): void; 434 | onGesture(eventType: "touch", callback: () => void, element: Element): void; 435 | onGesture(eventType: "release", callback: () => void, element: Element): void; 436 | 437 | /** 438 | * alias: ionic.offGesture 439 | * 440 | * Remove an event listener for a gesture on an element. 441 | * 442 | * @param eventType The gesture event 443 | * @param callback The listener that was added earlier 444 | * @param element The element the listener was added on 445 | */ 446 | offGesture(eventType: string, callback: () => void, element: Element): void; 447 | offGesture(eventType: "hold", callback: () => void, element: Element): void; 448 | offGesture(eventType: "tap", callback: () => void, element: Element): void; 449 | offGesture(eventType: "doubletap", callback: () => void, element: Element): void; 450 | offGesture(eventType: "drag", callback: () => void, element: Element): void; 451 | offGesture(eventType: "dragstart", callback: () => void, element: Element): void; 452 | offGesture(eventType: "dragend", callback: () => void, element: Element): void; 453 | offGesture(eventType: "dragup", callback: () => void, element: Element): void; 454 | offGesture(eventType: "dragdown", callback: () => void, element: Element): void; 455 | offGesture(eventType: "dragleft", callback: () => void, element: Element): void; 456 | offGesture(eventType: "dragright", callback: () => void, element: Element): void; 457 | offGesture(eventType: "swipe", callback: () => void, element: Element): void; 458 | offGesture(eventType: "swipeup", callback: () => void, element: Element): void; 459 | offGesture(eventType: "swipedown", callback: () => void, element: Element): void; 460 | offGesture(eventType: "swipeleft", callback: () => void, element: Element): void; 461 | offGesture(eventType: "swiperight", callback: () => void, element: Element): void; 462 | offGesture(eventType: "transform", callback: () => void, element: Element): void; 463 | offGesture(eventType: "transformstart", callback: () => void, element: Element): void; 464 | offGesture(eventType: "transformend", callback: () => void, element: Element): void; 465 | offGesture(eventType: "rotate", callback: () => void, element: Element): void; 466 | offGesture(eventType: "pinch", callback: () => void, element: Element): void; 467 | offGesture(eventType: "pinchin", callback: () => void, element: Element): void; 468 | offGesture(eventType: "pinchout", callback: () => void, element: Element): void; 469 | offGesture(eventType: "touch", callback: () => void, element: Element): void; 470 | offGesture(eventType: "release", callback: () => void, element: Element): void; 471 | } 472 | 473 | //#endregion 474 | 475 | //#region Ionic Position 476 | 477 | /** 478 | * Angular service: $ionicPosition 479 | * 480 | * A set of utility methods that can be use to retrieve position of DOM elements. 481 | * It is meant to be used where we need to absolute-position DOM elements in relation to other, existing elements (this is the case for tooltips, popovers, etc.). 482 | */ 483 | interface IPosition 484 | { 485 | /** 486 | * Get the current coordinates of the element, relative to the offset parent. Read-only equivalent of jQuery's position function. 487 | * 488 | * @param element The element to get the position of 489 | */ 490 | position(element: Element): { 491 | top: number; 492 | left: number; 493 | width: number; 494 | height: number; 495 | } 496 | 497 | /** 498 | * Get the current coordinates of the element, relative to the document. Read-only equivalent of jQuery's offset function. 499 | * 500 | * @param element The element to get offset of 501 | */ 502 | offset(element: Element): { 503 | top: number; 504 | left: number; 505 | width: number; 506 | height: number; 507 | } 508 | } 509 | 510 | //#endregion 511 | 512 | 513 | //#region Action Sheet 514 | interface IActionSheetOptions 515 | { 516 | /** 517 | * Which buttons to show. Each button is an object with a text field. 518 | */ 519 | buttons?: Array<{ text: string }>; 520 | 521 | /** 522 | * The title to show on the action sheet. 523 | */ 524 | titleText?: string; 525 | 526 | /** 527 | * The text for a 'cancel' button on the action sheet. 528 | */ 529 | cancelText?: string; 530 | 531 | /** 532 | * The text for a 'danger' on the action sheet. 533 | */ 534 | destructiveText?: string; 535 | 536 | /** 537 | * Called if the cancel button is pressed, the backdrop is tapped or the hardware back button is pressed. 538 | */ 539 | cancel?: () => void; 540 | 541 | /** 542 | * Called when one of the non-destructive buttons is clicked, with the index of the button that was clicked and the button object. 543 | * Return true to close the action sheet, or false to keep it opened. 544 | */ 545 | buttonClicked?: () => boolean; 546 | 547 | /** 548 | * Called when the destructive button is clicked. Return true to close the action sheet, or false to keep it opened. 549 | */ 550 | destructiveButtonClicked?: () => boolean; 551 | 552 | /** 553 | * Whether to cancel the actionSheet when navigating to a new state. Default true. 554 | */ 555 | cancelOnStateChange?: boolean; 556 | } 557 | 558 | 559 | /** 560 | * Angular service: $ionicActionSheet 561 | * 562 | * The Action Sheet is a slide-up pane that lets the user choose from a set of options. Dangerous options are highlighted in red and made obvious. 563 | * There are easy ways to cancel out of the action sheet, such as tapping the backdrop or even hitting escape on the keyboard for desktop testing. 564 | */ 565 | interface IActionSheet 566 | { 567 | /** 568 | * Load and return a new action sheet. 569 | * A new isolated scope will be created for the action sheet and the new element will be appended into the body. 570 | * 571 | * Returns hideSheet, a function which, when called, hides & cancels the action sheet. 572 | */ 573 | show(options: IActionSheetOptions): () => void; 574 | } 575 | //#endregion 576 | 577 | //#region Backdrop 578 | 579 | /** 580 | * Angular service: $ionicBackdrop 581 | */ 582 | interface IBackdrop 583 | { 584 | /** 585 | * Retains the backdrop. 586 | */ 587 | retain(): void; 588 | 589 | /** 590 | * Releases the backdrop. 591 | */ 592 | release(): void; 593 | } 594 | //#endregion 595 | 596 | //#region Gesture 597 | 598 | /** 599 | * Angular service: $ionicGesture 600 | */ 601 | interface IGesture extends IEventController { } 602 | 603 | //#endregion 604 | 605 | //#region Lists 606 | 607 | /** 608 | * Angular service: $ionicListDelegate 609 | * 610 | * Delegate for controlling the ionList directive. 611 | * Methods called directly on the $ionicListDelegate service will control all lists. Use the $getByHandle method to control specific ionList instances. 612 | */ 613 | interface IListDelegate 614 | { 615 | /** 616 | * Set whether or not this list is showing its reorder buttons. 617 | * Returns whether the reorder buttons are shown. 618 | */ 619 | showReorder(showReorder?: boolean): boolean; 620 | 621 | /** 622 | * Set whether or not this list is showing its delete buttons. 623 | * Returns whether the delete buttons are shown. 624 | */ 625 | showDelete(showDelete?: boolean): boolean; 626 | 627 | /** 628 | * Set whether or not this list is able to swipe to show option buttons. 629 | * Returns whether the list is able to swipe to show option buttons. 630 | */ 631 | canSwipeItems(canSwipeItems?: boolean): boolean; 632 | 633 | /** 634 | * Closes any option buttons on the list that are swiped open. 635 | */ 636 | closeOptionButtons(): void; 637 | 638 | /** 639 | * Return delegate instance that controls only the ionTabs directives with delegate-handle matching the given handle. 640 | */ 641 | $getByHandle(handle: string): IListDelegate; 642 | } 643 | //#endregion 644 | 645 | //#region Loading 646 | interface ILoadingOptions 647 | { 648 | template?: string; 649 | templateUrl?: string; 650 | noBackdrop?: boolean; 651 | delay?: number; 652 | duration?: number; 653 | } 654 | 655 | /** 656 | * Angular service: $ionicLoading 657 | * 658 | * An overlay that can be used to indicate activity while blocking user interaction. 659 | */ 660 | interface ILoading 661 | { 662 | show(opts?: ILoadingOptions): void; 663 | 664 | hide(): void; 665 | } 666 | //#endregion 667 | 668 | //#region Modals 669 | 670 | interface IModalOptions 671 | { 672 | /** 673 | * The scope to be a child of. Default: creates a child of $rootScope. 674 | */ 675 | scope?: ng.IScope; 676 | 677 | /** 678 | * The animation to show & hide with. Default: 'slide-in-up' 679 | */ 680 | animation?: string; 681 | 682 | /** 683 | * Whether to autofocus the first input of the modal when shown. Default: false. 684 | */ 685 | focusFirstInput?: boolean; 686 | 687 | /** 688 | * Whether to close the modal on clicking the backdrop. Default: true. 689 | */ 690 | backdropClickToClose?: boolean; 691 | 692 | /** 693 | * Whether the modal can be closed using the hardware back button on Android and similar devices. Default: true. 694 | */ 695 | hardwareBackButtonClose?: boolean; 696 | } 697 | 698 | /** 699 | * Angular service: $ionicModal 700 | */ 701 | interface IModal 702 | { 703 | /** 704 | * Creates a new modal controller instance. 705 | * 706 | * @param options An IModalOptions object 707 | */ 708 | initialize(options: IModalOptions): void; 709 | 710 | // TODO: add Promise object as returns 711 | 712 | /** 713 | * Show this modal instance 714 | * Returns a promise which is resolved when the modal is finished animating in 715 | */ 716 | show(): any; 717 | 718 | /** 719 | * Hide this modal instance 720 | * Returns a promise which is resolved when the modal is finished animating out 721 | */ 722 | hide(): any; 723 | 724 | /** 725 | * Remove this modal instance from the DOM and clean up 726 | * Returns a promise which is resolved when the modal is finished animating out 727 | */ 728 | remove(): any; 729 | 730 | /** 731 | * Returns whether this modal is currently shown. 732 | */ 733 | isShown(): boolean; 734 | } 735 | 736 | //#endregion 737 | 738 | //#region Navigation 739 | 740 | /** 741 | * Angular service: $ionicNavBarDelegate 742 | * 743 | * Delegate for controlling the ionNavBar directive. 744 | */ 745 | interface INavBarDelegate 746 | { 747 | /** 748 | * Goes back in the view history 749 | * 750 | * @param event The event object (eg from a tap event) 751 | */ 752 | back(event?: Event): void; 753 | 754 | /** 755 | * Aligns the title with the buttons in a given direction 756 | * 757 | * @param direction The direction to the align the title text towards. Available: 'left', 'right', 'center'. Default: 'center'. 758 | */ 759 | align(direction?: string): void; 760 | align(direction: "left"): void; 761 | align(direction: "right"): void; 762 | align(direction: "center"): void; 763 | 764 | /** 765 | * Set/get whether the ionNavBackButton is shown (if it exists). 766 | * Returns whether the back button is shown 767 | * 768 | * @param show Whether to show the back button 769 | */ 770 | showBackButton(show?: boolean): boolean; 771 | 772 | /** 773 | * Set/get whether the ionNavBar is shown 774 | * Returns whether the bar is shown 775 | * 776 | * @param show whether to show the bar 777 | */ 778 | showBar(show?: boolean): boolean; 779 | 780 | /** 781 | * Set the title for the ionNavBar 782 | * 783 | * @param title The new title to show 784 | */ 785 | setTitle(title: string): void; 786 | 787 | /** 788 | * Change the title, transitioning the new title in and the old one out in a given direction 789 | * 790 | * @param title the new title to show 791 | * @param direction the direction to transition the new title in. Available: 'forward', 'back'. 792 | */ 793 | changeTitle(title: string, direction: string): void; 794 | changeTitle(title: string, direction: "forward"): void; 795 | changeTitle(title: string, direction: "back"): void; 796 | 797 | /** 798 | * Returns the current title of the navbar. 799 | */ 800 | getTitle(): string; 801 | 802 | /** 803 | * Returns the previous title of the navbar. 804 | */ 805 | getPreviousTitle(): string; 806 | 807 | /** 808 | * Return a delegate instance that controls only the navBars with delegate-handle matching the given handl 809 | */ 810 | $getByHandle(handle: string): INavBarDelegate; 811 | } 812 | 813 | //#endregion 814 | 815 | //#region Popover 816 | 817 | interface IPopoverOptions 818 | { 819 | /** 820 | * The scope to be a child of. Default: creates a child of $rootScope 821 | */ 822 | scope?: ng.IScope; 823 | 824 | /** 825 | * Whether to autofocus the first input of the popover when shown. Default: false 826 | */ 827 | focusFirstInput?: boolean; 828 | 829 | /** 830 | * Whether to close the popover on clicking the backdrop. Default: true 831 | */ 832 | backdropClickToClose?: boolean; 833 | 834 | /** 835 | * Whether the popover can be closed using the hardware back button on Android and similar devices. Default: true 836 | */ 837 | hardwareBackButtonClose?: boolean; 838 | } 839 | 840 | /** 841 | * Angular service: $ionicPopover 842 | * 843 | * The Popover is a view that floats above an app’s content. 844 | * Popovers provide an easy way to present or gather information from the user and are commonly used in the following situations: 845 | * show more info about the current view, select a commonly used tool or configuration, present a list of actions to perform inside one of your views. 846 | * Put the content of the popover inside of an element 847 | */ 848 | interface IPopover 849 | { 850 | /** 851 | * @param templateString The template string to use as the popovers's content 852 | * @param Options to be passed to the initialize method 853 | */ 854 | fromTemplate(templateString: string, options: IPopoverOptions): IPopover; 855 | 856 | // TODO: promise 857 | /** 858 | * Returns a promise that will be resolved with an instance of an ionicPopover controller ($ionicPopover is built on top of $ionicPopover). 859 | * 860 | * @param templateUrl The url to load the template from 861 | * @param Options to be passed to the initialize method 862 | */ 863 | fromTemplateUrl(templateUrl: string, options: IPopoverOptions): any; 864 | 865 | /** 866 | * Creates a new popover controller instance 867 | * 868 | */ 869 | initialize(options: IPopoverOptions): void; 870 | 871 | // TODO: promise 872 | /** 873 | * Show this popover instance. 874 | * Returns a promise which is resolved when the popover is finished animating in. 875 | * 876 | * @param $event The $event or target element which the popover should align itself next to. 877 | */ 878 | show($event: any): any; 879 | 880 | // TODO: promise 881 | /** 882 | * Hide this popover instance. 883 | * Returns a promise which is resolved when the popover is finished animating out. 884 | */ 885 | hide(): any; 886 | 887 | // TODO: promise 888 | /** 889 | * Remove this popover instance from the DOM and clean up. 890 | * Returns a promise which is resolved when the popover is finished animating out. 891 | */ 892 | remove(): any; 893 | 894 | /** 895 | * Returns whether this popover is currently shown. 896 | */ 897 | isShown(): boolean; 898 | } 899 | 900 | //#endregion 901 | 902 | //#region Popup 903 | 904 | interface IPopupButton 905 | { 906 | text: string; 907 | type: string; 908 | onTap(e: Event): void; 909 | } 910 | 911 | interface IPopupOptions 912 | { 913 | /** 914 | * The title of the popup 915 | */ 916 | title: string; 917 | 918 | /** 919 | * The sub-title of the popup 920 | */ 921 | subTitle?: string; 922 | 923 | /** 924 | * The html template to place in the popup body 925 | */ 926 | template?: string; 927 | 928 | /** 929 | * The URL of an html template to place in the popup body 930 | */ 931 | templateUrl?: string; 932 | 933 | /** 934 | * A scope to link to the popup content 935 | */ 936 | scope?: ng.IScope; 937 | 938 | /** 939 | * Buttons to place in the popup footer 940 | */ 941 | buttons?: Array; 942 | } 943 | 944 | interface IPopupAlertOptions 945 | { 946 | /** 947 | * The title of the popup 948 | */ 949 | title: string; 950 | 951 | /** 952 | * The sub-title of the popup 953 | */ 954 | subTitle?: string; 955 | 956 | /** 957 | * The html template to place in the popup body 958 | */ 959 | template?: string; 960 | 961 | /** 962 | * The URL of an html template to place in the popup body 963 | */ 964 | templateUrl?: string; 965 | 966 | /** 967 | * The text of the OK button 968 | */ 969 | okText?: string; 970 | 971 | /** 972 | * The type of the OK button 973 | */ 974 | okType?: string; 975 | } 976 | 977 | interface IPopupConfirmOptions 978 | { 979 | /** 980 | * The title of the popup 981 | */ 982 | title: string; 983 | 984 | /** 985 | * The sub-title of the popup 986 | */ 987 | subTitle?: string; 988 | 989 | /** 990 | * The html template to place in the popup body 991 | */ 992 | template?: string; 993 | 994 | /** 995 | * The URL of an html template to place in the popup body 996 | */ 997 | templateUrl?: string; 998 | 999 | /** 1000 | * The text of the Cancel button 1001 | */ 1002 | canelText?: string; 1003 | 1004 | /** 1005 | * The type of the Cancel button 1006 | */ 1007 | cancelType?: string; 1008 | 1009 | /** 1010 | * The text of the OK button 1011 | */ 1012 | okText?: string; 1013 | 1014 | /** 1015 | * The type of the OK button 1016 | */ 1017 | okType?: string; 1018 | } 1019 | 1020 | interface IPopupPromptOptions 1021 | { 1022 | /** 1023 | * The title of the popup 1024 | */ 1025 | title: string; 1026 | 1027 | /** 1028 | * The sub-title of the popup 1029 | */ 1030 | subTitle?: string; 1031 | 1032 | /** 1033 | * The html template to place in the popup body 1034 | */ 1035 | template?: string; 1036 | 1037 | /** 1038 | * The URL of an html template to place in the popup body 1039 | */ 1040 | templateUrl?: string; 1041 | 1042 | /** 1043 | * The type of input of use 1044 | */ 1045 | inputType: string; 1046 | 1047 | /** 1048 | * A placeholder to use for the input 1049 | */ 1050 | inputPlaceholder: string; 1051 | 1052 | /** 1053 | * The text of the Cancel button 1054 | */ 1055 | canelText?: string; 1056 | 1057 | /** 1058 | * The type of the Cancel button 1059 | */ 1060 | cancelType?: string; 1061 | 1062 | /** 1063 | * The text of the OK button 1064 | */ 1065 | okText?: string; 1066 | 1067 | /** 1068 | * The type of the OK button 1069 | */ 1070 | okType?: string; 1071 | } 1072 | 1073 | /** 1074 | * Angular service: $ionicPopup 1075 | * 1076 | * The Ionic Popup service allows programmatically creating and showing popup windows that require the user to respond in order to continue. 1077 | * The popup system has support for more flexible versions of the built in alert(), prompt(), and confirm() functions that users are used to, 1078 | * in addition to allowing popups with completely custom content and look. 1079 | * An input can be given an autofocus attribute so it automatically receives focus when the popup first shows. 1080 | * However, depending on certain use-cases this can cause issues with the tap/click system, 1081 | * which is why Ionic prefers using the autofocus attribute as an opt-in feature and not the default. 1082 | */ 1083 | interface IPopup 1084 | { 1085 | // TODO: promise 1086 | /** 1087 | * Show a complex popup. This is the master show function for all popups. 1088 | * A complex popup has a buttons array, with each button having a text and type field, in addition to an onTap function. 1089 | * The onTap function, called when the correspondingbutton on the popup is tapped, 1090 | * will by default close the popup and resolve the popup promise with its return value. 1091 | * If you wish to prevent the default and keep the popup open on button tap, call event.preventDefault() on the passed in tap event. 1092 | * 1093 | * Returns a promise which is resolved when the popup is closed. Has an additional close function, which can be used to programmatically close the popup. 1094 | * 1095 | * @param options The options for the new popup 1096 | */ 1097 | show(options: IPopupOptions): any; 1098 | 1099 | /** 1100 | * Show a simple alert popup with a message and one button that the user can tap to close the popup. 1101 | * 1102 | * Returns a promise which is resolved when the popup is closed. Has one additional function close, which can be called with any value to programmatically close the popup with the given value. 1103 | * 1104 | * @param options The options for showing the alert 1105 | */ 1106 | alert(options: IPopupAlertOptions): any; 1107 | 1108 | /** 1109 | * Show a simple confirm popup with a Cancel and OK button. 1110 | * Resolves the promise with true if the user presses the OK button, and false if the user presses the Cancel button. 1111 | * 1112 | * Returns a promise which is resolved when the popup is closed. Has one additional function close, which can be called with any value to programmatically close the popup with the given value. 1113 | * 1114 | * @parma options The options for showing the confirm popup 1115 | */ 1116 | confirm(options: IPopupConfirmOptions): any; 1117 | 1118 | /** 1119 | * Show a simple prompt popup, which has an input, OK button, and Cancel button. Resolves the promise with the value of the input if the user presses OK, and with undefined if the user presses Cancel. 1120 | * 1121 | * Returns a promise which is resolved when the popup is closed. Has one additional function close, which can be called with any value to programmatically close the popup with the given value. 1122 | * 1123 | * @param options The options for showing the prompt popup 1124 | */ 1125 | prompt(options: IPopupPromptOptions): any; 1126 | } 1127 | 1128 | //#endregion 1129 | 1130 | //#region Scroll 1131 | interface IScrollPosition 1132 | { 1133 | /** 1134 | * The distance the user has scrolled from the left (starts at 0) 1135 | */ 1136 | left: number; 1137 | 1138 | /** 1139 | * The distance the user has scrolled from the top (starts at 0) 1140 | */ 1141 | top: number; 1142 | } 1143 | 1144 | /** 1145 | * Angular service: $ionicScrollDelegate 1146 | * 1147 | * Delegate for controlling scrollViews (created by ionContent and ionScroll directives). 1148 | * Methods called directly on the $ionicScrollDelegate service will control all scroll views. Use the $getByHandle method to control specific scrollViews. 1149 | */ 1150 | interface IScrollDelegate 1151 | { 1152 | /** 1153 | * Tell the scrollView to recalculate the size of its container 1154 | */ 1155 | resize(): void; 1156 | 1157 | 1158 | /** 1159 | * @param shouldAnimate Whether the scroll should animate 1160 | */ 1161 | scrollTop(shouldAnimate?: boolean): void; 1162 | 1163 | 1164 | /** 1165 | * @param shouldAnimate Whether the scroll should animate 1166 | */ 1167 | scrollBottom(shouldAnimate?: boolean): void; 1168 | 1169 | 1170 | 1171 | /** 1172 | * @param left The x-value to scroll to 1173 | * @param top The y-value to scroll to 1174 | * @param shouldAnimate Whether the scroll should animate 1175 | */ 1176 | scrollTo(left: number, top: number, shouldAnimate?: boolean): void; 1177 | 1178 | /** 1179 | * @param left The x-offset to scroll by 1180 | * @param top The y-offset to scroll by 1181 | * @param shouldAnimate Whether the scroll should animate 1182 | */ 1183 | scrollBy(left: number, top: number, shouldAnimate?: boolean): void; 1184 | 1185 | /** 1186 | * @param level Level to zoom to 1187 | * @param animate Whether to animate the zoom 1188 | * @param originLeft Zoom in at given left coordinate 1189 | * @param originTop Zoom in at given top coordinate 1190 | */ 1191 | zoomTo(level: number, animate?: boolean, originLeft?: number, originTop?: number): void; 1192 | 1193 | /** 1194 | * @param factor The factor to zoom by 1195 | * @param animate Whether to animate the zoom 1196 | * @param originLeft Zoom in at given left coordinate 1197 | * @param originTop Zoom in at given top coordinate 1198 | */ 1199 | zoomBy(factor: number, animate?: boolean, originLeft?: number, originTop?: number): void; 1200 | 1201 | /** 1202 | * Returns the scroll position of this view 1203 | */ 1204 | getScrollPosition(): IScrollPosition; 1205 | 1206 | /** 1207 | * Tell the scrollView to scroll to the element with an id matching window.location.hash 1208 | * If no matching element is found, it will scroll to top 1209 | * 1210 | * @param shouldAnimate Whether the scroll should animate 1211 | */ 1212 | anchorScroll(shouldAnimate?: boolean): void; 1213 | 1214 | /** 1215 | * Returns the scrollView associated with this delegate. 1216 | */ 1217 | // TODO: define ScrollView object 1218 | getScrollView(): any; 1219 | 1220 | /** 1221 | * Stop remembering the scroll position for this scrollView 1222 | */ 1223 | forgetScrollPosition(): void; 1224 | 1225 | /** 1226 | * If this scrollView has an id associated with its scroll position, (through calling rememberScrollPosition), and that position is remembered, load the position and scroll to it. 1227 | * 1228 | * @param shouldAnimate Whether the scroll should animate 1229 | */ 1230 | scrollToRememberedPosition(shouldAnimate?: boolean): void; 1231 | 1232 | /** 1233 | * Return a delegate instance that controls only the scrollViews with delegate-handle matching the given handle. 1234 | */ 1235 | $getByHandle(handle: string): IScrollDelegate; 1236 | } 1237 | //#endregion 1238 | 1239 | //#region Side Menus 1240 | 1241 | /** 1242 | * Angular service: $ionicSideMenuDelegate 1243 | * 1244 | * Delegate for controlling the ionSideMenus directive. 1245 | * Methods called directly on the $ionicSideMenuDelegate service will control all side menus. Use the $getByHandle method to control specific ionSideMenus instances. 1246 | */ 1247 | interface ISideMenuDelegate 1248 | { 1249 | /** 1250 | * Toggle the left side menu (if it exists). 1251 | * 1252 | * @param isOpen Whether to open or close the menu. Default: Toggles the menu. 1253 | */ 1254 | toggleLeft(isOpen?: boolean): void; 1255 | 1256 | 1257 | /** 1258 | * Toggle the right side menu (if it exists). 1259 | * 1260 | * @param isOpen Whether to open or close the menu. Default: Toggles the menu. 1261 | */ 1262 | toggleRight(isOpen?: boolean): void; 1263 | 1264 | /** 1265 | * Gets the ratio of open amount over menu width. For example, a menu of width 100 that is opened by 50 pixels is 50% opened, and would return a ratio of 0.5. 1266 | * Returns 0 if nothing is open, between 0 and 1 if left menu is opened/opening, and between 0 and -1 if right menu is opened/opening. 1267 | */ 1268 | getOpenRatio(): number; 1269 | 1270 | /** 1271 | * Returns whether either the left or right menu is currently opened. 1272 | */ 1273 | isOpen(): boolean; 1274 | 1275 | /** 1276 | * Returns whether the left menu is currently opened. 1277 | */ 1278 | isOpenLeft(): boolean; 1279 | 1280 | /** 1281 | * Returns whether the right menu is currently opened. 1282 | */ 1283 | isOpenRight(): boolean; 1284 | 1285 | /** 1286 | * Returns whether the content can be dragged to open side menus. 1287 | * 1288 | * @param canDrag Set whether the content can or cannot be dragged to open side menus 1289 | */ 1290 | canDragContent(canDrag?: boolean): boolean; 1291 | 1292 | /** 1293 | * Returns whether the drag can start only from within the edge of screen threshold. 1294 | * 1295 | * @param value Set whether the content drag can only start if it is below a certain threshold distance from the edge of the screen. If a non-zero number is given, that many pixels is used as the maximum allowed distance from the edge that starts dragging the side menu. If 0 is given, the edge drag threshold is disabled, and dragging from anywhere on the content is allowed. 1296 | */ 1297 | edgeDragThreshold(value: boolean): boolean; 1298 | 1299 | /** 1300 | * Returns whether the drag can start only from within the edge of screen threshold. 1301 | * 1302 | * @param value Set whether the content drag can only start if it is below a certain threshold distance from the edge of the screen. If true is given, the default number of pixels (25) is used as the maximum allowed distance. If false is given, the edge drag threshold is disabled, and dragging from anywhere on the content is allowed. 1303 | */ 1304 | edgeDragThreshold(value: number): boolean; 1305 | 1306 | /** 1307 | * Return a delegate instance that controls only the ionSideMenus directives with delegate-handle matching the given handle. 1308 | */ 1309 | $getByHandle(handle: string): ISideMenuDelegate; 1310 | } 1311 | 1312 | //#endregion 1313 | 1314 | //#region Slide Box 1315 | 1316 | /** 1317 | * Angular service: $ionicSlideBoxDelegate 1318 | * 1319 | * Delegate that controls the ionSlideBox directive. 1320 | * Methods called directly on the $ionicSlideBoxDelegate service will control all slide boxes. Use the $getByHandle method to control specific slide box instances. 1321 | */ 1322 | interface ISlideBoxDelegate 1323 | { 1324 | /** 1325 | * Update the slidebox (for example if using Angular with ng-repeat, resize it for the elements inside). 1326 | */ 1327 | update(): void; 1328 | 1329 | /** 1330 | * @param to The index to slide to 1331 | * @param speed The number of milliseconds for the change to take 1332 | */ 1333 | slide(to: number, speed?: number): void; 1334 | 1335 | /** 1336 | * Returns whether sliding is enabled. 1337 | * 1338 | * @param shouldEnable Whether to enable sliding the slidebox. 1339 | */ 1340 | enableSlide(shouldEnable?: boolean): boolean; 1341 | 1342 | /** 1343 | * Go to the previous slide. Wraps around if at the beginning. 1344 | */ 1345 | previous(): void; 1346 | 1347 | /** 1348 | * Go to the next slide. Wraps around if at the end. 1349 | */ 1350 | next(): void; 1351 | 1352 | /** 1353 | * Stop sliding. The slideBox will not move again until explicitly told to do so. 1354 | */ 1355 | stop(): void; 1356 | 1357 | /** 1358 | * Start sliding again if the slideBox was stopped. 1359 | */ 1360 | start(): void; 1361 | 1362 | /** 1363 | * Returns the index of the current slide. 1364 | */ 1365 | currentIndex(): number; 1366 | 1367 | /** 1368 | * Returns the number of slides there are currently. 1369 | */ 1370 | slidesCount(): number; 1371 | 1372 | /** 1373 | * Returns a delegate instance that controls only the ionSlideBox directives with delegate-handle matching the given handle. 1374 | */ 1375 | $getByHandle(handle: string): ISlideBoxDelegate; 1376 | } 1377 | 1378 | //#endregion 1379 | 1380 | //#region Tabs 1381 | interface ITabsDelegate 1382 | { 1383 | 1384 | /** 1385 | * Select the tab matching the given index. 1386 | * 1387 | * @param index Index of the tab to select. 1388 | */ 1389 | select(index: number): void; 1390 | 1391 | /** 1392 | * Returns the index of the selected tab, or -1. 1393 | */ 1394 | selectedIndex(): number; 1395 | 1396 | /** 1397 | * Return delegate instance that controls only the ionTabs directives with delegate-handle matching the given handle. 1398 | */ 1399 | $getByHandle(handle: string): ITabsDelegate; 1400 | } 1401 | //#endregion 1402 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-ionic-seed", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "description": "Get started on TypeScript + Angular + Ionic + TDD", 6 | "devDependencies": { 7 | "bower": "^1.3.3", 8 | "chai": "^1.10.0", 9 | "chai-as-promised": "^4.1.1", 10 | "gulp": "^3.8.10", 11 | "gulp-angular-templatecache": "^1.5.0", 12 | "gulp-clean": "^0.3.1", 13 | "gulp-concat": "^2.2.0", 14 | "gulp-concat-sourcemap": "^1.3.1", 15 | "gulp-htmlmin": "^0.2.0", 16 | "gulp-jasmine": "^1.0.1", 17 | "gulp-karma": "0.0.4", 18 | "gulp-minify-css": "^0.3.0", 19 | "gulp-ng-annotate": "^0.4.4", 20 | "gulp-notify": "^2.1.0", 21 | "gulp-plumber": "^0.6.6", 22 | "gulp-rename": "^1.2.0", 23 | "gulp-sass": "^0.7.1", 24 | "gulp-sourcemaps": "^1.3.0", 25 | "gulp-ts": "0.0.15", 26 | "gulp-tslint": "^1.4.1", 27 | "gulp-typescript": "^2.3.0", 28 | "gulp-typescript-compiler": "^1.0.1", 29 | "gulp-uglify": "^1.0.2", 30 | "gulp-util": "^2.2.14", 31 | "http-server": "^0.7.4", 32 | "jasmine-core": "^2.1.3", 33 | "karma": "^0.12.30", 34 | "karma-chrome-launcher": "^0.1.7", 35 | "karma-firefox-launcher": "^0.1.4", 36 | "karma-jasmine": "^0.3.3", 37 | "karma-junit-reporter": "^0.2.2", 38 | "karma-notify-reporter": "^0.1.1", 39 | "karma-phantomjs-launcher": "^0.1.4", 40 | "karma-sourcemap-loader": "^0.3.2", 41 | "karma-spec-reporter": "0.0.16", 42 | "main-bower-files": "^2.5.0", 43 | "ng-annotate": "^0.14.1", 44 | "protractor-cucumber": "^0.1.2", 45 | "shelljs": "^0.3.0", 46 | "yargs": "^1.3.3" 47 | }, 48 | "scripts": { 49 | "postinstall": "bower install", 50 | "pretsd": "npm install", 51 | "tsd": "tsd reinstall --overwrite", 52 | "presetup": "npm run tsd", 53 | "setup": "gulp", 54 | "preserver": "npm run setup", 55 | "server": "ionic serve --port 8000", 56 | "pretravis-server": "npm install", 57 | "travis-server": "http-server www -a localhost -p 8000 -c-1", 58 | "ts": "gulp tslint", 59 | "precss": "npm install", 60 | "css": "gulp css", 61 | "prewatch": "npm install", 62 | "watch": "gulp watch", 63 | "pretests": "npm install", 64 | "tests": "gulp test", 65 | "preupdate-webdriver": "npm install", 66 | "update-webdriver": "webdriver-manager update", 67 | "preweb-driver": "npm run update-webdriver", 68 | "web-driver": "webdriver-manager start", 69 | "precompile-typescript": "npm run update-webdriver", 70 | "compile-typescript": "gulp tsE2E", 71 | "preprotractor": "npm run compile-typescript", 72 | "protractor": "protractor protractor.conf.js", 73 | "precucumber": "npm run update-webdriver", 74 | "cucumber": "protractor cucumber.conf.js", 75 | "presuite": "npm run tests", 76 | "suite": "npm run cucumber" 77 | }, 78 | "private": true 79 | } 80 | -------------------------------------------------------------------------------- /protractor.conf.js: -------------------------------------------------------------------------------- 1 | // protractor configuration file for jasmine tests 2 | exports.config = { 3 | allScriptsTimeout: 11000, 4 | 5 | specs: [ 6 | './www/test/e2e.js' 7 | ], 8 | 9 | capabilities: { 10 | 'browserName': 'chrome' 11 | }, 12 | 13 | baseUrl: 'http://localhost:8000/', 14 | 15 | framework: 'jasmine', 16 | jasmineNodeOpts: { 17 | defaultTimeoutInterval: 30000 18 | } 19 | }; -------------------------------------------------------------------------------- /src/common/ICoreScope.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module typeScriptIonicApp.common { 4 | export interface ICoreScope extends ng.IScope { 5 | vm: { 6 | 7 | } 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /src/common/directives/example_tag/ExampleTag.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | module typeScriptIonicApp.common.directives { 4 | export interface IExampleTagDirectiveScope extends typeScriptIonicApp.common.ICoreScope { 5 | vm: { 6 | } 7 | } 8 | 9 | export class ExampleTagDirective implements ng.IDirective { 10 | public restrict = 'E'; 11 | public templateUrl = 'common/directives/example_tag/index.html'; 12 | public controller = 'ExampleTagDirectiveController'; 13 | public scope = {}; 14 | 15 | constructor() { 16 | } 17 | } 18 | 19 | export class ExampleTagDirectiveController { 20 | constructor(public $scope:IExampleTagDirectiveScope) { 21 | $scope.vm = this; 22 | } 23 | } 24 | 25 | // this module is re-declared per directive 26 | export var app:ng.IModule = app || angular.module('typeScriptIonicApp.common.directives', ['templates', 'ionic']); 27 | app.directive('exampleTag', () => new ExampleTagDirective()); 28 | app.controller('ExampleTagDirectiveController', ExampleTagDirectiveController); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/common/directives/example_tag/index.html: -------------------------------------------------------------------------------- 1 | this is the [example-tag] directive in action -------------------------------------------------------------------------------- /src/common/services/SampleData.spec.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | module typeScriptIonicApp.common.services { 4 | describe('SampleDataService', function () { 5 | var $log:ng.ILogService, SampleDataService:ISampleData; 6 | 7 | beforeEach(function () { 8 | angular.mock.module('typeScriptIonicApp.common.services'); 9 | }); 10 | 11 | beforeEach(inject(function (_SampleDataService_:ISampleData, _$log_:ng.ILogService) { 12 | $log = _$log_; 13 | SampleDataService = _SampleDataService_; 14 | })); 15 | 16 | describe('getData()', () => { 17 | it('should call $log.log and return "LoremIpsum"', () => { 18 | spyOn($log, 'log'); 19 | expect(SampleDataService.getData()).toEqual('LoremIpsum'); 20 | expect($log.log).toHaveBeenCalledWith('getData() called'); 21 | }); 22 | }); 23 | }); 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/common/services/SampleData.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | module typeScriptIonicApp.common.services { 4 | 5 | export interface ISampleData { 6 | getData: () => string; 7 | } 8 | 9 | export class SampleData implements ISampleData { 10 | static $inject = ['$log']; 11 | 12 | constructor(private $log:ng.ILogService) { 13 | } 14 | 15 | getData():string { 16 | this.$log.log('getData() called'); 17 | return 'LoremIpsum'; 18 | } 19 | } 20 | 21 | export var app:ng.IModule = app || angular.module('typeScriptIonicApp.common.services', ['ionic']); 22 | app.service('SampleDataService', SampleData); 23 | } 24 | -------------------------------------------------------------------------------- /src/components/home/HomeController.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | module typeScriptIonicApp.components.home { 4 | export interface IHomeScope extends typeScriptIonicApp.common.ICoreScope { 5 | vm: { 6 | doLogout: () => void; 7 | data: string; 8 | } 9 | } 10 | 11 | // this export lets us directly initialize this during tests 12 | export class HomeController { 13 | public data:string; 14 | 15 | constructor(public $scope:IHomeScope, private $state:ng.ui.IStateService, private $ionicHistory, private SampleDataService) { 16 | console.log('home loaded!'); 17 | // 'vm' stands for 'view model'. An additional benefit to this is to prevent primatives getting 18 | // assigned to the scope directly 19 | $scope.vm = this; 20 | this.data = SampleDataService.getData(); 21 | } 22 | 23 | doLogout() { 24 | console.log('logout called'); 25 | this.$state.go('app.login', {}, {location: 'replace'}); 26 | this.$ionicHistory.nextViewOptions({ 27 | disableBack: true 28 | }); 29 | } 30 | } 31 | 32 | function setRouteState($stateProvider:ng.ui.IStateProvider) { 33 | var state:ng.ui.IState = { 34 | url: '/home', 35 | views: { 36 | menuContent: { 37 | templateUrl: 'components/home/home.html', 38 | controller: 'HomeController' 39 | } 40 | } 41 | }; 42 | 43 | $stateProvider.state('app.home', state); 44 | } 45 | 46 | export var app:ng.IModule = app || angular.module('typeScriptIonicApp.components.home', ['ionic']); 47 | app.controller('HomeController', HomeController); 48 | app.config(setRouteState); 49 | } 50 | -------------------------------------------------------------------------------- /src/components/home/home.e2e.ts: -------------------------------------------------------------------------------- 1 | module typeScriptIonicApp.components.home { 2 | export class HomeFeature { 3 | logout() { 4 | element(by.partialButtonText('Logout')).click(); 5 | return this; 6 | } 7 | 8 | visit() { 9 | browser.get('#'); 10 | return this; 11 | } 12 | 13 | isRendered() { 14 | return protractor.promise.all([ 15 | element(by.cssContainingText('h1', 'Home')).isPresent(), 16 | element(by.cssContainingText('p', '[example-tag] directive')).isPresent(), 17 | element(by.cssContainingText('p', 'LoremIpsum')).isPresent() 18 | ]); 19 | } 20 | 21 | getCorrectUrl():string { 22 | return '/app/home'; 23 | } 24 | } 25 | 26 | describe('Home Feature', function () { 27 | var feature; 28 | 29 | beforeEach(function () { 30 | feature = new HomeFeature(); 31 | feature.visit(); 32 | }); 33 | 34 | it('should automatically redirect to #/app/home when location hash/fragment is empty', function () { 35 | expect(browser.getLocationAbsUrl()).toBe(feature.getCorrectUrl()); 36 | }); 37 | 38 | it('should render the correct contents', function () { 39 | expect(feature.isRendered()).toEqual([true, true, true]); 40 | }); 41 | 42 | it('should let me log out via the link', function () { 43 | feature.logout(); 44 | expect((new typeScriptIonicApp.components.login.LoginFeature()).isRendered()).toBe(true); 45 | }); 46 | }); 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/components/home/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |

Home

14 | 15 |

Welcome to ionic

16 |
17 |

18 | 19 |

20 |

SampleDataService output: '{{vm.data}}'

21 |
22 |
23 | -------------------------------------------------------------------------------- /src/components/login/LoginController.spec.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | module typeScriptIonicApp.components.login { 4 | describe('Login Controller', function () { 5 | var controller:LoginController; 6 | var scope:ILoginScope; 7 | var $location:ng.ILocationService; 8 | var $state:ng.ui.IStateService; 9 | var $ionicHistory:any; 10 | 11 | beforeEach(function () { 12 | angular.mock.module('typeScriptIonicApp.components.login'); 13 | }); 14 | 15 | beforeEach(inject(function ($rootScope:ng.IRootScopeService, 16 | _$location_:ng.ILocationService, 17 | _$state_:ng.ui.IStateService, 18 | _$ionicHistory_:any) { 19 | scope = $rootScope.$new(); 20 | $location = _$location_; 21 | $state = _$state_; 22 | $ionicHistory = _$ionicHistory_; 23 | })); 24 | 25 | it('should have a default username', () => { 26 | controller = new LoginController(scope, $state, $ionicHistory); 27 | expect(controller).not.toBeNull(); 28 | expect(scope.vm.username).toEqual('default'); 29 | expect(scope.vm.password).toBeUndefined(); 30 | }); 31 | }); 32 | } 33 | -------------------------------------------------------------------------------- /src/components/login/LoginController.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | module typeScriptIonicApp.components.login { 4 | export interface ILoginScope extends typeScriptIonicApp.common.ICoreScope { 5 | vm: { 6 | doLogin: () => void; 7 | username: string; 8 | password: string; 9 | } 10 | } 11 | 12 | export class LoginController { 13 | public username:string; 14 | public password:string; 15 | 16 | constructor(public $scope:ILoginScope, private $state:ng.ui.IStateService, private $ionicHistory) { 17 | this.username = 'default'; 18 | console.log('Login loaded'); 19 | // 'vm' stands for 'view model'. An additional benefit to this is to prevent primatives getting 20 | // assigned to the scope directly 21 | $scope.vm = this; 22 | } 23 | 24 | doLogin() { 25 | console.log('login called for ' + this.username); 26 | this.$state.go('app.home', {}, {location: 'replace'}); 27 | this.$ionicHistory.nextViewOptions({ 28 | disableBack: true 29 | }); 30 | } 31 | } 32 | 33 | function loginConfig($stateProvider:ng.ui.IStateProvider) { 34 | var state:ng.ui.IState = { 35 | url: '/login', 36 | views: { 37 | menuContent: { 38 | templateUrl: 'components/login/login.html', 39 | controller: 'LoginController' 40 | } 41 | } 42 | }; 43 | 44 | $stateProvider.state('app.login', state); 45 | } 46 | 47 | export var app:ng.IModule = app || angular.module('typeScriptIonicApp.components.login', ['ionic']); 48 | app.controller('LoginController', LoginController); 49 | app.config(loginConfig); 50 | } 51 | -------------------------------------------------------------------------------- /src/components/login/login.e2e.ts: -------------------------------------------------------------------------------- 1 | module typeScriptIonicApp.components.login { 2 | export class LoginFeature { 3 | usernameInput = element(by.model('vm.username')); 4 | passwordInput = element(by.model('vm.password')); 5 | submitButton = element(by.buttonText('Login')); 6 | 7 | fillInForm(username:string, password:string) { 8 | this.usernameInput.sendKeys(username); 9 | this.passwordInput.sendKeys(password); 10 | return this; 11 | } 12 | 13 | submitForm() { 14 | this.submitButton.click(); 15 | return this; 16 | } 17 | 18 | visit() { 19 | browser.get('#/app/login'); 20 | return this; 21 | } 22 | 23 | isRendered() { 24 | return element(by.cssContainingText('h1', 'Login')).isPresent(); 25 | } 26 | 27 | getUsername() { 28 | return this.usernameInput.getAttribute('value'); 29 | } 30 | 31 | getPassword() { 32 | return this.passwordInput.getAttribute('value'); 33 | } 34 | 35 | getCorrectUrl() { 36 | return '/app/login'; 37 | } 38 | } 39 | 40 | describe('Login Feature', function () { 41 | var feature; 42 | 43 | beforeEach(function () { 44 | feature = new LoginFeature(); 45 | feature.visit(); 46 | }); 47 | 48 | it('should render login page when user navigates to #/app/login', function () { 49 | expect(browser.getLocationAbsUrl()).toBe(feature.getCorrectUrl()); 50 | }); 51 | 52 | it('should render the correct contents', function () { 53 | expect(feature.isRendered()).toBe(true); 54 | }); 55 | 56 | it('should render login page with default username', function () { 57 | expect(feature.getUsername()).toBe('default'); 58 | expect(feature.getPassword()).toBe(''); 59 | }); 60 | 61 | it('should let me login via login button', function () { 62 | feature.fillInForm('Julie', 'myPassword'); 63 | expect(feature.getUsername()).toBe('defaultJulie'); 64 | expect(feature.getPassword()).toBe('myPassword'); 65 | feature.submitForm(); 66 | expect((new typeScriptIonicApp.components.home.HomeFeature()).isRendered()).toEqual([true, true, true]); 67 | }); 68 | }); 69 | } 70 | -------------------------------------------------------------------------------- /src/components/login/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Login

4 | 5 |
6 |
7 | 11 | 15 | 18 |
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /src/definitions.d.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/danibo86/ionic-typescript-definitions 2 | /// 3 | 4 | /// 5 | 6 | /******* 7 | * INCLUDE ALL YOUR CUSTOM SOURCE FILES HERE 8 | * Failure to include interfaces won't cause problems in some IDEs, 9 | * but may in others! 10 | * 11 | * Note: The order listed here is the order the files are included. 12 | *******/ 13 | 14 | /// 15 | 16 | /// 17 | /// 18 | 19 | /// 20 | /// 21 | /// 22 | 23 | /// 24 | /// 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/layout/AppController.ts: -------------------------------------------------------------------------------- 1 | /// 2 | module typeScriptIonicApp { 3 | class AppController { 4 | constructor(private $scope:IAppScope) { 5 | console.log('app loaded'); 6 | // 'vm' stands for 'view model'. An additional benefit to this is to prevent primatives getting 7 | // assigned to the scope directly 8 | $scope.vm = this; 9 | } 10 | } 11 | 12 | export var app:ng.IModule = app || angular.module('typeScriptIonicApp'); 13 | app.controller('AppController', AppController); 14 | } 15 | -------------------------------------------------------------------------------- /src/layout/IAppScope.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare module typeScriptIonicApp { 3 | export interface IAppScope extends ng.IScope { 4 | vm: { 5 | 6 | } 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/layout/menu/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Back 6 | 7 | 8 | 9 | 10 | 11 |
12 |

Menu

13 |
14 | 15 | 16 | 17 | Index 18 | 19 | 20 | 21 |
22 |
23 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | // this hide message errors from compiler 4 | interface Window { 5 | cordova: any; 6 | StatusBar: any; 7 | } 8 | 9 | module typeScriptIonicApp { 10 | export var app:ng.IModule = angular.module('typeScriptIonicApp', [ 11 | 'ionic', 12 | 'templates', 13 | 'typeScriptIonicApp.common.services', 14 | 'typeScriptIonicApp.common.directives', 15 | 'typeScriptIonicApp.components.home', 16 | 'typeScriptIonicApp.components.login' 17 | ]); 18 | 19 | app.run(function ($ionicPlatform) { 20 | $ionicPlatform.ready(function () { 21 | // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 22 | // for form inputs) 23 | if (window.cordova && window.cordova.plugins.Keyboard) { 24 | window.cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 25 | } 26 | 27 | if (window.StatusBar) { 28 | // org.apache.cordova.statusbar required 29 | window.StatusBar.styleDefault(); 30 | } 31 | }); 32 | }); 33 | 34 | app.config(function ($stateProvider, $urlRouterProvider) { 35 | $stateProvider.state('app', { 36 | url: '/app', 37 | abstract: true, 38 | templateUrl: 'layout/menu/menu.html', 39 | controller: 'AppController' 40 | }); 41 | // if none of the above states are matched, use this as the fallback 42 | $urlRouterProvider.otherwise('/app/home'); 43 | }); 44 | } 45 | -------------------------------------------------------------------------------- /tsd.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "v4", 3 | "repo": "borisyankov/DefinitelyTyped", 4 | "ref": "master", 5 | "path": "tsd", 6 | "bundle": "tsd/tsd.d.ts", 7 | "installed": { 8 | "angularjs/angular.d.ts": { 9 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 10 | }, 11 | "cordova/cordova.d.ts": { 12 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 13 | }, 14 | "cordova/plugins/BatteryStatus.d.ts": { 15 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 16 | }, 17 | "cordova/plugins/Device.d.ts": { 18 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 19 | }, 20 | "cordova/plugins/DeviceMotion.d.ts": { 21 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 22 | }, 23 | "cordova/plugins/DeviceOrientation.d.ts": { 24 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 25 | }, 26 | "cordova/plugins/Contacts.d.ts": { 27 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 28 | }, 29 | "cordova/plugins/Dialogs.d.ts": { 30 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 31 | }, 32 | "cordova/plugins/Camera.d.ts": { 33 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 34 | }, 35 | "cordova/plugins/FileTransfer.d.ts": { 36 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 37 | }, 38 | "cordova/plugins/Globalization.d.ts": { 39 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 40 | }, 41 | "cordova/plugins/FileSystem.d.ts": { 42 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 43 | }, 44 | "cordova/plugins/InAppBrowser.d.ts": { 45 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 46 | }, 47 | "cordova/plugins/Media.d.ts": { 48 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 49 | }, 50 | "cordova/plugins/MediaCapture.d.ts": { 51 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 52 | }, 53 | "cordova/plugins/NetworkInformation.d.ts": { 54 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 55 | }, 56 | "cordova/plugins/Push.d.ts": { 57 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 58 | }, 59 | "cordova/plugins/Splashscreen.d.ts": { 60 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 61 | }, 62 | "cordova/plugins/Vibration.d.ts": { 63 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 64 | }, 65 | "cordova/plugins/WebSQL.d.ts": { 66 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 67 | }, 68 | "jquery/jquery.d.ts": { 69 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 70 | }, 71 | "angularjs/angular-mocks.d.ts": { 72 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 73 | }, 74 | "jasmine/jasmine.d.ts": { 75 | "commit": "ca32947b75a2b1203779dac7154ffbc232746e4d" 76 | }, 77 | "chai-as-promised/chai-as-promised.d.ts": { 78 | "commit": "494b30d2327ab489fa5b5f082a3c9a299e4c5644" 79 | }, 80 | "chai/chai.d.ts": { 81 | "commit": "494b30d2327ab489fa5b5f082a3c9a299e4c5644" 82 | }, 83 | "angular-ui-router/angular-ui-router.d.ts": { 84 | "commit": "f7d47e35f7f29c151889286e8b8bf2bd31317490" 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /tsd/tsd.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | /// 6 | /// 7 | /// 8 | /// 9 | /// 10 | /// 11 | /// 12 | /// 13 | /// 14 | /// 15 | /// 16 | /// 17 | /// 18 | /// 19 | /// 20 | /// 21 | /// 22 | /// 23 | /// 24 | /// 25 | /// 26 | /// 27 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": true, 4 | "curly": true, 5 | "eofline": true, 6 | "forin": true, 7 | "indent": [true, "spaces"], 8 | "label-position": true, 9 | "label-undefined": true, 10 | "max-line-length": [false, 140], 11 | "no-arg": true, 12 | "no-bitwise": true, 13 | "no-console": [true, 14 | "debug", 15 | "info", 16 | "time", 17 | "timeEnd", 18 | "trace" 19 | ], 20 | "no-construct": true, 21 | "no-debugger": true, 22 | "no-duplicate-key": true, 23 | "no-duplicate-variable": true, 24 | "no-empty": false, 25 | "no-eval": true, 26 | "no-string-literal": true, 27 | "no-switch-case-fall-through": true, 28 | "no-trailing-comma": true, 29 | "no-trailing-whitespace": true, 30 | "no-unused-expression": true, 31 | "no-unused-variable": false, 32 | "no-unreachable": true, 33 | "no-use-before-declare": true, 34 | "one-line": [true, 35 | "check-open-brace", 36 | "check-catch", 37 | "check-else", 38 | "check-whitespace" 39 | ], 40 | "quotemark": [true, "single"], 41 | "radix": true, 42 | "semicolon": true, 43 | "triple-equals": [true, "allow-null-check"], 44 | "variable-name": false, 45 | "whitespace": [true, 46 | "check-branch", 47 | "check-decl", 48 | "check-operator", 49 | "check-separator" 50 | ] 51 | } 52 | } --------------------------------------------------------------------------------