├── .bowerrc
├── ionic.project
├── src
├── common
│ ├── directives
│ │ └── example_tag
│ │ │ ├── index.html
│ │ │ └── ExampleTag.ts
│ ├── ICoreScope.d.ts
│ └── services
│ │ ├── SampleData.ts
│ │ └── SampleData.spec.ts
├── layout
│ ├── IAppScope.ts
│ ├── AppController.ts
│ └── menu
│ │ └── menu.html
├── components
│ ├── login
│ │ ├── login.html
│ │ ├── LoginController.spec.ts
│ │ ├── LoginController.ts
│ │ └── login.e2e.ts
│ └── home
│ │ ├── home.html
│ │ ├── home.e2e.ts
│ │ └── HomeController.ts
├── definitions.d.ts
└── main.ts
├── assets
├── images
│ └── ionic.png
├── fonts
│ ├── FontAwesome.otf
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.ttf
│ └── fontawesome-webfont.woff
├── scss
│ ├── font-awesome
│ │ ├── _fixed-width.scss
│ │ ├── _bordered-pulled.scss
│ │ ├── _larger.scss
│ │ ├── _core.scss
│ │ ├── _list.scss
│ │ ├── font-awesome.scss
│ │ ├── _stacked.scss
│ │ ├── _spinning.scss
│ │ ├── _path.scss
│ │ ├── _rotated-flipped.scss
│ │ ├── _mixins.scss
│ │ ├── _variables.scss
│ │ └── _icons.scss
│ ├── style.scss
│ └── ionic.app.scss
└── index.html
├── bower.json
├── features
├── support
│ └── steps.js
├── components
│ ├── home.feature
│ └── login.feature
└── step_definitions
│ ├── forms.js
│ ├── pages.js
│ └── text.js
├── protractor.conf.js
├── cucumber.conf.js
├── .travis.yml
├── config.xml
├── LICENSE
├── tslint.json
├── tsd
└── tsd.d.ts
├── karma.conf.js
├── package.json
├── .gitignore
├── tsd.json
├── .jshintrc
├── README.md
├── gulpfile.js
└── lib
└── definitions
├── e2e-definitions
└── jasmine
│ └── jasmine.d.ts
└── ionic
└── ionic.d.ts
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components"
3 | }
4 |
--------------------------------------------------------------------------------
/ionic.project:
--------------------------------------------------------------------------------
1 | {
2 | "name": "typeScriptIonic",
3 | "app_id": ""
4 | }
--------------------------------------------------------------------------------
/src/common/directives/example_tag/index.html:
--------------------------------------------------------------------------------
1 | this is the [example-tag] directive in action
--------------------------------------------------------------------------------
/assets/images/ionic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michikono/typescript-ionic-seed/HEAD/assets/images/ionic.png
--------------------------------------------------------------------------------
/assets/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michikono/typescript-ionic-seed/HEAD/assets/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michikono/typescript-ionic-seed/HEAD/assets/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michikono/typescript-ionic-seed/HEAD/assets/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/assets/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michikono/typescript-ionic-seed/HEAD/assets/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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;
--------------------------------------------------------------------------------
/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 | };
--------------------------------------------------------------------------------
/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 | };
--------------------------------------------------------------------------------
/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/_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/_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/_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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/components/login/login.html:
--------------------------------------------------------------------------------
1 |
2 |
21 |
22 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/components/home/home.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Logout
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
22 |
23 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/layout/menu/menu.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Back
6 |
7 |
8 |
9 |
10 |
11 |
14 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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;
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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;
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 | }
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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/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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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;
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.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 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | TypeScript Ionic Seed - Overview [](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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/_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 |
--------------------------------------------------------------------------------
/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 | }
--------------------------------------------------------------------------------