├── .bowerrc ├── ionic.project ├── www ├── img │ ├── ben.png │ ├── max.png │ ├── adam.jpg │ ├── ionic.png │ ├── mike.png │ ├── perry.png │ ├── favicon.ico │ └── marta_touch_aw.png ├── lib │ ├── angular │ │ ├── index.js │ │ ├── angular.min.js.gzip │ │ ├── bower.json │ │ ├── angular-csp.css │ │ ├── .bower.json │ │ ├── package.json │ │ └── README.md │ ├── angular-animate │ │ ├── index.js │ │ ├── bower.json │ │ ├── .bower.json │ │ ├── package.json │ │ └── README.md │ ├── angular-sanitize │ │ ├── index.js │ │ ├── bower.json │ │ ├── .bower.json │ │ ├── package.json │ │ ├── README.md │ │ └── angular-sanitize.min.js │ ├── ionic │ │ ├── fonts │ │ │ ├── ionicons.eot │ │ │ ├── ionicons.ttf │ │ │ └── ionicons.woff │ │ ├── version.json │ │ ├── scss │ │ │ ├── _progress.scss │ │ │ ├── _backdrop.scss │ │ │ ├── ionicons │ │ │ │ ├── ionicons.scss │ │ │ │ └── _ionicons-font.scss │ │ │ ├── ionic.scss │ │ │ ├── _loading.scss │ │ │ ├── _radio.scss │ │ │ ├── _button-bar.scss │ │ │ ├── _animations.scss │ │ │ ├── _slide-box.scss │ │ │ ├── _menu.scss │ │ │ ├── _badge.scss │ │ │ ├── _platform.scss │ │ │ ├── _spinner.scss │ │ │ ├── _popup.scss │ │ │ ├── _modal.scss │ │ │ ├── _list.scss │ │ │ ├── _refresher.scss │ │ │ ├── _select.scss │ │ │ ├── _action-sheet.scss │ │ │ ├── _type.scss │ │ │ ├── _grid.scss │ │ │ ├── _popover.scss │ │ │ ├── _range.scss │ │ │ ├── _transitions.scss │ │ │ ├── _checkbox.scss │ │ │ └── _toggle.scss │ │ └── js │ │ │ └── angular │ │ │ ├── angular-resource.min.js │ │ │ └── angular-sanitize.min.js │ ├── ionic-platform-web-client │ │ ├── src │ │ │ ├── deploy │ │ │ │ ├── es5.js │ │ │ │ └── angular.js │ │ │ ├── push │ │ │ │ ├── es5.js │ │ │ │ ├── push-token.js │ │ │ │ ├── push-message.js │ │ │ │ ├── angular.js │ │ │ │ └── push-dev.js │ │ │ ├── core │ │ │ │ ├── events.js │ │ │ │ ├── promise.js │ │ │ │ ├── logger.js │ │ │ │ ├── angular.js │ │ │ │ ├── app.js │ │ │ │ ├── request.js │ │ │ │ ├── settings.js │ │ │ │ ├── data-types.js │ │ │ │ ├── es5.js │ │ │ │ └── storage.js │ │ │ └── analytics │ │ │ │ ├── es5.js │ │ │ │ ├── storage.js │ │ │ │ └── serializers.js │ │ ├── bower.json │ │ ├── CHANGELOG.md │ │ ├── .bower.json │ │ ├── README.md │ │ ├── build │ │ │ └── config.js │ │ ├── gulpfile.js │ │ └── package.json │ └── angular-ui-router │ │ ├── bower.json │ │ ├── .bower.json │ │ ├── LICENSE │ │ ├── src │ │ ├── stateFilters.js │ │ ├── viewScroll.js │ │ ├── view.js │ │ └── templateFactory.js │ │ ├── CONTRIBUTING.md │ │ └── api │ │ └── angular-ui-router.d.ts ├── templates │ ├── tab-account.html │ ├── chat-detail.html │ ├── tab-chats.html │ ├── train.html │ ├── station.html │ ├── tabs.html │ └── tab-dash.html ├── index.html ├── js │ ├── app.js │ └── controllers.js └── css │ └── style.css ├── resources ├── icon.png ├── splash.png ├── ios │ ├── icon │ │ ├── icon.png │ │ ├── icon-40.png │ │ ├── icon-50.png │ │ ├── icon-60.png │ │ ├── icon-72.png │ │ ├── icon-76.png │ │ ├── icon@2x.png │ │ ├── icon-40@2x.png │ │ ├── icon-40@3x.png │ │ ├── icon-50@2x.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-72@2x.png │ │ ├── icon-76@2x.png │ │ ├── icon-83.5@2x.png │ │ ├── icon-small.png │ │ ├── icon-small@2x.png │ │ └── icon-small@3x.png │ └── splash │ │ ├── Default-667h.png │ │ ├── Default-736h.png │ │ ├── Default~iphone.png │ │ ├── Default@2x~iphone.png │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-Landscape-736h.png │ │ ├── Default-Landscape~ipad.png │ │ ├── Default-Portrait~ipad.png │ │ ├── Default-Landscape@2x~ipad.png │ │ └── Default-Portrait@2x~ipad.png └── android │ ├── icon │ ├── drawable-hdpi-icon.png │ ├── drawable-ldpi-icon.png │ ├── drawable-mdpi-icon.png │ ├── drawable-xhdpi-icon.png │ ├── drawable-xxhdpi-icon.png │ └── drawable-xxxhdpi-icon.png │ └── splash │ ├── drawable-land-hdpi-screen.png │ ├── drawable-land-ldpi-screen.png │ ├── drawable-land-mdpi-screen.png │ ├── drawable-land-xhdpi-screen.png │ ├── drawable-port-hdpi-screen.png │ ├── drawable-port-ldpi-screen.png │ ├── drawable-port-mdpi-screen.png │ ├── drawable-port-xhdpi-screen.png │ ├── drawable-land-xxhdpi-screen.png │ ├── drawable-land-xxxhdpi-screen.png │ ├── drawable-port-xxhdpi-screen.png │ └── drawable-port-xxxhdpi-screen.png ├── .io-config.json ├── .gitignore ├── bower.json ├── .editorconfig ├── server.js ├── scss └── ionic.app.scss ├── LICENSE ├── package.json ├── gulpfile.js ├── README.md ├── hooks ├── after_prepare │ └── 010_add_platform_class.js └── README.md └── config.xml /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "www/lib" 3 | } 4 | -------------------------------------------------------------------------------- /ionic.project: -------------------------------------------------------------------------------- 1 | { 2 | "name": "martaionic", 3 | "app_id": "00bda95b" 4 | } 5 | -------------------------------------------------------------------------------- /www/img/ben.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/ben.png -------------------------------------------------------------------------------- /www/img/max.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/max.png -------------------------------------------------------------------------------- /www/lib/angular/index.js: -------------------------------------------------------------------------------- 1 | require('./angular'); 2 | module.exports = angular; 3 | -------------------------------------------------------------------------------- /www/img/adam.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/adam.jpg -------------------------------------------------------------------------------- /www/img/ionic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/ionic.png -------------------------------------------------------------------------------- /www/img/mike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/mike.png -------------------------------------------------------------------------------- /www/img/perry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/perry.png -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/icon.png -------------------------------------------------------------------------------- /resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/splash.png -------------------------------------------------------------------------------- /www/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/favicon.ico -------------------------------------------------------------------------------- /www/lib/angular-animate/index.js: -------------------------------------------------------------------------------- 1 | require('./angular-animate'); 2 | module.exports = 'ngAnimate'; 3 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/index.js: -------------------------------------------------------------------------------- 1 | require('./angular-sanitize'); 2 | module.exports = 'ngSanitize'; 3 | -------------------------------------------------------------------------------- /resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /www/img/marta_touch_aw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/img/marta_touch_aw.png -------------------------------------------------------------------------------- /.io-config.json: -------------------------------------------------------------------------------- 1 | {"dev_push":true,"app_id":"00bda95b","api_key":"a87b69d38906e22d340b7eff482a6b9deb2a1679ef2ae174"} -------------------------------------------------------------------------------- /resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /www/lib/ionic/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/lib/ionic/fonts/ionicons.eot -------------------------------------------------------------------------------- /www/lib/ionic/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/lib/ionic/fonts/ionicons.ttf -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-small.png -------------------------------------------------------------------------------- /www/lib/angular/angular.min.js.gzip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/lib/angular/angular.min.js.gzip -------------------------------------------------------------------------------- /www/lib/ionic/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/www/lib/ionic/fonts/ionicons.woff -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-small@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/icon/icon-small@3x.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /www/lib/ionic/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.2.4", 3 | "codename": "", 4 | "date": "2016-01-03", 5 | "time": "19:55:51" 6 | } 7 | -------------------------------------------------------------------------------- /resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-land-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-land-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-land-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-land-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-hdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-port-hdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-ldpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-port-ldpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-mdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-port-mdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-port-xhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-land-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-land-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-land-xxxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-port-xxhdpi-screen.png -------------------------------------------------------------------------------- /resources/android/splash/drawable-port-xxxhdpi-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakswa/martaionic/HEAD/resources/android/splash/drawable-port-xxxhdpi-screen.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Specifies intentionally untracked files to ignore when using Git 2 | # http://git-scm.com/docs/gitignore 3 | 4 | node_modules/ 5 | platforms/ 6 | plugins/ 7 | -------------------------------------------------------------------------------- /www/lib/angular/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.4.3", 4 | "main": "./angular.js", 5 | "ignore": [], 6 | "dependencies": { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HelloIonic", 3 | "private": "true", 4 | "devDependencies": { 5 | "ionic": "driftyco/ionic-bower#1.2.4", 6 | "ionic-platform-web-client": "^0.2.1" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/deploy/es5.js: -------------------------------------------------------------------------------- 1 | import { Deploy } from "./deploy"; 2 | 3 | // Declare the window object 4 | window.Ionic = window.Ionic || {}; 5 | 6 | // Ionic Namespace 7 | Ionic.Deploy = Deploy; 8 | -------------------------------------------------------------------------------- /www/lib/angular-animate/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-animate", 3 | "version": "1.4.3", 4 | "main": "./angular-animate.js", 5 | "ignore": [], 6 | "dependencies": { 7 | "angular": "1.4.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.4.3", 4 | "main": "./angular-sanitize.js", 5 | "ignore": [], 6 | "dependencies": { 7 | "angular": "1.4.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_progress.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Progress 4 | * -------------------------------------------------- 5 | */ 6 | 7 | progress { 8 | display: block; 9 | margin: $progress-margin; 10 | width: $progress-width; 11 | } 12 | -------------------------------------------------------------------------------- /www/templates/tab-account.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Enable Friends 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/push/es5.js: -------------------------------------------------------------------------------- 1 | import { Push } from "./push"; 2 | import { PushToken } from "./push-token"; 3 | 4 | // Declare the window object 5 | window.Ionic = window.Ionic || {}; 6 | 7 | // Ionic Namespace 8 | Ionic.Push = Push; 9 | Ionic.PushToken = PushToken; 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | insert_final_newline = false 14 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/events.js: -------------------------------------------------------------------------------- 1 | var _EventEmitter = require("events"); 2 | 3 | export class EventEmitter { 4 | constructor() { 5 | this._emitter = new _EventEmitter(); 6 | } 7 | 8 | on(event, callback) { 9 | return this._emitter.on(event, callback); 10 | } 11 | 12 | emit(label, data) { 13 | return this._emitter.emit(label, data); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/push/push-token.js: -------------------------------------------------------------------------------- 1 | export class PushToken { 2 | 3 | constructor(token) { 4 | this._token = token || null; 5 | } 6 | 7 | set token(value) { 8 | this._token = value; 9 | } 10 | 11 | get token() { 12 | return this._token; 13 | } 14 | 15 | toString() { 16 | var token = this._token || 'null'; 17 | return ''; 18 | } 19 | } 20 | 21 | 22 | -------------------------------------------------------------------------------- /www/lib/angular/angular-csp.css: -------------------------------------------------------------------------------- 1 | /* Include this file in your html if you are using the CSP mode. */ 2 | 3 | @charset "UTF-8"; 4 | 5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], 6 | .ng-cloak, .x-ng-cloak, 7 | .ng-hide:not(.ng-hide-animate) { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | 15 | .ng-animate-shim { 16 | visibility:hidden; 17 | } 18 | 19 | .ng-anchor { 20 | position:absolute; 21 | } 22 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/deploy/angular.js: -------------------------------------------------------------------------------- 1 | // Add Angular integrations if Angular is available 2 | if ((typeof angular === 'object') && angular.module) { 3 | 4 | var IonicAngularDeploy = null; 5 | 6 | angular.module('ionic.service.deploy', []) 7 | 8 | .factory('$ionicDeploy', [function() { 9 | if (!IonicAngularDeploy) { 10 | IonicAngularDeploy = new Ionic.Deploy(); 11 | } 12 | return IonicAngularDeploy; 13 | }]); 14 | } 15 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_backdrop.scss: -------------------------------------------------------------------------------- 1 | 2 | .backdrop { 3 | position: fixed; 4 | top: 0; 5 | left: 0; 6 | z-index: $z-index-backdrop; 7 | 8 | width: 100%; 9 | height: 100%; 10 | 11 | background-color: $loading-backdrop-bg-color; 12 | 13 | visibility: hidden; 14 | opacity: 0; 15 | 16 | &.visible { 17 | visibility: visible; 18 | } 19 | &.active { 20 | opacity: 1; 21 | } 22 | 23 | @include transition($loading-backdrop-fadein-duration opacity linear); 24 | } 25 | -------------------------------------------------------------------------------- /www/lib/angular/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.4.3", 4 | "main": "./angular.js", 5 | "ignore": [], 6 | "dependencies": {}, 7 | "homepage": "https://github.com/angular/bower-angular", 8 | "_release": "1.4.3", 9 | "_resolution": { 10 | "type": "version", 11 | "tag": "v1.4.3", 12 | "commit": "dbd689e8103a6366e53e1f6786727f7c65ccfd75" 13 | }, 14 | "_source": "git://github.com/angular/bower-angular.git", 15 | "_target": "1.4.3", 16 | "_originalSource": "angular" 17 | } -------------------------------------------------------------------------------- /www/lib/angular-ui-router/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-ui-router", 3 | "version": "0.2.13", 4 | "main": "./release/angular-ui-router.js", 5 | "dependencies": { 6 | "angular": ">= 1.0.8" 7 | }, 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "component.json", 13 | "package.json", 14 | "lib", 15 | "config", 16 | "sample", 17 | "test", 18 | "tests", 19 | "ngdoc_assets", 20 | "Gruntfile.js", 21 | "files.js" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-platform-web-client", 3 | "version": "0.2.1", 4 | "homepage": "https://github.com/driftyco/ionic-platform-web-client", 5 | "authors": [ 6 | "Eric Bobbitt " 8 | ], 9 | "description": "Ionic platform web client", 10 | "main": "dist/ionic.io.bundle.min.js", 11 | "license": "Apache2", 12 | "ignore": [ 13 | "**/.*", 14 | "node_modules", 15 | "bower_components", 16 | "test", 17 | "tests" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /www/templates/chat-detail.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 |

11 | {{chat.lastText}} 12 |

13 |
14 |
15 | -------------------------------------------------------------------------------- /www/lib/angular-animate/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-animate", 3 | "version": "1.4.3", 4 | "main": "./angular-animate.js", 5 | "ignore": [], 6 | "dependencies": { 7 | "angular": "1.4.3" 8 | }, 9 | "homepage": "https://github.com/angular/bower-angular-animate", 10 | "_release": "1.4.3", 11 | "_resolution": { 12 | "type": "version", 13 | "tag": "v1.4.3", 14 | "commit": "4ce2a76359401102d2e0146ccf69e6c060799ff8" 15 | }, 16 | "_source": "git://github.com/angular/bower-angular-animate.git", 17 | "_target": "1.4.3", 18 | "_originalSource": "angular-animate" 19 | } -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/analytics/es5.js: -------------------------------------------------------------------------------- 1 | import { Analytics } from "./analytics"; 2 | import { BucketStorage } from "./storage"; 3 | import { DOMSerializer } from "./serializers"; 4 | 5 | // Declare the window object 6 | window.Ionic = window.Ionic || {}; 7 | 8 | // Ionic Namespace 9 | Ionic.Analytics = Analytics; 10 | 11 | // Analytic Storage Namespace 12 | Ionic.AnalyticStorage = {}; 13 | Ionic.AnalyticStorage.BucketStorage = BucketStorage; 14 | 15 | // Analytic Serializers Namespace 16 | Ionic.AnalyticSerializers = {}; 17 | Ionic.AnalyticSerializers.DOMSerializer = DOMSerializer; 18 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.4.3", 4 | "main": "./angular-sanitize.js", 5 | "ignore": [], 6 | "dependencies": { 7 | "angular": "1.4.3" 8 | }, 9 | "homepage": "https://github.com/angular/bower-angular-sanitize", 10 | "_release": "1.4.3", 11 | "_resolution": { 12 | "type": "version", 13 | "tag": "v1.4.3", 14 | "commit": "0367ee4c3f9cb8af5d1da9ec35b71a8b523d9fc0" 15 | }, 16 | "_source": "git://github.com/angular/bower-angular-sanitize.git", 17 | "_target": "1.4.3", 18 | "_originalSource": "angular-sanitize" 19 | } -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | app = express(); 3 | 4 | app.use(express.static('www')); 5 | 6 | // CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests 7 | app.all('*', function(req, res, next) { 8 | res.header("Access-Control-Allow-Origin", "*"); 9 | res.header("Access-Control-Allow-Headers", "X-Requested-With"); 10 | next(); 11 | }); 12 | 13 | // API Routes 14 | // app.get('/blah', routeHandler); 15 | 16 | app.set('port', process.env.PORT || 5000); 17 | 18 | app.listen(app.get('port'), function () { 19 | console.log('Express server listening on port ' + app.get('port')); 20 | }); 21 | -------------------------------------------------------------------------------- /www/templates/tab-chats.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

{{chat.name}}

7 |

{{chat.lastText}}

8 | 9 | 10 | 11 | Delete 12 | 13 |
14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/ionicons/ionicons.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | @import "ionicons-variables"; 3 | /*! 4 | Ionicons, v2.0.1 5 | Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ 6 | https://twitter.com/benjsperry https://twitter.com/ionicframework 7 | MIT License: https://github.com/driftyco/ionicons 8 | 9 | Android-style icons originally built by Google’s 10 | Material Design Icons: https://github.com/google/material-design-icons 11 | used under CC BY http://creativecommons.org/licenses/by/4.0/ 12 | Modified icons to fit ionicon’s grid from original. 13 | */ 14 | 15 | @import "ionicons-font"; 16 | @import "ionicons-icons"; 17 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/analytics/storage.js: -------------------------------------------------------------------------------- 1 | import { Settings } from "../core/settings"; 2 | import { IonicPlatform } from "../core/core"; 3 | 4 | var settings = new Settings(); 5 | 6 | export class BucketStorage { 7 | constructor(name) { 8 | this.name = name; 9 | this.baseStorage = IonicPlatform.getStorage(); 10 | } 11 | 12 | get(key) { 13 | return this.baseStorage.retrieveObject(this.scopedKey(key)); 14 | } 15 | 16 | set(key, value) { 17 | return this.baseStorage.storeObject(this.scopedKey(key), value); 18 | } 19 | 20 | scopedKey(key) { 21 | return this.name + '_' + key + '_' + settings.get('app_id'); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /www/lib/angular/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.4.3", 4 | "description": "HTML enhanced for web apps", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/angular/angular.js.git" 12 | }, 13 | "keywords": [ 14 | "angular", 15 | "framework", 16 | "browser", 17 | "client-side" 18 | ], 19 | "author": "Angular Core Team ", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/angular/angular.js/issues" 23 | }, 24 | "homepage": "http://angularjs.org" 25 | } 26 | -------------------------------------------------------------------------------- /www/templates/train.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 |
    8 |
  • 9 | {{arrival.direction}} 10 | 11 |

    {{arrival.station.replace(' station', '') }}

    12 |
    13 |
    14 | {{arrival.waiting_time}} 15 |
    16 |
  • 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /www/lib/angular-animate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-animate", 3 | "version": "1.4.3", 4 | "description": "AngularJS module for animations", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/angular/angular.js.git" 12 | }, 13 | "keywords": [ 14 | "angular", 15 | "framework", 16 | "browser", 17 | "animation", 18 | "client-side" 19 | ], 20 | "author": "Angular Core Team ", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/angular/angular.js/issues" 24 | }, 25 | "homepage": "http://angularjs.org" 26 | } 27 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.4.3", 4 | "description": "AngularJS module for sanitizing HTML", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/angular/angular.js.git" 12 | }, 13 | "keywords": [ 14 | "angular", 15 | "framework", 16 | "browser", 17 | "html", 18 | "client-side" 19 | ], 20 | "author": "Angular Core Team ", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/angular/angular.js/issues" 24 | }, 25 | "homepage": "http://angularjs.org" 26 | } 27 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/promise.js: -------------------------------------------------------------------------------- 1 | var ES6Promise = require("es6-promise").Promise; 2 | 3 | export var Promise = ES6Promise; 4 | 5 | export class DeferredPromise { 6 | constructor() { 7 | var self = this; 8 | this._update = false; 9 | this.promise = new ES6Promise(function(resolve, reject) { 10 | self.resolve = resolve; 11 | self.reject = reject; 12 | }); 13 | var originalThen = this.promise.then; 14 | this.promise.then = function(ok, fail, update) { 15 | self._update = update; 16 | return originalThen.call(self.promise, ok, fail); 17 | }; 18 | } 19 | 20 | notify(value) { 21 | if (this._update && (typeof this._update === 'function')) { 22 | this._update(value); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.2.1 2 | 3 | * (push) (fix) prevent dev-mode from registering multiple callbacks 4 | * (user) (fix) prevent dev tokens from saving to a user 5 | 6 | 7 | ## 0.2.0 8 | 9 | * (core) removing need to call `Ionic.io();` manually 10 | * (deploy) update() can now defer reloading the app 11 | * (deploy) adding `getVersions` and `deleteVersion` methods to manage deploy versions. 12 | * (deploy) adding `getMetadata` method to fetch deploy metadata 13 | * (deploy) (fix) deploy methods now wait for the onReady event 14 | 15 | 16 | ## 0.1.1 17 | 18 | * (push) fixed notification handling for dev_push when using angular integrations 19 | * (push) getPayload() now returns the correct payload 20 | * (analytics) fixed incorrect log method references 21 | 22 | 23 | ## 0.1.0 24 | 25 | * web client introduction 26 | 27 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/ionic.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | @import 4 | // Ionicons 5 | "ionicons/ionicons.scss", 6 | 7 | // Variables 8 | "mixins", 9 | "variables", 10 | 11 | // Base 12 | "reset", 13 | "scaffolding", 14 | "type", 15 | 16 | // Components 17 | "action-sheet", 18 | "backdrop", 19 | "bar", 20 | "tabs", 21 | "menu", 22 | "modal", 23 | "popover", 24 | "popup", 25 | "loading", 26 | "items", 27 | "list", 28 | "badge", 29 | "slide-box", 30 | "slides", 31 | "refresher", 32 | "spinner", 33 | 34 | // Forms 35 | "form", 36 | "checkbox", 37 | "toggle", 38 | "radio", 39 | "range", 40 | "select", 41 | "progress", 42 | 43 | // Buttons 44 | "button", 45 | "button-bar", 46 | 47 | // Util 48 | "grid", 49 | "util", 50 | "platform", 51 | 52 | // Animations 53 | "animations", 54 | "transitions"; 55 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-ui-router", 3 | "version": "0.2.13", 4 | "main": "./release/angular-ui-router.js", 5 | "dependencies": { 6 | "angular": ">= 1.0.8" 7 | }, 8 | "ignore": [ 9 | "**/.*", 10 | "node_modules", 11 | "bower_components", 12 | "component.json", 13 | "package.json", 14 | "lib", 15 | "config", 16 | "sample", 17 | "test", 18 | "tests", 19 | "ngdoc_assets", 20 | "Gruntfile.js", 21 | "files.js" 22 | ], 23 | "homepage": "https://github.com/angular-ui/ui-router", 24 | "_release": "0.2.13", 25 | "_resolution": { 26 | "type": "version", 27 | "tag": "0.2.13", 28 | "commit": "c3d543aae43d4600512520a0d70723ac31f2cb62" 29 | }, 30 | "_source": "git://github.com/angular-ui/ui-router.git", 31 | "_target": "0.2.13", 32 | "_originalSource": "angular-ui-router" 33 | } -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-platform-web-client", 3 | "version": "0.2.1", 4 | "homepage": "https://github.com/driftyco/ionic-platform-web-client", 5 | "authors": [ 6 | "Eric Bobbitt " 8 | ], 9 | "description": "Ionic platform web client", 10 | "main": "dist/ionic.io.bundle.min.js", 11 | "license": "Apache2", 12 | "ignore": [ 13 | "**/.*", 14 | "node_modules", 15 | "bower_components", 16 | "test", 17 | "tests" 18 | ], 19 | "_release": "0.2.1", 20 | "_resolution": { 21 | "type": "version", 22 | "tag": "v0.2.1", 23 | "commit": "a9f03a5a7bc134202705cddac224767c214f4841" 24 | }, 25 | "_source": "git://github.com/driftyco/ionic-platform-web-client.git", 26 | "_target": "^0.2.1", 27 | "_originalSource": "ionic-platform-web-client", 28 | "_direct": true 29 | } -------------------------------------------------------------------------------- /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 | $ionicons-font-path: "../lib/ionic/fonts" !default; 20 | 21 | // Include all of Ionic 22 | @import "www/lib/ionic/scss/ionic"; 23 | 24 | -------------------------------------------------------------------------------- /www/templates/station.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 |
    8 |
  • 9 | {{arrival.direction}} 10 | 11 |

    {{arrival.destination}}

    12 |

    Train ID: {{arrival.train_id}}

    13 |
    14 | 15 |

    Scheduled Train

    16 |

    No realtime data.

    17 |
    18 |
    19 | {{arrival.waiting_time}} 20 |
    21 |
  • 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /www/templates/tabs.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/logger.js: -------------------------------------------------------------------------------- 1 | export class Logger { 2 | constructor(opts) { 3 | var options = opts || {}; 4 | this._silence = false; 5 | this._prefix = false; 6 | this._options = options; 7 | this._bootstrap(); 8 | } 9 | 10 | _bootstrap() { 11 | if (this._options.prefix) { 12 | this._prefix = this._options.prefix; 13 | } 14 | } 15 | 16 | info(data) { 17 | if (!this._silence) { 18 | if (this._prefix) { 19 | console.log(this._prefix, data); 20 | } else { 21 | console.log(data); 22 | } 23 | } 24 | } 25 | 26 | warn(data) { 27 | if (!this._silence) { 28 | if (this._prefix) { 29 | console.log(this._prefix, data); 30 | } else { 31 | console.log(data); 32 | } 33 | } 34 | } 35 | 36 | error(data) { 37 | if (this._prefix) { 38 | console.error(this._prefix, data); 39 | } else { 40 | console.error(data); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/angular.js: -------------------------------------------------------------------------------- 1 | // Add Angular integrations if Angular is available 2 | if ((typeof angular === 'object') && angular.module) { 3 | angular.module('ionic.service.core', []) 4 | 5 | /** 6 | * @private 7 | * Provides a safe interface to store objects in persistent memory 8 | */ 9 | .provider('persistentStorage', function() { 10 | return { 11 | '$get': [function() { 12 | var storage = Ionic.getService('Storage'); 13 | if (!storage) { 14 | storage = new Ionic.IO.Storage(); 15 | Ionic.addService('Storage', storage, true); 16 | } 17 | return storage; 18 | }] 19 | }; 20 | }) 21 | 22 | .factory('$ionicCoreSettings', [ 23 | function() { 24 | return new Ionic.IO.Settings(); 25 | } 26 | ]) 27 | 28 | .factory('$ionicUser', [ 29 | function() { 30 | return Ionic.User; 31 | } 32 | ]) 33 | 34 | .run([function() { 35 | Ionic.io(); 36 | }]); 37 | } 38 | 39 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/app.js: -------------------------------------------------------------------------------- 1 | import { Logger } from "./logger"; 2 | 3 | var privateData = {}; 4 | 5 | function privateVar(key) { 6 | return privateData[key] || null; 7 | } 8 | 9 | export class App { 10 | 11 | constructor(appId, apiKey) { 12 | this.logger = new Logger({ 13 | 'prefix': 'Ionic App:' 14 | }); 15 | if (!appId || appId === '') { 16 | this.logger.info('No app_id was provided'); 17 | return false; 18 | } 19 | 20 | if (!apiKey || apiKey === '') { 21 | this.logger.info('No api_key was provided'); 22 | return false; 23 | } 24 | 25 | privateData.id = appId; 26 | privateData.apiKey = apiKey; 27 | 28 | // other config value reference 29 | this.devPush = null; 30 | this.gcmKey = null; 31 | } 32 | 33 | get id() { 34 | return privateVar('id'); 35 | } 36 | 37 | get apiKey() { 38 | return privateVar('apiKey'); 39 | } 40 | 41 | toString() { 42 | return ''; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | Copyright (c) 2017 Jake Swanson 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "martaionic", 3 | "version": "1.1.1", 4 | "description": "martaionic: An Ionic project", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.13.4", 8 | "gulp": "^3.5.6", 9 | "gulp-concat": "^2.2.0", 10 | "gulp-minify-css": "^0.3.0", 11 | "gulp-rename": "^1.2.0", 12 | "gulp-sass": "^2.0.4" 13 | }, 14 | "devDependencies": { 15 | "bower": "^1.3.3", 16 | "gulp-util": "^2.2.14", 17 | "shelljs": "^0.3.0" 18 | }, 19 | "cordovaPlugins": [ 20 | "cordova-plugin-device", 21 | "cordova-plugin-whitelist", 22 | "cordova-plugin-splashscreen", 23 | "cordova-plugin-statusbar", 24 | "ionic-plugin-keyboard", 25 | "cordova-plugin-geolocation", 26 | "cordova-plugin-inappbrowser" 27 | ], 28 | "cordovaPlatforms": [ 29 | "ios", 30 | "android", 31 | { 32 | "platform": "android", 33 | "version": "", 34 | "locator": "android" 35 | }, 36 | { 37 | "platform": "ios", 38 | "version": "", 39 | "locator": "ios" 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_loading.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Loading 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .loading-container { 8 | position: absolute; 9 | left: 0; 10 | top: 0; 11 | right: 0; 12 | bottom: 0; 13 | 14 | z-index: $z-index-loading; 15 | 16 | @include display-flex(); 17 | @include justify-content(center); 18 | @include align-items(center); 19 | 20 | @include transition(0.2s opacity linear); 21 | visibility: hidden; 22 | opacity: 0; 23 | 24 | &:not(.visible) .icon, 25 | &:not(.visible) .spinner{ 26 | display: none; 27 | } 28 | &.visible { 29 | visibility: visible; 30 | } 31 | &.active { 32 | opacity: 1; 33 | } 34 | 35 | .loading { 36 | padding: $loading-padding; 37 | 38 | border-radius: $loading-border-radius; 39 | background-color: $loading-bg-color; 40 | 41 | color: $loading-text-color; 42 | 43 | text-align: center; 44 | text-overflow: ellipsis; 45 | font-size: $loading-font-size; 46 | 47 | h1, h2, h3, h4, h5, h6 { 48 | color: $loading-text-color; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/ionicons/_ionicons-font.scss: -------------------------------------------------------------------------------- 1 | // Ionicons Font Path 2 | // -------------------------- 3 | 4 | @font-face { 5 | font-family: $ionicons-font-family; 6 | src:url("#{$ionicons-font-path}/ionicons.eot?v=#{$ionicons-version}"); 7 | src:url("#{$ionicons-font-path}/ionicons.eot?v=#{$ionicons-version}#iefix") format("embedded-opentype"), 8 | url("#{$ionicons-font-path}/ionicons.ttf?v=#{$ionicons-version}") format("truetype"), 9 | url("#{$ionicons-font-path}/ionicons.woff?v=#{$ionicons-version}") format("woff"), 10 | url("#{$ionicons-font-path}/ionicons.woff") format("woff"), /* for WP8 */ 11 | url("#{$ionicons-font-path}/ionicons.svg?v=#{$ionicons-version}#Ionicons") format("svg"); 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | 16 | .ion { 17 | display: inline-block; 18 | font-family: $ionicons-font-family; 19 | speak: none; 20 | font-style: normal; 21 | font-weight: normal; 22 | font-variant: normal; 23 | text-transform: none; 24 | text-rendering: auto; 25 | line-height: 1; 26 | -webkit-font-smoothing: antialiased; 27 | -moz-osx-font-smoothing: grayscale; 28 | } 29 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_radio.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Radio Button Inputs 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .item-radio { 8 | padding: 0; 9 | 10 | &:hover { 11 | cursor: pointer; 12 | } 13 | } 14 | 15 | .item-radio .item-content { 16 | /* give some room to the right for the checkmark icon */ 17 | padding-right: $item-padding * 4; 18 | } 19 | 20 | .item-radio .radio-icon { 21 | /* checkmark icon will be hidden by default */ 22 | position: absolute; 23 | top: 0; 24 | right: 0; 25 | z-index: $z-index-item-radio; 26 | visibility: hidden; 27 | padding: $item-padding - 2; 28 | height: 100%; 29 | font-size: 24px; 30 | } 31 | 32 | .item-radio input { 33 | /* hide any radio button inputs elements (the ugly circles) */ 34 | position: absolute; 35 | left: -9999px; 36 | 37 | &:checked + .radio-content .item-content { 38 | /* style the item content when its checked */ 39 | background: #f7f7f7; 40 | } 41 | 42 | &:checked + .radio-content .radio-icon { 43 | /* show the checkmark icon when its checked */ 44 | visibility: visible; 45 | } 46 | } 47 | 48 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2014 The AngularUI Team, Karsten Sperling 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 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/src/stateFilters.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @ngdoc filter 3 | * @name ui.router.state.filter:isState 4 | * 5 | * @requires ui.router.state.$state 6 | * 7 | * @description 8 | * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}. 9 | */ 10 | $IsStateFilter.$inject = ['$state']; 11 | function $IsStateFilter($state) { 12 | var isFilter = function (state) { 13 | return $state.is(state); 14 | }; 15 | isFilter.$stateful = true; 16 | return isFilter; 17 | } 18 | 19 | /** 20 | * @ngdoc filter 21 | * @name ui.router.state.filter:includedByState 22 | * 23 | * @requires ui.router.state.$state 24 | * 25 | * @description 26 | * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}. 27 | */ 28 | $IncludedByStateFilter.$inject = ['$state']; 29 | function $IncludedByStateFilter($state) { 30 | var includesFilter = function (state) { 31 | return $state.includes(state); 32 | }; 33 | includesFilter.$stateful = true; 34 | return includesFilter; 35 | } 36 | 37 | angular.module('ui.router.state') 38 | .filter('isState', $IsStateFilter) 39 | .filter('includedByState', $IncludedByStateFilter); 40 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/request.js: -------------------------------------------------------------------------------- 1 | import { Promise } from "./promise"; 2 | 3 | var request = require("browser-request"); 4 | 5 | export class Request { 6 | constructor() { 7 | 8 | } 9 | } 10 | 11 | export class Response { 12 | constructor() { 13 | 14 | } 15 | } 16 | 17 | export class APIResponse extends Response { 18 | constructor() { 19 | super(); 20 | } 21 | } 22 | 23 | export class APIRequest extends Request { 24 | constructor(options) { 25 | super(); 26 | var requestInfo = {}; 27 | var p = new Promise(function(resolve, reject) { 28 | request(options, function(err, response, result) { 29 | requestInfo._lastError = err; 30 | requestInfo._lastResponse = response; 31 | requestInfo._lastResult = result; 32 | if (err) { 33 | reject(err); 34 | } else { 35 | if (response.statusCode < 200 || response.statusCode >= 400) { 36 | var _err = new Error("Request Failed with status code of " + response.statusCode); 37 | reject(_err); 38 | } else { 39 | resolve({ 'response': response, 'payload': result }); 40 | } 41 | } 42 | }); 43 | }); 44 | p.requestInfo = requestInfo; 45 | return p; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/settings.js: -------------------------------------------------------------------------------- 1 | class BaseSettings { 2 | 3 | constructor() { 4 | this._settings = null; 5 | return this; 6 | } 7 | 8 | factory(name, func) { 9 | this._settings = func(); 10 | return this; 11 | } 12 | 13 | get(name) { 14 | return this._settings.get(name); 15 | } 16 | 17 | finish() { 18 | return this; 19 | } 20 | } 21 | 22 | var temp = new BaseSettings().factory('$ionicCoreSettings', function() { 23 | "IONIC_SETTINGS_STRING_START";"IONIC_SETTINGS_STRING_END"; 24 | }) 25 | 26 | .finish(); 27 | 28 | export class Settings { 29 | 30 | constructor() { 31 | this._locations = { 32 | 'api': 'https://apps.ionic.io', 33 | 'push': 'https://push.ionic.io', 34 | 'analytics': 'https://analytics.ionic.io', 35 | 'deploy': 'https://apps.ionic.io' 36 | }; 37 | this._devLocations = this.get('dev_locations'); 38 | if (!this._devLocations) { this._devLocations = {}; } 39 | } 40 | 41 | get(name) { 42 | return temp.get(name); 43 | } 44 | 45 | getURL(name) { 46 | if (this._devLocations[name]) { 47 | return this._devLocations[name]; 48 | } else if (this._locations[name]) { 49 | return this._locations[name]; 50 | } else { 51 | return null; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_button-bar.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Button Bar 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .button-bar { 8 | @include display-flex(); 9 | @include flex(1); 10 | width: 100%; 11 | 12 | &.button-bar-inline { 13 | display: block; 14 | width: auto; 15 | 16 | @include clearfix(); 17 | 18 | > .button { 19 | width: auto; 20 | display: inline-block; 21 | float: left; 22 | } 23 | } 24 | } 25 | 26 | .button-bar > .button { 27 | @include flex(1); 28 | display: block; 29 | 30 | overflow: hidden; 31 | 32 | padding: 0 16px; 33 | 34 | width: 0; 35 | 36 | border-width: 1px 0px 1px 1px; 37 | border-radius: 0; 38 | text-align: center; 39 | text-overflow: ellipsis; 40 | white-space: nowrap; 41 | 42 | &:before, 43 | .icon:before { 44 | line-height: 44px; 45 | } 46 | 47 | &:first-child { 48 | border-radius: $button-border-radius 0px 0px $button-border-radius; 49 | } 50 | &:last-child { 51 | border-right-width: 1px; 52 | border-radius: 0px $button-border-radius $button-border-radius 0px; 53 | } 54 | &:only-child { 55 | border-radius: $button-border-radius; 56 | } 57 | } 58 | 59 | .button-bar > .button-small { 60 | &:before, 61 | .icon:before { 62 | line-height: 28px; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_animations.scss: -------------------------------------------------------------------------------- 1 | 2 | // Slide up from the bottom, used for modals 3 | // ------------------------------- 4 | 5 | .slide-in-up { 6 | @include translate3d(0, 100%, 0); 7 | } 8 | .slide-in-up.ng-enter, 9 | .slide-in-up > .ng-enter { 10 | @include transition(all cubic-bezier(.1, .7, .1, 1) 400ms); 11 | } 12 | .slide-in-up.ng-enter-active, 13 | .slide-in-up > .ng-enter-active { 14 | @include translate3d(0, 0, 0); 15 | } 16 | 17 | .slide-in-up.ng-leave, 18 | .slide-in-up > .ng-leave { 19 | @include transition(all ease-in-out 250ms); 20 | } 21 | 22 | 23 | // Scale Out 24 | // Scale from hero (1 in this case) to zero 25 | // ------------------------------- 26 | 27 | @-webkit-keyframes scaleOut { 28 | from { -webkit-transform: scale(1); opacity: 1; } 29 | to { -webkit-transform: scale(0.8); opacity: 0; } 30 | } 31 | @keyframes scaleOut { 32 | from { transform: scale(1); opacity: 1; } 33 | to { transform: scale(0.8); opacity: 0; } 34 | } 35 | 36 | 37 | // Super Scale In 38 | // Scale from super (1.x) to duper (1 in this case) 39 | // ------------------------------- 40 | 41 | @-webkit-keyframes superScaleIn { 42 | from { -webkit-transform: scale(1.2); opacity: 0; } 43 | to { -webkit-transform: scale(1); opacity: 1 } 44 | } 45 | @keyframes superScaleIn { 46 | from { transform: scale(1.2); opacity: 0; } 47 | to { transform: scale(1); opacity: 1; } 48 | } 49 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/README.md: -------------------------------------------------------------------------------- 1 | # ionic-platform-web-client 2 | A web client that provides interactions with the Ionic platform. 3 | Check out our [docs](http://docs.ionic.io/docs/io-introduction) for more detailed information. 4 | 5 | ## Installation 6 | 7 | Using the latest [Ionic CLI](https://github.com/driftyco/ionic-cli): 8 | 9 | Run the following commands in terminal: 10 | 11 | ```bash 12 | # first you need to install the web client 13 | $ ionic add ionic-platform-web-client 14 | 15 | # now you can register your app with the platform 16 | $ ionic io init 17 | ``` 18 | 19 | ## Usage 20 | 21 | ```javascript 22 | // You need to initialize the platform before you can start using any of the services 23 | var io = Ionic.io(); 24 | 25 | // You can now setup the current app user 26 | // If no user has been previously saved, a fresh user object is returned, 27 | // otherwise the last [current] saved user will be returned. 28 | var user = Ionic.User.current(); 29 | ``` 30 | 31 | Head over to our [docs](http://docs.ionic.io/docs/io-introduction) when you're ready to integrate services like analytics, push, or deploy. 32 | 33 | ## Get Help 34 | 35 | Head over to our [gitter.im](http://gitter.im/driftyco/ionic-io-testers) channel if you require assistance or have any questions about the platform services. 36 | 37 | ## Development 38 | 39 | 1. Install Dependencies `npm install` 40 | 2. Run `gulp build` 41 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_slide-box.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Slide Box 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .slider { 8 | position: relative; 9 | visibility: hidden; 10 | // Make sure items don't scroll over ever 11 | overflow: hidden; 12 | } 13 | 14 | .slider-slides { 15 | position: relative; 16 | height: 100%; 17 | } 18 | 19 | .slider-slide { 20 | position: relative; 21 | display: block; 22 | float: left; 23 | width: 100%; 24 | height: 100%; 25 | vertical-align: top; 26 | } 27 | 28 | .slider-slide-image { 29 | > img { 30 | width: 100%; 31 | } 32 | } 33 | 34 | .slider-pager { 35 | position: absolute; 36 | bottom: 20px; 37 | z-index: $z-index-slider-pager; 38 | width: 100%; 39 | height: 15px; 40 | text-align: center; 41 | 42 | .slider-pager-page { 43 | display: inline-block; 44 | margin: 0px 3px; 45 | width: 15px; 46 | color: #000; 47 | text-decoration: none; 48 | 49 | opacity: 0.3; 50 | 51 | &.active { 52 | @include transition(opacity 0.4s ease-in); 53 | opacity: 1; 54 | } 55 | } 56 | } 57 | 58 | //Disable animate service animations 59 | .slider-slide, 60 | .slider-pager-page { 61 | &.ng-enter, 62 | &.ng-leave, 63 | &.ng-animate { 64 | -webkit-transition: none !important; 65 | transition: none !important; 66 | } 67 | &.ng-animate { 68 | -webkit-animation: none 0s; 69 | animation: none 0s; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_menu.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Menus 4 | * -------------------------------------------------- 5 | * Side panel structure 6 | */ 7 | 8 | .menu { 9 | position: absolute; 10 | top: 0; 11 | bottom: 0; 12 | z-index: $z-index-menu; 13 | overflow: hidden; 14 | 15 | min-height: 100%; 16 | max-height: 100%; 17 | width: $menu-width; 18 | 19 | background-color: $menu-bg; 20 | 21 | .scroll-content { 22 | z-index: $z-index-menu-scroll-content; 23 | } 24 | 25 | .bar-header { 26 | z-index: $z-index-menu-bar-header; 27 | } 28 | } 29 | 30 | .menu-content { 31 | @include transform(none); 32 | box-shadow: $menu-side-shadow; 33 | } 34 | 35 | .menu-open .menu-content .pane, 36 | .menu-open .menu-content .scroll-content { 37 | pointer-events: none; 38 | } 39 | .menu-open .menu-content .scroll-content .scroll { 40 | pointer-events: none; 41 | } 42 | .menu-open .menu-content .scroll-content:not(.overflow-scroll) { 43 | overflow: hidden; 44 | } 45 | 46 | .grade-b .menu-content, 47 | .grade-c .menu-content { 48 | @include box-sizing(content-box); 49 | right: -1px; 50 | left: -1px; 51 | border-right: 1px solid #ccc; 52 | border-left: 1px solid #ccc; 53 | box-shadow: none; 54 | } 55 | 56 | .menu-left { 57 | left: 0; 58 | } 59 | 60 | .menu-right { 61 | right: 0; 62 | } 63 | 64 | .aside-open.aside-resizing .menu-right { 65 | display: none; 66 | } 67 | 68 | .menu-animated { 69 | @include transition-transform($menu-animation-speed ease); 70 | } 71 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/analytics/serializers.js: -------------------------------------------------------------------------------- 1 | export class DOMSerializer { 2 | 3 | elementSelector(element) { 4 | // iterate up the dom 5 | var selectors = []; 6 | while (element.tagName !== 'HTML') { 7 | var selector = element.tagName.toLowerCase(); 8 | 9 | var id = element.getAttribute('id'); 10 | if (id) { 11 | selector += "#" + id; 12 | } 13 | 14 | var className = element.className; 15 | if (className) { 16 | var classes = className.split(' '); 17 | for (var i = 0; i < classes.length; i++) { 18 | var c = classes[i]; 19 | if (c) { 20 | selector += '.' + c; 21 | } 22 | } 23 | } 24 | 25 | if (!element.parentNode) { 26 | return null; 27 | } 28 | var childIndex = Array.prototype.indexOf.call(element.parentNode.children, element); 29 | selector += ':nth-child(' + (childIndex + 1) + ')'; 30 | 31 | element = element.parentNode; 32 | selectors.push(selector); 33 | } 34 | 35 | return selectors.reverse().join('>'); 36 | } 37 | 38 | elementName(element) { 39 | // 1. ion-track-name directive 40 | var name = element.getAttribute('ion-track-name'); 41 | if (name) { 42 | return name; 43 | } 44 | 45 | // 2. id 46 | var id = element.getAttribute('id'); 47 | if (id) { 48 | return id; 49 | } 50 | 51 | // 3. no unique identifier --> return null 52 | return null; 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var gutil = require('gulp-util'); 3 | var bower = require('bower'); 4 | var concat = require('gulp-concat'); 5 | var sass = require('gulp-sass'); 6 | var minifyCss = require('gulp-minify-css'); 7 | var rename = require('gulp-rename'); 8 | var sh = require('shelljs'); 9 | 10 | var paths = { 11 | sass: ['./scss/**/*.scss'] 12 | }; 13 | 14 | gulp.task('default', ['sass']); 15 | 16 | gulp.task('sass', function(done) { 17 | gulp.src('./scss/ionic.app.scss') 18 | .pipe(sass()) 19 | .on('error', sass.logError) 20 | .pipe(gulp.dest('./www/css/')) 21 | .pipe(minifyCss({ 22 | keepSpecialComments: 0 23 | })) 24 | .pipe(rename({ extname: '.min.css' })) 25 | .pipe(gulp.dest('./www/css/')) 26 | .on('end', done); 27 | }); 28 | 29 | gulp.task('watch', function() { 30 | gulp.watch(paths.sass, ['sass']); 31 | }); 32 | 33 | gulp.task('install', ['git-check'], function() { 34 | return bower.commands.install() 35 | .on('log', function(data) { 36 | gutil.log('bower', gutil.colors.cyan(data.id), data.message); 37 | }); 38 | }); 39 | 40 | gulp.task('git-check', function(done) { 41 | if (!sh.which('git')) { 42 | console.log( 43 | ' ' + gutil.colors.red('Git is not installed.'), 44 | '\n Git, the version control system, is required to download Ionic.', 45 | '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', 46 | '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' 47 | ); 48 | process.exit(1); 49 | } 50 | done(); 51 | }); 52 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/build/config.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var pkg = require('../package.json'); 3 | 4 | var src = { 5 | 'core': [ 6 | 'src/core/promise.js', 7 | 'src/core/request.js', 8 | 'src/core/events.js', 9 | 'src/core/logger.js', 10 | 'src/core/storage.js', 11 | 'src/core/settings.js', 12 | 'src/core/data-types.js', 13 | 'src/core/core.js', 14 | 'src/core/user.js', 15 | 'src/core/app.js', 16 | 'src/core/es5.js', 17 | 'src/core/angular.js' 18 | ], 19 | 20 | 'push': [ 21 | 'src/push/push-token.js', 22 | 'src/push/push-message.js', 23 | 'src/push/push-dev.js', 24 | 'src/push/push.js', 25 | 'src/push/es5.js', 26 | 'src/push/angular.js' 27 | ], 28 | 29 | 'deploy': [ 30 | 'src/deploy/deploy.js', 31 | 'src/deploy/es5.js', 32 | 'src/deploy/angular.js' 33 | ], 34 | 35 | 'analytics': [ 36 | 'src/analytics/storage.js', 37 | 'src/analytics/serializers.js', 38 | 'src/analytics/analytics.js', 39 | 'src/analytics/es5.js', 40 | 'src/analytics/angular.js' 41 | ] 42 | }; 43 | 44 | module.exports = { 45 | banner: 46 | '/**\n' + 47 | ' * Ionic Core Module\n' + 48 | ' * Copyright 2015 Ionic http://ionicframework.com/\n' + 49 | ' * See LICENSE in this repository for license information\n' + 50 | ' */\n\n', 51 | 52 | dist: './dist', 53 | 54 | sourceFiles: { 55 | 'core': src.core, 56 | 'push': src.push, 57 | 'deploy': src.deploy, 58 | 'analytics': src.analytics, 59 | 'bundle': [].concat( 60 | src.core, 61 | src.push, 62 | src.deploy, 63 | src.analytics 64 | ) 65 | }, 66 | 67 | versionData: { 68 | version: pkg.version 69 | } 70 | }; 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # deprecated - look at jakswa/marta_ui 2 | 3 | # martaionic [![Gitter](https://badges.gitter.im/jakswa/martaionic.svg)](https://gitter.im/jakswa/martaionic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 4 | 5 | This is where the common UI lives for http://marta.io and its sister mobile apps (on [android](https://play.google.com/store/apps/details?id=com.ionicframework.martaionic451202) and [iOS](https://itunes.apple.com/us/app/marta.io/id1082012161)). 6 | 7 | ## Features 8 | marta.io displays realtime MARTA API results for trains, updated every 10s. It breaks this data down into three views: 9 | 10 | 1. Dashboard 11 | 12 | The main view, a list of stations shows when you first launch the app. If location access is granted, the three closest stations stick to the top. Dragging left on a station lets you star it, which will put it at the very top of your list for quick access. 13 | 14 | ![img](http://i.imgur.com/cILuvvp.gif) 15 | 16 | 2. Station View 17 | 18 | Tap a station on the dashboard and you can see its upcoming trains, with schedule data mixed in if no realtime data is present for a given direction. 19 | 20 | 3. Train View 21 | 22 | After drilling down to station view, a second tap on a train takes you to that train's estimates. This is useful if you want to know when your train is estimated to arrive at a future station. 23 | 24 | ## Developing 25 | I'm so new to ionic that I don't know the official instructions for 26 | cloning and running this locally, but I bet it's close to something like: 27 | 28 | 1. Clone the repo, `cd` into it 29 | 2. run `npm install` 30 | 3. run `npm install -g ionic cordova` 31 | 3. run `ionic serve` and follow directions (might need to install a couple more things, I forget) 32 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/src/viewScroll.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @ngdoc object 3 | * @name ui.router.state.$uiViewScrollProvider 4 | * 5 | * @description 6 | * Provider that returns the {@link ui.router.state.$uiViewScroll} service function. 7 | */ 8 | function $ViewScrollProvider() { 9 | 10 | var useAnchorScroll = false; 11 | 12 | /** 13 | * @ngdoc function 14 | * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll 15 | * @methodOf ui.router.state.$uiViewScrollProvider 16 | * 17 | * @description 18 | * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for 19 | * scrolling based on the url anchor. 20 | */ 21 | this.useAnchorScroll = function () { 22 | useAnchorScroll = true; 23 | }; 24 | 25 | /** 26 | * @ngdoc object 27 | * @name ui.router.state.$uiViewScroll 28 | * 29 | * @requires $anchorScroll 30 | * @requires $timeout 31 | * 32 | * @description 33 | * When called with a jqLite element, it scrolls the element into view (after a 34 | * `$timeout` so the DOM has time to refresh). 35 | * 36 | * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor, 37 | * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}. 38 | */ 39 | this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) { 40 | if (useAnchorScroll) { 41 | return $anchorScroll; 42 | } 43 | 44 | return function ($element) { 45 | $timeout(function () { 46 | $element[0].scrollIntoView(); 47 | }, 0, false); 48 | }; 49 | }]; 50 | } 51 | 52 | angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider); 53 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_badge.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Badges 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .badge { 8 | @include badge-style($badge-default-bg, $badge-default-text); 9 | z-index: $z-index-badge; 10 | display: inline-block; 11 | padding: 3px 8px; 12 | min-width: 10px; 13 | border-radius: $badge-border-radius; 14 | vertical-align: baseline; 15 | text-align: center; 16 | white-space: nowrap; 17 | font-weight: $badge-font-weight; 18 | font-size: $badge-font-size; 19 | line-height: $badge-line-height; 20 | 21 | &:empty { 22 | display: none; 23 | } 24 | } 25 | 26 | //Be sure to override specificity of rule that 'badge color matches tab color by default' 27 | .tabs .tab-item .badge, 28 | .badge { 29 | &.badge-light { 30 | @include badge-style($badge-light-bg, $badge-light-text); 31 | } 32 | &.badge-stable { 33 | @include badge-style($badge-stable-bg, $badge-stable-text); 34 | } 35 | &.badge-positive { 36 | @include badge-style($badge-positive-bg, $badge-positive-text); 37 | } 38 | &.badge-calm { 39 | @include badge-style($badge-calm-bg, $badge-calm-text); 40 | } 41 | &.badge-assertive { 42 | @include badge-style($badge-assertive-bg, $badge-assertive-text); 43 | } 44 | &.badge-balanced { 45 | @include badge-style($badge-balanced-bg, $badge-balanced-text); 46 | } 47 | &.badge-energized { 48 | @include badge-style($badge-energized-bg, $badge-energized-text); 49 | } 50 | &.badge-royal { 51 | @include badge-style($badge-royal-bg, $badge-royal-text); 52 | } 53 | &.badge-dark { 54 | @include badge-style($badge-dark-bg, $badge-dark-text); 55 | } 56 | } 57 | 58 | // Quick fix for labels/badges in buttons 59 | .button .badge { 60 | position: relative; 61 | top: -1px; 62 | } 63 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/push/push-message.js: -------------------------------------------------------------------------------- 1 | class PushMessageAppStatus { 2 | constructor() { 3 | this.asleep = false; 4 | this.closed = false; 5 | } 6 | 7 | get wasAsleep() { 8 | return this.asleep; 9 | } 10 | 11 | get wasClosed() { 12 | return this.closed; 13 | } 14 | } 15 | 16 | export class PushMessage { 17 | 18 | constructor(raw) { 19 | this._raw = raw || {}; 20 | 21 | if (!this._raw.additionalData) { 22 | // this should only hit if we are serving up a development push 23 | this._raw.additionalData = { 24 | 'coldstart': false, 25 | 'foreground': true 26 | }; 27 | } 28 | 29 | this._payload = null; 30 | this.app = null; 31 | this.text = null; 32 | this.title = null; 33 | this.count = null; 34 | this.sound = null; 35 | this.image = null; 36 | } 37 | 38 | static fromPluginJSON(json) { 39 | var message = new PushMessage(json); 40 | message.processRaw(); 41 | return message; 42 | } 43 | 44 | get payload() { 45 | return this._payload || {}; 46 | } 47 | 48 | processRaw() { 49 | this.text = this._raw.message || null; 50 | this.title = this._raw.title || null; 51 | this.count = this._raw.count || null; 52 | this.sound = this._raw.sound || null; 53 | this.image = this._raw.image || null; 54 | this.app = new PushMessageAppStatus(); 55 | 56 | if (!this._raw.additionalData.foreground) { 57 | this.app.asleep = true; 58 | } 59 | 60 | if (this._raw.additionalData.coldstart) { 61 | this.app.closed = true; 62 | } 63 | 64 | if (this._raw.additionalData.payload) { 65 | this._payload = this._raw.additionalData.payload; 66 | } 67 | } 68 | 69 | getRawVersion() { 70 | return this._raw; 71 | } 72 | 73 | toString() { 74 | return ''; 75 | } 76 | } 77 | 78 | 79 | -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | marta.io 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/data-types.js: -------------------------------------------------------------------------------- 1 | var dataTypeMapping = {}; 2 | 3 | class DataTypeSchema { 4 | constructor(properties) { 5 | this.data = {}; 6 | this.setProperties(properties); 7 | } 8 | 9 | setProperties(properties) { 10 | if (properties instanceof Object) { 11 | for (var x in properties) { 12 | this.data[x] = properties[x]; 13 | } 14 | } 15 | } 16 | 17 | toJSON() { 18 | var data = this.data; 19 | return { 20 | '__Ionic_DataTypeSchema': data.name, 21 | 'value': data.value 22 | }; 23 | } 24 | 25 | isValid() { 26 | if (this.data.name && this.data.value) { 27 | return true; 28 | } 29 | return false; 30 | } 31 | } 32 | 33 | export class DataType { 34 | static get(name, value) { 35 | if (dataTypeMapping[name]) { 36 | return new dataTypeMapping[name](value); 37 | } 38 | return false; 39 | } 40 | 41 | static getMapping() { 42 | return dataTypeMapping; 43 | } 44 | 45 | static get Schema() { 46 | return DataTypeSchema; 47 | } 48 | 49 | static register(name, cls) { 50 | dataTypeMapping[name] = cls; 51 | } 52 | } 53 | 54 | export class UniqueArray { 55 | 56 | constructor(value) { 57 | this.data = []; 58 | if (value instanceof Array) { 59 | for (var x in value) { 60 | this.push(value[x]); 61 | } 62 | } 63 | } 64 | 65 | toJSON() { 66 | var data = this.data; 67 | var schema = new DataTypeSchema({ 'name': 'UniqueArray', 'value': data }); 68 | return schema.toJSON(); 69 | } 70 | 71 | static fromStorage(value) { 72 | return new UniqueArray(value); 73 | } 74 | 75 | push(value) { 76 | if (this.data.indexOf(value) === -1) { 77 | this.data.push(value); 78 | } 79 | } 80 | 81 | pull(value) { 82 | var index = this.data.indexOf(value); 83 | this.data.splice(index, 1); 84 | } 85 | } 86 | 87 | DataType.register('UniqueArray', UniqueArray); 88 | -------------------------------------------------------------------------------- /www/lib/angular/README.md: -------------------------------------------------------------------------------- 1 | # packaged angular 2 | 3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | You can install this package either with `npm` or with `bower`. 10 | 11 | ### npm 12 | 13 | ```shell 14 | npm install angular 15 | ``` 16 | 17 | Then add a ` 21 | ``` 22 | 23 | Or `require('angular')` from your code. 24 | 25 | ### bower 26 | 27 | ```shell 28 | bower install angular 29 | ``` 30 | 31 | Then add a ` 35 | ``` 36 | 37 | ## Documentation 38 | 39 | Documentation is available on the 40 | [AngularJS docs site](http://docs.angularjs.org/). 41 | 42 | ## License 43 | 44 | The MIT License 45 | 46 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org 47 | 48 | Permission is hereby granted, free of charge, to any person obtaining a copy 49 | of this software and associated documentation files (the "Software"), to deal 50 | in the Software without restriction, including without limitation the rights 51 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 52 | copies of the Software, and to permit persons to whom the Software is 53 | furnished to do so, subject to the following conditions: 54 | 55 | The above copyright notice and this permission notice shall be included in 56 | all copies or substantial portions of the Software. 57 | 58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 59 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 61 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 62 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 63 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 64 | THE SOFTWARE. 65 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/es5.js: -------------------------------------------------------------------------------- 1 | import { App } from "./app"; 2 | import { IonicPlatform } from "./core"; 3 | import { EventEmitter } from "./events"; 4 | import { Logger } from "./logger"; 5 | import { Promise, DeferredPromise } from "./promise"; 6 | import { Request, Response, APIRequest, APIResponse } from "./request"; 7 | import { Settings } from "./settings"; 8 | import { Storage } from "./storage"; 9 | import { User } from "./user"; 10 | import { DataType } from "./data-types"; 11 | 12 | 13 | // Declare the window object 14 | window.Ionic = window.Ionic || {}; 15 | 16 | // Ionic Namespace 17 | Ionic.Core = IonicPlatform; 18 | Ionic.User = User; 19 | 20 | // DataType Namespace 21 | Ionic.DataType = DataType; 22 | Ionic.DataTypes = DataType.getMapping(); 23 | 24 | // IO Namespace 25 | Ionic.IO = {}; 26 | Ionic.IO.App = App; 27 | Ionic.IO.EventEmitter = EventEmitter; 28 | Ionic.IO.Logger = Logger; 29 | Ionic.IO.Promise = Promise; 30 | Ionic.IO.DeferredPromise = DeferredPromise; 31 | Ionic.IO.Request = Request; 32 | Ionic.IO.Response = Response; 33 | Ionic.IO.APIRequest = APIRequest; 34 | Ionic.IO.APIResponse = APIResponse; 35 | Ionic.IO.Storage = Storage; 36 | Ionic.IO.Settings = Settings; 37 | 38 | 39 | // Provider a single storage for services that have previously been registered 40 | var serviceStorage = {}; 41 | 42 | Ionic.io = function() { 43 | if (typeof Ionic.IO.main === 'undefined') { 44 | Ionic.IO.main = new Ionic.Core(); 45 | } 46 | return Ionic.IO.main; 47 | }; 48 | 49 | Ionic.getService = function(name) { 50 | if (typeof serviceStorage[name] === 'undefined' || !serviceStorage[name]) { 51 | return false; 52 | } 53 | return serviceStorage[name]; 54 | }; 55 | 56 | Ionic.addService = function(name, service, force) { 57 | if (service && typeof serviceStorage[name] === 'undefined') { 58 | serviceStorage[name] = service; 59 | } else if (service && force) { 60 | serviceStorage[name] = service; 61 | } 62 | }; 63 | 64 | Ionic.removeService = function(name) { 65 | if (typeof serviceStorage[name] !== 'undefined') { 66 | delete serviceStorage[name]; 67 | } 68 | }; 69 | 70 | // Kickstart Ionic Platform 71 | Ionic.io(); 72 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_platform.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Platform 4 | * -------------------------------------------------- 5 | * Platform specific tweaks 6 | */ 7 | 8 | .platform-ios.platform-cordova { 9 | // iOS has a status bar which sits on top of the header. 10 | // Bump down everything to make room for it. However, if 11 | // if its in Cordova, and set to fullscreen, then disregard the bump. 12 | &:not(.fullscreen) { 13 | .bar-header:not(.bar-subheader) { 14 | height: $bar-height + $ios-statusbar-height; 15 | 16 | &.item-input-inset .item-input-wrapper { 17 | margin-top: 19px !important; 18 | } 19 | 20 | > * { 21 | margin-top: $ios-statusbar-height; 22 | } 23 | } 24 | .tabs-top > .tabs, 25 | .tabs.tabs-top { 26 | top: $bar-height + $ios-statusbar-height; 27 | } 28 | 29 | .has-header, 30 | .bar-subheader { 31 | top: $bar-height + $ios-statusbar-height; 32 | } 33 | .has-subheader { 34 | top: $bar-height + $bar-subheader-height + $ios-statusbar-height; 35 | } 36 | .has-header.has-tabs-top { 37 | top: $bar-height + $tabs-height + $ios-statusbar-height; 38 | } 39 | .has-header.has-subheader.has-tabs-top { 40 | top: $bar-height + $bar-subheader-height + $tabs-height + $ios-statusbar-height; 41 | } 42 | } 43 | .popover{ 44 | .bar-header:not(.bar-subheader) { 45 | height: $bar-height; 46 | &.item-input-inset .item-input-wrapper { 47 | margin-top: -1px; 48 | } 49 | > * { 50 | margin-top: 0; 51 | } 52 | } 53 | .has-header, 54 | .bar-subheader { 55 | top: $bar-height; 56 | } 57 | .has-subheader { 58 | top: $bar-height + $bar-subheader-height; 59 | } 60 | } 61 | &.status-bar-hide { 62 | // Cordova doesn't adjust the body height correctly, this makes up for it 63 | margin-bottom: 20px; 64 | } 65 | } 66 | 67 | @media (orientation:landscape) { 68 | .platform-ios.platform-browser.platform-ipad { 69 | position: fixed; // required for iPad 7 Safari 70 | } 71 | } 72 | 73 | .platform-c:not(.enable-transitions) * { 74 | // disable transitions on grade-c devices (Android 2) 75 | -webkit-transition: none !important; 76 | transition: none !important; 77 | } 78 | -------------------------------------------------------------------------------- /www/js/app.js: -------------------------------------------------------------------------------- 1 | // Ionic Starter App 2 | 3 | // angular.module is a global place for creating, registering and retrieving Angular modules 4 | // 'starter' is the name of this angular module example (also set in a attribute in index.html) 5 | // the 2nd parameter is an array of 'requires' 6 | // 'starter.services' is found in services.js 7 | // 'starter.controllers' is found in controllers.js 8 | angular.module('starter', ['ionic','ionic.service.core', 'starter.controllers', 'starter.services']) 9 | 10 | .run(function($ionicPlatform) { 11 | $ionicPlatform.ready(function() { 12 | // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 13 | // for form inputs) 14 | if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 15 | cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 16 | cordova.plugins.Keyboard.disableScroll(true); 17 | 18 | } 19 | if (window.StatusBar) { 20 | // org.apache.cordova.statusbar required 21 | StatusBar.styleDefault(); 22 | } 23 | }); 24 | }) 25 | 26 | .config(function($stateProvider, $urlRouterProvider) { 27 | 28 | // Ionic uses AngularUI Router which uses the concept of states 29 | // Learn more here: https://github.com/angular-ui/ui-router 30 | // Set up the various states which the app can be in. 31 | // Each state's controller can be found in controllers.js 32 | 33 | 34 | // setup an abstract state for the tabs directive 35 | // $stateProvider.state('tab', { 36 | // url: '/tab', 37 | // abstract: true, 38 | // templateUrl: 'templates/tabs.html' 39 | // }); 40 | 41 | // Each tab has its own nav history stack: 42 | 43 | $stateProvider.state('dash', { 44 | url: '/dash', 45 | templateUrl: 'templates/tab-dash.html', 46 | controller: 'DashCtrl' 47 | }) 48 | 49 | .state('station', { 50 | url: '/station/:stationName', 51 | templateUrl: 'templates/station.html', 52 | controller: 'StationCtrl' 53 | }) 54 | .state('train', { 55 | url: '/train/:trainId', 56 | templateUrl: 'templates/train.html', 57 | controller: 'TrainCtrl' 58 | }) 59 | 60 | // if none of the above states are matched, use this as the fallback 61 | $urlRouterProvider.otherwise('/dash'); 62 | 63 | }); 64 | -------------------------------------------------------------------------------- /www/lib/angular-animate/README.md: -------------------------------------------------------------------------------- 1 | # packaged angular-animate 2 | 3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | You can install this package either with `npm` or with `bower`. 10 | 11 | ### npm 12 | 13 | ```shell 14 | npm install angular-animate 15 | ``` 16 | 17 | Then add `ngAnimate` as a dependency for your app: 18 | 19 | ```javascript 20 | angular.module('myApp', [require('angular-animate')]); 21 | ``` 22 | 23 | ### bower 24 | 25 | ```shell 26 | bower install angular-animate 27 | ``` 28 | 29 | Then add a ` 33 | ``` 34 | 35 | Then add `ngAnimate` as a dependency for your app: 36 | 37 | ```javascript 38 | angular.module('myApp', ['ngAnimate']); 39 | ``` 40 | 41 | ## Documentation 42 | 43 | Documentation is available on the 44 | [AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). 45 | 46 | ## License 47 | 48 | The MIT License 49 | 50 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org 51 | 52 | Permission is hereby granted, free of charge, to any person obtaining a copy 53 | of this software and associated documentation files (the "Software"), to deal 54 | in the Software without restriction, including without limitation the rights 55 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 56 | copies of the Software, and to permit persons to whom the Software is 57 | furnished to do so, subject to the following conditions: 58 | 59 | The above copyright notice and this permission notice shall be included in 60 | all copies or substantial portions of the Software. 61 | 62 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 63 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 64 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 65 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 66 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 67 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 68 | THE SOFTWARE. 69 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/README.md: -------------------------------------------------------------------------------- 1 | # packaged angular-sanitize 2 | 3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the 4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize). 5 | Please file issues and pull requests against that repo. 6 | 7 | ## Install 8 | 9 | You can install this package either with `npm` or with `bower`. 10 | 11 | ### npm 12 | 13 | ```shell 14 | npm install angular-sanitize 15 | ``` 16 | 17 | Then add `ngSanitize` as a dependency for your app: 18 | 19 | ```javascript 20 | angular.module('myApp', [require('angular-sanitize')]); 21 | ``` 22 | 23 | ### bower 24 | 25 | ```shell 26 | bower install angular-sanitize 27 | ``` 28 | 29 | Add a ` 33 | ``` 34 | 35 | Then add `ngSanitize` as a dependency for your app: 36 | 37 | ```javascript 38 | angular.module('myApp', ['ngSanitize']); 39 | ``` 40 | 41 | ## Documentation 42 | 43 | Documentation is available on the 44 | [AngularJS docs site](http://docs.angularjs.org/api/ngSanitize). 45 | 46 | ## License 47 | 48 | The MIT License 49 | 50 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org 51 | 52 | Permission is hereby granted, free of charge, to any person obtaining a copy 53 | of this software and associated documentation files (the "Software"), to deal 54 | in the Software without restriction, including without limitation the rights 55 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 56 | copies of the Software, and to permit persons to whom the Software is 57 | furnished to do so, subject to the following conditions: 58 | 59 | The above copyright notice and this permission notice shall be included in 60 | all copies or substantial portions of the Software. 61 | 62 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 63 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 64 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 65 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 66 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 67 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 68 | THE SOFTWARE. 69 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/push/angular.js: -------------------------------------------------------------------------------- 1 | // Add Angular integrations if Angular is available 2 | if ((typeof angular === 'object') && angular.module) { 3 | 4 | var IonicAngularPush = null; 5 | 6 | angular.module('ionic.service.push', []) 7 | 8 | /** 9 | * IonicPushAction Service 10 | * 11 | * A utility service to kick off misc features as part of the Ionic Push service 12 | */ 13 | .factory('$ionicPushAction', ['$state', function($state) { 14 | 15 | class PushActionService { 16 | 17 | /** 18 | * State Navigation 19 | * 20 | * Attempts to navigate to a new view if a push notification payload contains: 21 | * 22 | * - $state {String} The state name (e.g 'tab.chats') 23 | * - $stateParams {Object} Provided state (url) params 24 | * 25 | * Find more info about state navigation and params: 26 | * https://github.com/angular-ui/ui-router/wiki 27 | * 28 | * @param {object} notification Notification Object 29 | * @return {void} 30 | */ 31 | notificationNavigation(notification) { 32 | var state = false; 33 | var stateParams = {}; 34 | 35 | try { 36 | state = notification.additionalData.payload.$state; 37 | } catch (e) { 38 | state = false; 39 | } 40 | 41 | try { 42 | stateParams = JSON.parse(notification.additionalData.payload.$stateParams); 43 | } catch (e) { 44 | stateParams = {}; 45 | } 46 | 47 | if (state) { 48 | $state.go(state, stateParams); 49 | } 50 | } 51 | } 52 | 53 | return new PushActionService(); 54 | }]) 55 | 56 | .factory('$ionicPush', [function() { 57 | if (!IonicAngularPush) { 58 | IonicAngularPush = new Ionic.Push("DEFER_INIT"); 59 | } 60 | return IonicAngularPush; 61 | }]) 62 | 63 | .run(['$ionicPush', '$ionicPushAction', function($ionicPush, $ionicPushAction) { 64 | // This is what kicks off the state redirection when a push notificaiton has the relevant details 65 | $ionicPush._emitter.on('ionic_push:processNotification', function(notification) { 66 | if (notification && notification.additionalData && notification.additionalData.foreground === false) { 67 | $ionicPushAction.notificationNavigation(notification); 68 | } 69 | }); 70 | 71 | }]); 72 | } 73 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/src/view.js: -------------------------------------------------------------------------------- 1 | 2 | $ViewProvider.$inject = []; 3 | function $ViewProvider() { 4 | 5 | this.$get = $get; 6 | /** 7 | * @ngdoc object 8 | * @name ui.router.state.$view 9 | * 10 | * @requires ui.router.util.$templateFactory 11 | * @requires $rootScope 12 | * 13 | * @description 14 | * 15 | */ 16 | $get.$inject = ['$rootScope', '$templateFactory']; 17 | function $get( $rootScope, $templateFactory) { 18 | return { 19 | // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... }) 20 | /** 21 | * @ngdoc function 22 | * @name ui.router.state.$view#load 23 | * @methodOf ui.router.state.$view 24 | * 25 | * @description 26 | * 27 | * @param {string} name name 28 | * @param {object} options option object. 29 | */ 30 | load: function load(name, options) { 31 | var result, defaults = { 32 | template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {} 33 | }; 34 | options = extend(defaults, options); 35 | 36 | if (options.view) { 37 | result = $templateFactory.fromConfig(options.view, options.params, options.locals); 38 | } 39 | if (result && options.notify) { 40 | /** 41 | * @ngdoc event 42 | * @name ui.router.state.$state#$viewContentLoading 43 | * @eventOf ui.router.state.$view 44 | * @eventType broadcast on root scope 45 | * @description 46 | * 47 | * Fired once the view **begins loading**, *before* the DOM is rendered. 48 | * 49 | * @param {Object} event Event object. 50 | * @param {Object} viewConfig The view config properties (template, controller, etc). 51 | * 52 | * @example 53 | * 54 | *
55 |          * $scope.$on('$viewContentLoading',
56 |          * function(event, viewConfig){
57 |          *     // Access to all the view config properties.
58 |          *     // and one special property 'targetView'
59 |          *     // viewConfig.targetView
60 |          * });
61 |          * 
62 | */ 63 | $rootScope.$broadcast('$viewContentLoading', options); 64 | } 65 | return result; 66 | } 67 | }; 68 | } 69 | } 70 | 71 | angular.module('ui.router.state').provider('$view', $ViewProvider); 72 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_spinner.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Spinners 3 | * -------------------------------------------------- 4 | */ 5 | 6 | .spinner { 7 | svg { 8 | width: $spinner-width; 9 | height: $spinner-height; 10 | } 11 | 12 | stroke: $spinner-default-stroke; 13 | fill: $spinner-default-fill; 14 | 15 | &.spinner-light { 16 | stroke: $spinner-light-stroke; 17 | fill: $spinner-light-fill; 18 | } 19 | &.spinner-stable { 20 | stroke: $spinner-stable-stroke; 21 | fill: $spinner-stable-fill; 22 | } 23 | &.spinner-positive { 24 | stroke: $spinner-positive-stroke; 25 | fill: $spinner-positive-fill; 26 | } 27 | &.spinner-calm { 28 | stroke: $spinner-calm-stroke; 29 | fill: $spinner-calm-fill; 30 | } 31 | &.spinner-balanced { 32 | stroke: $spinner-balanced-stroke; 33 | fill: $spinner-balanced-fill; 34 | } 35 | &.spinner-assertive { 36 | stroke: $spinner-assertive-stroke; 37 | fill: $spinner-assertive-fill; 38 | } 39 | &.spinner-energized { 40 | stroke: $spinner-energized-stroke; 41 | fill: $spinner-energized-fill; 42 | } 43 | &.spinner-royal { 44 | stroke: $spinner-royal-stroke; 45 | fill: $spinner-royal-fill; 46 | } 47 | &.spinner-dark { 48 | stroke: $spinner-dark-stroke; 49 | fill: $spinner-dark-fill; 50 | } 51 | } 52 | 53 | .spinner-android { 54 | stroke: #4b8bf4; 55 | } 56 | 57 | .spinner-ios, 58 | .spinner-ios-small { 59 | stroke: #69717d; 60 | } 61 | 62 | .spinner-spiral { 63 | .stop1 { 64 | stop-color: $spinner-light-fill; 65 | stop-opacity: 0; 66 | } 67 | 68 | &.spinner-light { 69 | .stop1 { 70 | stop-color: $spinner-default-fill; 71 | } 72 | .stop2 { 73 | stop-color: $spinner-light-fill; 74 | } 75 | } 76 | &.spinner-stable .stop2 { 77 | stop-color: $spinner-stable-fill; 78 | } 79 | &.spinner-positive .stop2 { 80 | stop-color: $spinner-positive-fill; 81 | } 82 | &.spinner-calm .stop2 { 83 | stop-color: $spinner-calm-fill; 84 | } 85 | &.spinner-balanced .stop2 { 86 | stop-color: $spinner-balanced-fill; 87 | } 88 | &.spinner-assertive .stop2 { 89 | stop-color: $spinner-assertive-fill; 90 | } 91 | &.spinner-energized .stop2 { 92 | stop-color: $spinner-energized-fill; 93 | } 94 | &.spinner-royal .stop2 { 95 | stop-color: $spinner-royal-fill; 96 | } 97 | &.spinner-dark .stop2 { 98 | stop-color: $spinner-dark-fill; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_popup.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Popups 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .popup-container { 8 | position: absolute; 9 | top: 0; 10 | left: 0; 11 | bottom: 0; 12 | right: 0; 13 | background: rgba(0,0,0,0); 14 | 15 | @include display-flex(); 16 | @include justify-content(center); 17 | @include align-items(center); 18 | 19 | z-index: $z-index-popup; 20 | 21 | // Start hidden 22 | visibility: hidden; 23 | &.popup-showing { 24 | visibility: visible; 25 | } 26 | 27 | &.popup-hidden .popup { 28 | @include animation-name(scaleOut); 29 | @include animation-duration($popup-leave-animation-duration); 30 | @include animation-timing-function(ease-in-out); 31 | @include animation-fill-mode(both); 32 | } 33 | 34 | &.active .popup { 35 | @include animation-name(superScaleIn); 36 | @include animation-duration($popup-enter-animation-duration); 37 | @include animation-timing-function(ease-in-out); 38 | @include animation-fill-mode(both); 39 | } 40 | 41 | .popup { 42 | width: $popup-width; 43 | max-width: 100%; 44 | max-height: 90%; 45 | 46 | border-radius: $popup-border-radius; 47 | background-color: $popup-background-color; 48 | 49 | @include display-flex(); 50 | @include flex-direction(column); 51 | } 52 | 53 | input, 54 | textarea { 55 | width: 100%; 56 | } 57 | } 58 | 59 | .popup-head { 60 | padding: 15px 10px; 61 | border-bottom: 1px solid #eee; 62 | text-align: center; 63 | } 64 | .popup-title { 65 | margin: 0; 66 | padding: 0; 67 | font-size: 15px; 68 | } 69 | .popup-sub-title { 70 | margin: 5px 0 0 0; 71 | padding: 0; 72 | font-weight: normal; 73 | font-size: 11px; 74 | } 75 | .popup-body { 76 | padding: 10px; 77 | overflow: auto; 78 | } 79 | 80 | .popup-buttons { 81 | @include display-flex(); 82 | @include flex-direction(row); 83 | padding: 10px; 84 | min-height: $popup-button-min-height + 20; 85 | 86 | .button { 87 | @include flex(1); 88 | display: block; 89 | min-height: $popup-button-min-height; 90 | border-radius: $popup-button-border-radius; 91 | line-height: $popup-button-line-height; 92 | 93 | margin-right: 5px; 94 | &:last-child { 95 | margin-right: 0px; 96 | } 97 | } 98 | } 99 | 100 | .popup-open { 101 | pointer-events: none; 102 | 103 | &.modal-open .modal { 104 | pointer-events: none; 105 | } 106 | 107 | .popup-backdrop, .popup { 108 | pointer-events: auto; 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_modal.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Modals 4 | * -------------------------------------------------- 5 | * Modals are independent windows that slide in from off-screen. 6 | */ 7 | 8 | .modal-backdrop, 9 | .modal-backdrop-bg { 10 | position: fixed; 11 | top: 0; 12 | left: 0; 13 | z-index: $z-index-modal; 14 | width: 100%; 15 | height: 100%; 16 | } 17 | 18 | .modal-backdrop-bg { 19 | pointer-events: none; 20 | } 21 | 22 | .modal { 23 | display: block; 24 | position: absolute; 25 | top: 0; 26 | z-index: $z-index-modal; 27 | overflow: hidden; 28 | min-height: 100%; 29 | width: 100%; 30 | background-color: $modal-bg-color; 31 | } 32 | 33 | @media (min-width: $modal-inset-mode-break-point) { 34 | // inset mode is when the modal doesn't fill the entire 35 | // display but instead is centered within a large display 36 | .modal { 37 | top: $modal-inset-mode-top; 38 | right: $modal-inset-mode-right; 39 | bottom: $modal-inset-mode-bottom; 40 | left: $modal-inset-mode-left; 41 | min-height: $modal-inset-mode-min-height; 42 | width: (100% - $modal-inset-mode-left - $modal-inset-mode-right); 43 | } 44 | 45 | .modal.ng-leave-active { 46 | bottom: 0; 47 | } 48 | 49 | // remove ios header padding from inset header 50 | .platform-ios.platform-cordova .modal-wrapper .modal { 51 | .bar-header:not(.bar-subheader) { 52 | height: $bar-height; 53 | > * { 54 | margin-top: 0; 55 | } 56 | } 57 | .tabs-top > .tabs, 58 | .tabs.tabs-top { 59 | top: $bar-height; 60 | } 61 | .has-header, 62 | .bar-subheader { 63 | top: $bar-height; 64 | } 65 | .has-subheader { 66 | top: $bar-height + $bar-subheader-height; 67 | } 68 | .has-header.has-tabs-top { 69 | top: $bar-height + $tabs-height; 70 | } 71 | .has-header.has-subheader.has-tabs-top { 72 | top: $bar-height + $bar-subheader-height + $tabs-height; 73 | } 74 | } 75 | 76 | .modal-backdrop-bg { 77 | @include transition(opacity 300ms ease-in-out); 78 | background-color: $modal-backdrop-bg-active; 79 | opacity: 0; 80 | } 81 | 82 | .active .modal-backdrop-bg { 83 | opacity: 0.5; 84 | } 85 | } 86 | 87 | // disable clicks on all but the modal 88 | .modal-open { 89 | pointer-events: none; 90 | 91 | .modal, 92 | .modal-backdrop { 93 | pointer-events: auto; 94 | } 95 | // prevent clicks on modal when loading overlay is active though 96 | &.loading-active { 97 | .modal, 98 | .modal-backdrop { 99 | pointer-events: none; 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_list.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Lists 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .list { 8 | position: relative; 9 | padding-top: $item-border-width; 10 | padding-bottom: $item-border-width; 11 | padding-left: 0; // reset padding because ul and ol 12 | margin-bottom: 20px; 13 | } 14 | .list:last-child { 15 | margin-bottom: 0px; 16 | &.card{ 17 | margin-bottom:40px; 18 | } 19 | } 20 | 21 | 22 | /** 23 | * List Header 24 | * -------------------------------------------------- 25 | */ 26 | 27 | .list-header { 28 | margin-top: $list-header-margin-top; 29 | padding: $list-header-padding; 30 | background-color: $list-header-bg; 31 | color: $list-header-color; 32 | font-weight: bold; 33 | } 34 | 35 | // when its a card make sure it doesn't duplicate top and bottom borders 36 | .card.list .list-item { 37 | padding-right: 1px; 38 | padding-left: 1px; 39 | } 40 | 41 | 42 | /** 43 | * Cards and Inset Lists 44 | * -------------------------------------------------- 45 | * A card and list-inset are close to the same thing, except a card as a box shadow. 46 | */ 47 | 48 | .card, 49 | .list-inset { 50 | overflow: hidden; 51 | margin: ($content-padding * 2) $content-padding; 52 | border-radius: $card-border-radius; 53 | background-color: $card-body-bg; 54 | } 55 | 56 | .card { 57 | padding-top: $item-border-width; 58 | padding-bottom: $item-border-width; 59 | box-shadow: $card-box-shadow; 60 | 61 | .item { 62 | border-left: 0; 63 | border-right: 0; 64 | } 65 | .item:first-child { 66 | border-top: 0; 67 | } 68 | .item:last-child { 69 | border-bottom: 0; 70 | } 71 | } 72 | 73 | .padding { 74 | .card, .list-inset { 75 | margin-left: 0; 76 | margin-right: 0; 77 | } 78 | } 79 | 80 | .card .item, 81 | .list-inset .item, 82 | .padding > .list .item 83 | { 84 | &:first-child { 85 | border-top-left-radius: $card-border-radius; 86 | border-top-right-radius: $card-border-radius; 87 | 88 | .item-content { 89 | border-top-left-radius: $card-border-radius; 90 | border-top-right-radius: $card-border-radius; 91 | } 92 | } 93 | &:last-child { 94 | border-bottom-right-radius: $card-border-radius; 95 | border-bottom-left-radius: $card-border-radius; 96 | 97 | .item-content { 98 | border-bottom-right-radius: $card-border-radius; 99 | border-bottom-left-radius: $card-border-radius; 100 | } 101 | } 102 | } 103 | 104 | .card .item:last-child, 105 | .list-inset .item:last-child { 106 | margin-bottom: $item-border-width * -1; 107 | } 108 | 109 | .card .item, 110 | .list-inset .item, 111 | .padding > .list .item, 112 | .padding-horizontal > .list .item { 113 | margin-right: 0; 114 | margin-left: 0; 115 | 116 | &.item-input input { 117 | padding-right: 44px; 118 | } 119 | } 120 | .padding-left > .list .item { 121 | margin-left: 0; 122 | } 123 | .padding-right > .list .item { 124 | margin-right: 0; 125 | } 126 | -------------------------------------------------------------------------------- /hooks/after_prepare/010_add_platform_class.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Add Platform Class 4 | // v1.0 5 | // Automatically adds the platform class to the body tag 6 | // after the `prepare` command. By placing the platform CSS classes 7 | // directly in the HTML built for the platform, it speeds up 8 | // rendering the correct layout/style for the specific platform 9 | // instead of waiting for the JS to figure out the correct classes. 10 | 11 | var fs = require('fs'); 12 | var path = require('path'); 13 | 14 | var rootdir = process.argv[2]; 15 | 16 | function addPlatformBodyTag(indexPath, platform) { 17 | // add the platform class to the body tag 18 | try { 19 | var platformClass = 'platform-' + platform; 20 | var cordovaClass = 'platform-cordova platform-webview'; 21 | 22 | var html = fs.readFileSync(indexPath, 'utf8'); 23 | 24 | var bodyTag = findBodyTag(html); 25 | if(!bodyTag) return; // no opening body tag, something's wrong 26 | 27 | if(bodyTag.indexOf(platformClass) > -1) return; // already added 28 | 29 | var newBodyTag = bodyTag; 30 | 31 | var classAttr = findClassAttr(bodyTag); 32 | if(classAttr) { 33 | // body tag has existing class attribute, add the classname 34 | var endingQuote = classAttr.substring(classAttr.length-1); 35 | var newClassAttr = classAttr.substring(0, classAttr.length-1); 36 | newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote; 37 | newBodyTag = bodyTag.replace(classAttr, newClassAttr); 38 | 39 | } else { 40 | // add class attribute to the body tag 41 | newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">'); 42 | } 43 | 44 | html = html.replace(bodyTag, newBodyTag); 45 | 46 | fs.writeFileSync(indexPath, html, 'utf8'); 47 | 48 | process.stdout.write('add to body class: ' + platformClass + '\n'); 49 | } catch(e) { 50 | process.stdout.write(e); 51 | } 52 | } 53 | 54 | function findBodyTag(html) { 55 | // get the body tag 56 | try{ 57 | return html.match(/])(.*?)>/gi)[0]; 58 | }catch(e){} 59 | } 60 | 61 | function findClassAttr(bodyTag) { 62 | // get the body tag's class attribute 63 | try{ 64 | return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0]; 65 | }catch(e){} 66 | } 67 | 68 | if (rootdir) { 69 | 70 | // go through each of the platform directories that have been prepared 71 | var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []); 72 | 73 | for(var x=0; x .scroll{ 83 | &.overscroll{ 84 | position:fixed; 85 | right: 0; 86 | left: 0; 87 | } 88 | -webkit-overflow-scrolling:touch; 89 | width:100%; 90 | } 91 | 92 | .overflow-scroll.padding > .scroll.overscroll{ 93 | padding: 10px; 94 | } 95 | @-webkit-keyframes refresh-spin { 96 | 0% { -webkit-transform: translate3d(0,0,0) rotate(0); } 97 | 100% { -webkit-transform: translate3d(0,0,0) rotate(180deg); } 98 | } 99 | 100 | @keyframes refresh-spin { 101 | 0% { transform: translate3d(0,0,0) rotate(0); } 102 | 100% { transform: translate3d(0,0,0) rotate(180deg); } 103 | } 104 | 105 | @-webkit-keyframes refresh-spin-back { 106 | 0% { -webkit-transform: translate3d(0,0,0) rotate(180deg); } 107 | 100% { -webkit-transform: translate3d(0,0,0) rotate(0); } 108 | } 109 | 110 | @keyframes refresh-spin-back { 111 | 0% { transform: translate3d(0,0,0) rotate(180deg); } 112 | 100% { transform: translate3d(0,0,0) rotate(0); } 113 | } 114 | -------------------------------------------------------------------------------- /hooks/README.md: -------------------------------------------------------------------------------- 1 | 21 | # Cordova Hooks 22 | 23 | This directory may contain scripts used to customize cordova commands. This 24 | directory used to exist at `.cordova/hooks`, but has now been moved to the 25 | project root. Any scripts you add to these directories will be executed before 26 | and after the commands corresponding to the directory name. Useful for 27 | integrating your own build systems or integrating with version control systems. 28 | 29 | __Remember__: Make your scripts executable. 30 | 31 | ## Hook Directories 32 | The following subdirectories will be used for hooks: 33 | 34 | after_build/ 35 | after_compile/ 36 | after_docs/ 37 | after_emulate/ 38 | after_platform_add/ 39 | after_platform_rm/ 40 | after_platform_ls/ 41 | after_plugin_add/ 42 | after_plugin_ls/ 43 | after_plugin_rm/ 44 | after_plugin_search/ 45 | after_prepare/ 46 | after_run/ 47 | after_serve/ 48 | before_build/ 49 | before_compile/ 50 | before_docs/ 51 | before_emulate/ 52 | before_platform_add/ 53 | before_platform_rm/ 54 | before_platform_ls/ 55 | before_plugin_add/ 56 | before_plugin_ls/ 57 | before_plugin_rm/ 58 | before_plugin_search/ 59 | before_prepare/ 60 | before_run/ 61 | before_serve/ 62 | pre_package/ <-- Windows 8 and Windows Phone only. 63 | 64 | ## Script Interface 65 | 66 | All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: 67 | 68 | * CORDOVA_VERSION - The version of the Cordova-CLI. 69 | * CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). 70 | * CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) 71 | * CORDOVA_HOOK - Path to the hook that is being executed. 72 | * CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) 73 | 74 | If a script returns a non-zero exit code, then the parent cordova command will be aborted. 75 | 76 | 77 | ## Writing hooks 78 | 79 | We highly recommend writting your hooks using Node.js so that they are 80 | cross-platform. Some good examples are shown here: 81 | 82 | [http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) 83 | 84 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_select.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Select 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .item-select { 8 | position: relative; 9 | 10 | select { 11 | @include appearance(none); 12 | position: absolute; 13 | top: 0; 14 | bottom: 0; 15 | right: 0; 16 | padding: 0 ($item-padding * 3) 0 $item-padding; 17 | max-width: 65%; 18 | 19 | border: none; 20 | background: $item-default-bg; 21 | color: #333; 22 | 23 | // hack to hide default dropdown arrow in FF 24 | text-indent: .01px; 25 | text-overflow: ''; 26 | 27 | white-space: nowrap; 28 | font-size: $font-size-base; 29 | 30 | cursor: pointer; 31 | direction: rtl; // right align the select text 32 | } 33 | 34 | select::-ms-expand { 35 | // hide default dropdown arrow in IE 36 | display: none; 37 | } 38 | 39 | option { 40 | direction: ltr; 41 | } 42 | 43 | &:after { 44 | position: absolute; 45 | top: 50%; 46 | right: $item-padding; 47 | margin-top: -3px; 48 | width: 0; 49 | height: 0; 50 | border-top: 5px solid; 51 | border-right: 5px solid rgba(0, 0, 0, 0); 52 | border-left: 5px solid rgba(0, 0, 0, 0); 53 | color: #999; 54 | content: ""; 55 | pointer-events: none; 56 | } 57 | &.item-light { 58 | select{ 59 | background:$item-light-bg; 60 | color:$item-light-text; 61 | } 62 | } 63 | &.item-stable { 64 | select{ 65 | background:$item-stable-bg; 66 | color:$item-stable-text; 67 | } 68 | &:after, .input-label{ 69 | color:darken($item-stable-border,30%); 70 | } 71 | } 72 | &.item-positive { 73 | select{ 74 | background:$item-positive-bg; 75 | color:$item-positive-text; 76 | } 77 | &:after, .input-label{ 78 | color:$item-positive-text; 79 | } 80 | } 81 | &.item-calm { 82 | select{ 83 | background:$item-calm-bg; 84 | color:$item-calm-text; 85 | } 86 | &:after, .input-label{ 87 | color:$item-calm-text; 88 | } 89 | } 90 | &.item-assertive { 91 | select{ 92 | background:$item-assertive-bg; 93 | color:$item-assertive-text; 94 | } 95 | &:after, .input-label{ 96 | color:$item-assertive-text; 97 | } 98 | } 99 | &.item-balanced { 100 | select{ 101 | background:$item-balanced-bg; 102 | color:$item-balanced-text; 103 | } 104 | &:after, .input-label{ 105 | color:$item-balanced-text; 106 | } 107 | } 108 | &.item-energized { 109 | select{ 110 | background:$item-energized-bg; 111 | color:$item-energized-text; 112 | } 113 | &:after, .input-label{ 114 | color:$item-energized-text; 115 | } 116 | } 117 | &.item-royal { 118 | select{ 119 | background:$item-royal-bg; 120 | color:$item-royal-text; 121 | } 122 | &:after, .input-label{ 123 | color:$item-royal-text; 124 | } 125 | } 126 | &.item-dark { 127 | select{ 128 | background:$item-dark-bg; 129 | color:$item-dark-text; 130 | } 131 | &:after, .input-label{ 132 | color:$item-dark-text; 133 | } 134 | } 135 | } 136 | 137 | select { 138 | &[multiple], 139 | &[size] { 140 | height: auto; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | buildConfig = require('./build/config.js'), 3 | gutil = require('gulp-util'), 4 | concat = require('gulp-concat'), 5 | footer = require('gulp-footer'), 6 | header = require('gulp-header'), 7 | watch = require('gulp-watch'), 8 | browserify = require("browserify"), 9 | babelify = require("babelify"), 10 | fs = require("fs"), 11 | eslint = require('gulp-eslint'), 12 | replace = require('gulp-replace'), 13 | uglify = require('gulp-uglify'), 14 | rename = require('gulp-rename') 15 | del = require('del'); 16 | 17 | gulp.task('version', ['minify'], function() { 18 | return gulp.src('dist/*.js') 19 | .pipe(replace('VERSION_STRING', buildConfig.versionData.version)) 20 | .pipe(gulp.dest('dist')); 21 | }); 22 | 23 | gulp.task('minify', ['build-bundle'], function() { 24 | return gulp.src('dist/*.js') 25 | .pipe(uglify()) 26 | .pipe(rename(function (path) { 27 | path.basename += ".min"; 28 | })) 29 | .pipe(gulp.dest('dist')); 30 | }); 31 | 32 | gulp.task('build', ['version']); 33 | 34 | gulp.task('build-core-module', ['clean'], function () { 35 | var stream = null; 36 | browserify({ 37 | entries: buildConfig.sourceFiles.core, 38 | debug: false, 39 | transform: [babelify] 40 | }).bundle() 41 | .on("error", function (err) { console.log("Error : " + err.message); }) 42 | .pipe(steam = fs.createWriteStream(buildConfig.dist + "/core.js")); 43 | return stream; 44 | }); 45 | 46 | gulp.task('build-push-module', ['build-core-module'], function () { 47 | return browserify({ 48 | entries: buildConfig.sourceFiles.push, 49 | debug: false, 50 | transform: [babelify] 51 | }).bundle() 52 | .on("error", function (err) { console.log("Error : " + err.message); }) 53 | .pipe(fs.createWriteStream(buildConfig.dist + "/push.js")); 54 | }); 55 | 56 | gulp.task('build-deploy-module', ['build-push-module'], function () { 57 | return browserify({ 58 | entries: buildConfig.sourceFiles.deploy, 59 | debug: false, 60 | transform: [babelify] 61 | }).bundle() 62 | .on("error", function (err) { console.log("Error : " + err.message); }) 63 | .pipe(fs.createWriteStream(buildConfig.dist + "/deploy.js")); 64 | }); 65 | 66 | gulp.task('build-analytics-module', ['build-deploy-module'], function () { 67 | return browserify({ 68 | entries: buildConfig.sourceFiles.analytics, 69 | debug: false, 70 | transform: [babelify] 71 | }).bundle() 72 | .on("error", function (err) { console.log("Error : " + err.message); }) 73 | .pipe(fs.createWriteStream(buildConfig.dist + "/analytics.js")); 74 | }); 75 | 76 | gulp.task('test', function() { 77 | 78 | }); 79 | 80 | gulp.task('build-bundle', ['clean'], function () { 81 | return browserify({ 82 | entries: buildConfig.sourceFiles.bundle, 83 | debug: false, 84 | transform: [babelify] 85 | }).bundle() 86 | .on("error", function (err) { console.log("Error : " + err.message); }) 87 | .pipe(fs.createWriteStream(buildConfig.dist + "/ionic.io.bundle.js")); 88 | }); 89 | 90 | gulp.task('clean', ['lint'], function() { 91 | return del(['dist/**/*']); 92 | }); 93 | 94 | gulp.task('lint', function () { 95 | return gulp.src(['src/**/*.js']) 96 | .pipe(eslint()) 97 | .pipe(eslint.failOnError()) 98 | .pipe(eslint.formatEach()); 99 | }); 100 | 101 | gulp.task('watch', ['build'], function() { 102 | gulp.watch(['src/**/*.js'], ['build']); 103 | }); 104 | 105 | gulp.task('default', ['build']); 106 | -------------------------------------------------------------------------------- /www/lib/ionic/js/angular/angular-resource.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.4.3 3 | (c) 2010-2015 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var x=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}}; 7 | this.$get=["$http","$q",function(q,h){function u(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function w(y,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){v(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw x("badmember",e);for(var e=e.split("."),n=0,g=e.length;n .col { 25 | padding: 0; 26 | } 27 | } 28 | 29 | .row + .row { 30 | margin-top: ($grid-padding-width / 2) * -1; 31 | padding-top: 0; 32 | } 33 | 34 | .col { 35 | @include flex(1); 36 | display: block; 37 | padding: ($grid-padding-width / 2); 38 | width: 100%; 39 | } 40 | 41 | 42 | /* Vertically Align Columns */ 43 | /* .row-* vertically aligns every .col in the .row */ 44 | .row-top { 45 | @include align-items(flex-start); 46 | } 47 | .row-bottom { 48 | @include align-items(flex-end); 49 | } 50 | .row-center { 51 | @include align-items(center); 52 | } 53 | .row-stretch { 54 | @include align-items(stretch); 55 | } 56 | .row-baseline { 57 | @include align-items(baseline); 58 | } 59 | 60 | /* .col-* vertically aligns an individual .col */ 61 | .col-top { 62 | @include align-self(flex-start); 63 | } 64 | .col-bottom { 65 | @include align-self(flex-end); 66 | } 67 | .col-center { 68 | @include align-self(center); 69 | } 70 | 71 | /* Column Offsets */ 72 | .col-offset-10 { 73 | margin-left: 10%; 74 | } 75 | .col-offset-20 { 76 | margin-left: 20%; 77 | } 78 | .col-offset-25 { 79 | margin-left: 25%; 80 | } 81 | .col-offset-33, .col-offset-34 { 82 | margin-left: 33.3333%; 83 | } 84 | .col-offset-50 { 85 | margin-left: 50%; 86 | } 87 | .col-offset-66, .col-offset-67 { 88 | margin-left: 66.6666%; 89 | } 90 | .col-offset-75 { 91 | margin-left: 75%; 92 | } 93 | .col-offset-80 { 94 | margin-left: 80%; 95 | } 96 | .col-offset-90 { 97 | margin-left: 90%; 98 | } 99 | 100 | 101 | /* Explicit Column Percent Sizes */ 102 | /* By default each grid column will evenly distribute */ 103 | /* across the grid. However, you can specify individual */ 104 | /* columns to take up a certain size of the available area */ 105 | .col-10 { 106 | @include flex(0, 0, 10%); 107 | max-width: 10%; 108 | } 109 | .col-20 { 110 | @include flex(0, 0, 20%); 111 | max-width: 20%; 112 | } 113 | .col-25 { 114 | @include flex(0, 0, 25%); 115 | max-width: 25%; 116 | } 117 | .col-33, .col-34 { 118 | @include flex(0, 0, 33.3333%); 119 | max-width: 33.3333%; 120 | } 121 | .col-40 { 122 | @include flex(0, 0, 40%); 123 | max-width: 40%; 124 | } 125 | .col-50 { 126 | @include flex(0, 0, 50%); 127 | max-width: 50%; 128 | } 129 | .col-60 { 130 | @include flex(0, 0, 60%); 131 | max-width: 60%; 132 | } 133 | .col-66, .col-67 { 134 | @include flex(0, 0, 66.6666%); 135 | max-width: 66.6666%; 136 | } 137 | .col-75 { 138 | @include flex(0, 0, 75%); 139 | max-width: 75%; 140 | } 141 | .col-80 { 142 | @include flex(0, 0, 80%); 143 | max-width: 80%; 144 | } 145 | .col-90 { 146 | @include flex(0, 0, 90%); 147 | max-width: 90%; 148 | } 149 | 150 | 151 | /* Responsive Grid Classes */ 152 | /* Adding a class of responsive-X to a row */ 153 | /* will trigger the flex-direction to */ 154 | /* change to column and add some margin */ 155 | /* to any columns in the row for clearity */ 156 | 157 | @include responsive-grid-break('.responsive-sm', $grid-responsive-sm-break); 158 | @include responsive-grid-break('.responsive-md', $grid-responsive-md-break); 159 | @include responsive-grid-break('.responsive-lg', $grid-responsive-lg-break); 160 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_popover.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Popovers 4 | * -------------------------------------------------- 5 | * Popovers are independent views which float over content 6 | */ 7 | 8 | .popover-backdrop { 9 | position: fixed; 10 | top: 0; 11 | left: 0; 12 | z-index: $z-index-popover; 13 | width: 100%; 14 | height: 100%; 15 | background-color: $popover-backdrop-bg-inactive; 16 | 17 | &.active { 18 | background-color: $popover-backdrop-bg-active; 19 | } 20 | } 21 | 22 | .popover { 23 | position: absolute; 24 | top: 25%; 25 | left: 50%; 26 | z-index: $z-index-popover; 27 | display: block; 28 | margin-top: 12px; 29 | margin-left: -$popover-width / 2; 30 | height: $popover-height; 31 | width: $popover-width; 32 | background-color: $popover-bg-color; 33 | box-shadow: $popover-box-shadow; 34 | opacity: 0; 35 | 36 | .item:first-child { 37 | border-top: 0; 38 | } 39 | 40 | .item:last-child { 41 | border-bottom: 0; 42 | } 43 | 44 | &.popover-bottom { 45 | margin-top: -12px; 46 | } 47 | } 48 | 49 | 50 | // Set popover border-radius 51 | .popover, 52 | .popover .bar-header { 53 | border-radius: $popover-border-radius; 54 | } 55 | .popover .scroll-content { 56 | z-index: 1; 57 | margin: 2px 0; 58 | } 59 | .popover .bar-header { 60 | border-bottom-right-radius: 0; 61 | border-bottom-left-radius: 0; 62 | } 63 | .popover .has-header { 64 | border-top-right-radius: 0; 65 | border-top-left-radius: 0; 66 | } 67 | .popover-arrow { 68 | display: none; 69 | } 70 | 71 | 72 | // iOS Popover 73 | .platform-ios { 74 | 75 | .popover { 76 | box-shadow: $popover-box-shadow-ios; 77 | border-radius: $popover-border-radius-ios; 78 | } 79 | .popover .bar-header { 80 | @include border-top-radius($popover-border-radius-ios); 81 | } 82 | .popover .scroll-content { 83 | margin: 8px 0; 84 | border-radius: $popover-border-radius-ios; 85 | } 86 | .popover .scroll-content.has-header { 87 | margin-top: 0; 88 | } 89 | .popover-arrow { 90 | position: absolute; 91 | display: block; 92 | top: -17px; 93 | width: 30px; 94 | height: 19px; 95 | overflow: hidden; 96 | 97 | &:after { 98 | position: absolute; 99 | top: 12px; 100 | left: 5px; 101 | width: 20px; 102 | height: 20px; 103 | background-color: $popover-bg-color; 104 | border-radius: 3px; 105 | content: ''; 106 | @include rotate(-45deg); 107 | } 108 | } 109 | .popover-bottom .popover-arrow { 110 | top: auto; 111 | bottom: -10px; 112 | &:after { 113 | top: -6px; 114 | } 115 | } 116 | } 117 | 118 | 119 | // Android Popover 120 | .platform-android { 121 | 122 | .popover { 123 | margin-top: -32px; 124 | background-color: $popover-bg-color-android; 125 | box-shadow: $popover-box-shadow-android; 126 | 127 | .item { 128 | border-color: $popover-bg-color-android; 129 | background-color: $popover-bg-color-android; 130 | color: #4d4d4d; 131 | } 132 | &.popover-bottom { 133 | margin-top: 32px; 134 | } 135 | } 136 | 137 | .popover-backdrop, 138 | .popover-backdrop.active { 139 | background-color: transparent; 140 | } 141 | } 142 | 143 | 144 | // disable clicks on all but the popover 145 | .popover-open { 146 | pointer-events: none; 147 | 148 | .popover, 149 | .popover-backdrop { 150 | pointer-events: auto; 151 | } 152 | // prevent clicks on popover when loading overlay is active though 153 | &.loading-active { 154 | .popover, 155 | .popover-backdrop { 156 | pointer-events: none; 157 | } 158 | } 159 | } 160 | 161 | 162 | // wider popover on larger viewports 163 | @media (min-width: $popover-large-break-point) { 164 | .popover { 165 | width: $popover-large-width; 166 | margin-left: -$popover-large-width / 2; 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-platform-web-client", 3 | "version": "0.2.1", 4 | "description": "Ionic platform web client", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/driftyco/ionic-platform-web-client.git" 8 | }, 9 | "keywords": [ 10 | "Ionic", 11 | "ionic", 12 | "platform", 13 | "web", 14 | "client" 15 | ], 16 | "author": "Ionic", 17 | "contributors": [ 18 | "Eric Bobbitt ", 19 | "William Pelrine " 20 | ], 21 | "license": "Apache-2.0", 22 | "bugs": { 23 | "url": "https://github.com/driftyco/ionic-platform-web-client/issues" 24 | }, 25 | "eslintConfig": { 26 | "extends": "eslint:recommended", 27 | "globals": { 28 | "Ionic": true, 29 | "angular": true, 30 | "Connection": true, 31 | "PushNotification": true, 32 | "IonicDeploy": true 33 | }, 34 | "env": { 35 | "browser": true, 36 | "commonjs": true, 37 | "es6": true 38 | }, 39 | "ecmaFeatures": { 40 | "modules": true 41 | }, 42 | "rules": { 43 | "no-console": 0, 44 | "no-extra-semi": 2, 45 | "valid-jsdoc": [ 46 | 2, 47 | {} 48 | ], 49 | "curly": 2, 50 | "dot-notation": 2, 51 | "eqeqeq": 2, 52 | "no-eval": 2, 53 | "no-process-env": 2, 54 | "no-return-assign": 2, 55 | "no-script-url": 2, 56 | "no-self-compare": 2, 57 | "no-sequences": 2, 58 | "radix": 2, 59 | "wrap-iife": [ 60 | 2, 61 | "inside" 62 | ], 63 | "array-bracket-spacing": [ 64 | 2, 65 | "never" 66 | ], 67 | "block-spacing": [ 68 | 2, 69 | "always" 70 | ], 71 | "brace-style": [ 72 | 2, 73 | "1tbs", 74 | { 75 | "allowSingleLine": true 76 | } 77 | ], 78 | "indent": [ 79 | 2, 80 | 2, 81 | { 82 | "SwitchCase": 1 83 | } 84 | ], 85 | "comma-style": [ 86 | 2, 87 | "last" 88 | ], 89 | "camelcase": [ 90 | 2, 91 | { 92 | "properties": "always" 93 | } 94 | ], 95 | "key-spacing": [ 96 | 2, 97 | { 98 | "beforeColon": false, 99 | "afterColon": true 100 | } 101 | ], 102 | "func-style": [ 103 | 2, 104 | "declaration" 105 | ], 106 | "linebreak-style": [ 107 | 2, 108 | "unix" 109 | ], 110 | "new-cap": 2, 111 | "new-parens": 2, 112 | "no-mixed-spaces-and-tabs": 2, 113 | "no-trailing-spaces": 2, 114 | "no-spaced-func": 2, 115 | "object-curly-spacing": [ 116 | 2, 117 | "always" 118 | ], 119 | "quote-props": 2, 120 | "semi": [ 121 | 2, 122 | "always" 123 | ], 124 | "space-after-keywords": 2, 125 | "space-before-blocks": 2, 126 | "space-before-function-paren": [ 127 | 2, 128 | "never" 129 | ], 130 | "space-infix-ops": 2, 131 | "space-return-throw-case": 2, 132 | "space-unary-ops": 2, 133 | "spaced-comment": [ 134 | 2, 135 | "always" 136 | ] 137 | } 138 | }, 139 | "homepage": "https://github.com/driftyco/ionic-platform-web-client#readme", 140 | "devDependencies": { 141 | "babel": "^5.8.21", 142 | "babelify": "^6.2.0", 143 | "browser-request": "^0.3.3", 144 | "browserify": "^11.0.1", 145 | "del": "^2.0.2", 146 | "es6-promise": "^3.0.2", 147 | "gulp": "^3.9.0", 148 | "gulp-babel": "^5.2.0", 149 | "gulp-concat": "^2.2.0", 150 | "gulp-eslint": "^1.0.0", 151 | "gulp-footer": "^1.0.4", 152 | "gulp-header": "^1.0.2", 153 | "gulp-rename": "^1.2.2", 154 | "gulp-replace": "^0.5.4", 155 | "gulp-uglify": "^1.4.1", 156 | "gulp-util": "^2.2.16", 157 | "gulp-watch": "^0.6.5" 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/core/storage.js: -------------------------------------------------------------------------------- 1 | import { DeferredPromise } from "./promise"; 2 | 3 | class PlatformLocalStorageStrategy { 4 | constructor() { 5 | 6 | } 7 | 8 | get(key) { 9 | return window.localStorage.getItem(key); 10 | } 11 | 12 | remove(key) { 13 | return window.localStorage.removeItem(key); 14 | } 15 | 16 | set(key, value) { 17 | return window.localStorage.setItem(key, value); 18 | } 19 | } 20 | 21 | var objectCache = {}; 22 | var memoryLocks = {}; 23 | 24 | export class Storage { 25 | constructor() { 26 | this.strategy = new PlatformLocalStorageStrategy(); 27 | } 28 | 29 | /** 30 | * Stores an object in local storage under the given key 31 | * @param {string} key Name of the key to store values in 32 | * @param {object} object The object to store with the key 33 | * @return {void} 34 | */ 35 | storeObject(key, object) { 36 | // Convert object to JSON and store in localStorage 37 | var json = JSON.stringify(object); 38 | this.strategy.set(key, json); 39 | 40 | // Then store it in the object cache 41 | objectCache[key] = object; 42 | } 43 | 44 | deleteObject(key) { 45 | this.strategy.remove(key); 46 | delete objectCache[key]; 47 | } 48 | 49 | /** 50 | * Either retrieves the cached copy of an object, 51 | * or the object itself from localStorage. 52 | * @param {string} key The name of the key to pull from 53 | * @return {mixed} Returns the previously stored Object or null 54 | */ 55 | retrieveObject(key) { 56 | // First check to see if it's the object cache 57 | var cached = objectCache[key]; 58 | if (cached) { 59 | return cached; 60 | } 61 | 62 | // Deserialize the object from JSON 63 | var json = this.strategy.get(key); 64 | 65 | // null or undefined --> return null. 66 | if (json === null) { 67 | return null; 68 | } 69 | 70 | try { 71 | return JSON.parse(json); 72 | } catch (err) { 73 | return null; 74 | } 75 | } 76 | 77 | /** 78 | * Locks the async call represented by the given promise and lock key. 79 | * Only one asyncFunction given by the lockKey can be running at any time. 80 | * 81 | * @param {string} lockKey should be a string representing the name of this async call. 82 | * This is required for persistence. 83 | * @param {function} asyncFunction Returns a promise of the async call. 84 | * @returns {Promise} A new promise, identical to the one returned by asyncFunction, 85 | * but with two new errors: 'in_progress', and 'last_call_interrupted'. 86 | */ 87 | lockedAsyncCall(lockKey, asyncFunction) { 88 | 89 | var self = this; 90 | var deferred = new DeferredPromise(); 91 | 92 | // If the memory lock is set, error out. 93 | if (memoryLocks[lockKey]) { 94 | deferred.reject('in_progress'); 95 | return deferred.promise; 96 | } 97 | 98 | // If there is a stored lock but no memory lock, flag a persistence error 99 | if (this.strategy.get(lockKey) === 'locked') { 100 | deferred.reject('last_call_interrupted'); 101 | deferred.promise.then(null, function() { 102 | self.strategy.remove(lockKey); 103 | }); 104 | return deferred.promise; 105 | } 106 | 107 | // Set stored and memory locks 108 | memoryLocks[lockKey] = true; 109 | self.strategy.set(lockKey, 'locked'); 110 | 111 | // Perform the async operation 112 | asyncFunction().then(function(successData) { 113 | deferred.resolve(successData); 114 | 115 | // Remove stored and memory locks 116 | delete memoryLocks[lockKey]; 117 | self.strategy.remove(lockKey); 118 | }, function(errorData) { 119 | deferred.reject(errorData); 120 | 121 | // Remove stored and memory locks 122 | delete memoryLocks[lockKey]; 123 | self.strategy.remove(lockKey); 124 | }, function(notifyData) { 125 | deferred.notify(notifyData); 126 | }); 127 | 128 | return deferred.promise; 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | # Report an Issue 3 | 4 | Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure 5 | it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues) 6 | to see if someone's reported one similar to yours. 7 | 8 | If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code 9 | as possible: the more minimalist, the faster we can debug it). 10 | 11 | Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem, 12 | and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to 13 | that plunkr you created! 14 | 15 | **Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure 16 | is a bug, it's best to talk it out on 17 | [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This 18 | keeps development streamlined, and helps us focus on building great software. 19 | 20 | 21 | Issues only! | 22 | -------------| 23 | Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). | 24 | 25 | ####Purple Labels 26 | A purple label means that **you** need to take some further action. 27 | - ![Not Actionable - Need Info](http://angular-ui.github.io/ui-router/images/notactionable.png): Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue. 28 | - ![Plunkr Please](http://angular-ui.github.io/ui-router/images/plunkrplease.png): Please [create a plunkr](http://bit.ly/UIR-Plunk) 29 | - ![StackOverflow](http://angular-ui.github.io/ui-router/images/stackoverflow.png): We suspect your issue is really a help request, or could be answered by the community. Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router). If you determine that is an actual issue, please explain why. 30 | 31 | If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately. 32 | 33 | # Contribute 34 | 35 | **(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine. 36 | 37 | **(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed. 38 | 39 | **(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea. 40 | 41 | **(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules: 42 | 43 | - *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests 44 | - Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one 45 | - Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release. 46 | - Changes should always respect the coding style of the project 47 | 48 | 49 | 50 | # Developing 51 | 52 | UI-Router uses grunt >= 0.4.x. Make sure to upgrade your environment and read the 53 | [Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4). 54 | 55 | Dependencies for building from source and running tests: 56 | 57 | * [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli` 58 | * Then, install the development dependencies by running `$ npm install` from the project directory 59 | 60 | There are a number of targets in the gruntfile that are used to generating different builds: 61 | 62 | * `grunt`: Perform a normal build, runs jshint and karma tests 63 | * `grunt build`: Perform a normal build 64 | * `grunt dist`: Perform a clean build and generate documentation 65 | * `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes. 66 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_range.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Range 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .range input{ 8 | display: inline-block; 9 | overflow: hidden; 10 | margin-top: 5px; 11 | margin-bottom: 5px; 12 | padding-right: 2px; 13 | padding-left: 1px; 14 | width: auto; 15 | height: $range-slider-height + 15; 16 | outline: none; 17 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, $range-default-track-bg), color-stop(100%, $range-default-track-bg)); 18 | background: linear-gradient(to right, $range-default-track-bg 0%, $range-default-track-bg 100%); 19 | background-position: center; 20 | background-size: 99% $range-track-height; 21 | background-repeat: no-repeat; 22 | -webkit-appearance: none; 23 | 24 | &::-moz-focus-outer { 25 | /* hide the focus outline in Firefox */ 26 | border: 0; 27 | } 28 | 29 | &::-webkit-slider-thumb { 30 | position: relative; 31 | width: $range-slider-width; 32 | height: $range-slider-height; 33 | border-radius: $range-slider-border-radius; 34 | background-color: $toggle-handle-off-bg-color; 35 | box-shadow: $range-slider-box-shadow; 36 | cursor: pointer; 37 | -webkit-appearance: none; 38 | border: 0; 39 | } 40 | 41 | &::-webkit-slider-thumb:before{ 42 | /* what creates the colorful line on the left side of the slider */ 43 | position: absolute; 44 | top: ($range-slider-height / 2) - ($range-track-height / 2); 45 | left: -2001px; 46 | width: 2000px; 47 | height: $range-track-height; 48 | background: $dark; 49 | content: ' '; 50 | } 51 | 52 | &::-webkit-slider-thumb:after { 53 | /* create a larger (but hidden) hit area */ 54 | position: absolute; 55 | top: -15px; 56 | left: -15px; 57 | padding: 30px; 58 | content: ' '; 59 | //background: red; 60 | //opacity: .5; 61 | } 62 | &::-ms-fill-lower{ 63 | height: $range-track-height; 64 | background:$dark; 65 | } 66 | /* 67 | &::-ms-track{ 68 | background: transparent; 69 | border-color: transparent; 70 | border-width: 11px 0 16px; 71 | color:transparent; 72 | margin-top:20px; 73 | } 74 | &::-ms-thumb { 75 | width: $range-slider-width; 76 | height: $range-slider-height; 77 | border-radius: $range-slider-border-radius; 78 | background-color: $toggle-handle-off-bg-color; 79 | border-color:$toggle-handle-off-bg-color; 80 | box-shadow: $range-slider-box-shadow; 81 | margin-left:1px; 82 | margin-right:1px; 83 | outline:none; 84 | } 85 | &::-ms-fill-upper { 86 | height: $range-track-height; 87 | background:$range-default-track-bg; 88 | } 89 | */ 90 | } 91 | 92 | .range { 93 | @include display-flex(); 94 | @include align-items(center); 95 | padding: 2px 11px; 96 | 97 | &.range-light { 98 | input { @include range-style($range-light-track-bg); } 99 | } 100 | &.range-stable { 101 | input { @include range-style($range-stable-track-bg); } 102 | } 103 | &.range-positive { 104 | input { @include range-style($range-positive-track-bg); } 105 | } 106 | &.range-calm { 107 | input { @include range-style($range-calm-track-bg); } 108 | } 109 | &.range-balanced { 110 | input { @include range-style($range-balanced-track-bg); } 111 | } 112 | &.range-assertive { 113 | input { @include range-style($range-assertive-track-bg); } 114 | } 115 | &.range-energized { 116 | input { @include range-style($range-energized-track-bg); } 117 | } 118 | &.range-royal { 119 | input { @include range-style($range-royal-track-bg); } 120 | } 121 | &.range-dark { 122 | input { @include range-style($range-dark-track-bg); } 123 | } 124 | } 125 | 126 | .range .icon { 127 | @include flex(0); 128 | display: block; 129 | min-width: $range-icon-size; 130 | text-align: center; 131 | font-size: $range-icon-size; 132 | } 133 | 134 | .range input { 135 | @include flex(1); 136 | display: block; 137 | margin-right: 10px; 138 | margin-left: 10px; 139 | } 140 | 141 | .range-label { 142 | @include flex(0, 0, auto); 143 | display: block; 144 | white-space: nowrap; 145 | } 146 | 147 | .range-label:first-child { 148 | padding-left: 5px; 149 | } 150 | .range input + .range-label { 151 | padding-right: 5px; 152 | padding-left: 0; 153 | } 154 | 155 | // WP range height must be auto 156 | .platform-windowsphone{ 157 | .range input{ 158 | height:auto; 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /www/templates/tab-dash.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 |
8 |
9 |

no arrivals

10 |

11 | It could be outside of operating hours, or it could be 12 | broken. 13 | If this persists, you could try 14 | bugging Jake here. 15 |

16 |
17 |
18 |

{{error.statusText}}

19 |

Oops. Jake broke something.

20 |
21 | {{error.message}} 22 |
23 |

24 | Trying again shortly. 25 | 26 | Sometimes the MARTA realtime API does a 27 | broken. 28 | 29 | 30 | If this persists and you're doing a sad, you could try 31 | bugging Jake here. 32 | 33 |

34 |
35 | 36 |
37 | 38 | 39 |

Problems connecting. Trying again shortly.

40 |
41 | 42 | Starred 43 | 44 | 45 | 47 | 48 | 49 |
50 | 51 | {{arrival.direction}} 52 | 53 |
54 | {{stationName}} 55 |
56 | 57 | 58 | Nearby Stations 59 | 60 | 61 | 63 | 64 | 65 |
66 | 67 | {{arrival.direction}} 68 | 69 |
70 | {{stationName}} 71 |
72 |
  • 73 | All Stations 74 |
  • 75 | 76 | 78 | 79 | 80 |
    81 | 82 | {{arrival.direction}} 83 | 84 |
    85 | {{stationName}} 86 |
    87 |
    88 |
    89 |
    90 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/src/templateFactory.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @ngdoc object 3 | * @name ui.router.util.$templateFactory 4 | * 5 | * @requires $http 6 | * @requires $templateCache 7 | * @requires $injector 8 | * 9 | * @description 10 | * Service. Manages loading of templates. 11 | */ 12 | $TemplateFactory.$inject = ['$http', '$templateCache', '$injector']; 13 | function $TemplateFactory( $http, $templateCache, $injector) { 14 | 15 | /** 16 | * @ngdoc function 17 | * @name ui.router.util.$templateFactory#fromConfig 18 | * @methodOf ui.router.util.$templateFactory 19 | * 20 | * @description 21 | * Creates a template from a configuration object. 22 | * 23 | * @param {object} config Configuration object for which to load a template. 24 | * The following properties are search in the specified order, and the first one 25 | * that is defined is used to create the template: 26 | * 27 | * @param {string|object} config.template html string template or function to 28 | * load via {@link ui.router.util.$templateFactory#fromString fromString}. 29 | * @param {string|object} config.templateUrl url to load or a function returning 30 | * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}. 31 | * @param {Function} config.templateProvider function to invoke via 32 | * {@link ui.router.util.$templateFactory#fromProvider fromProvider}. 33 | * @param {object} params Parameters to pass to the template function. 34 | * @param {object} locals Locals to pass to `invoke` if the template is loaded 35 | * via a `templateProvider`. Defaults to `{ params: params }`. 36 | * 37 | * @return {string|object} The template html as a string, or a promise for 38 | * that string,or `null` if no template is configured. 39 | */ 40 | this.fromConfig = function (config, params, locals) { 41 | return ( 42 | isDefined(config.template) ? this.fromString(config.template, params) : 43 | isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) : 44 | isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) : 45 | null 46 | ); 47 | }; 48 | 49 | /** 50 | * @ngdoc function 51 | * @name ui.router.util.$templateFactory#fromString 52 | * @methodOf ui.router.util.$templateFactory 53 | * 54 | * @description 55 | * Creates a template from a string or a function returning a string. 56 | * 57 | * @param {string|object} template html template as a string or function that 58 | * returns an html template as a string. 59 | * @param {object} params Parameters to pass to the template function. 60 | * 61 | * @return {string|object} The template html as a string, or a promise for that 62 | * string. 63 | */ 64 | this.fromString = function (template, params) { 65 | return isFunction(template) ? template(params) : template; 66 | }; 67 | 68 | /** 69 | * @ngdoc function 70 | * @name ui.router.util.$templateFactory#fromUrl 71 | * @methodOf ui.router.util.$templateFactory 72 | * 73 | * @description 74 | * Loads a template from the a URL via `$http` and `$templateCache`. 75 | * 76 | * @param {string|Function} url url of the template to load, or a function 77 | * that returns a url. 78 | * @param {Object} params Parameters to pass to the url function. 79 | * @return {string|Promise.} The template html as a string, or a promise 80 | * for that string. 81 | */ 82 | this.fromUrl = function (url, params) { 83 | if (isFunction(url)) url = url(params); 84 | if (url == null) return null; 85 | else return $http 86 | .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }}) 87 | .then(function(response) { return response.data; }); 88 | }; 89 | 90 | /** 91 | * @ngdoc function 92 | * @name ui.router.util.$templateFactory#fromProvider 93 | * @methodOf ui.router.util.$templateFactory 94 | * 95 | * @description 96 | * Creates a template by invoking an injectable provider function. 97 | * 98 | * @param {Function} provider Function to invoke via `$injector.invoke` 99 | * @param {Object} params Parameters for the template. 100 | * @param {Object} locals Locals to pass to `invoke`. Defaults to 101 | * `{ params: params }`. 102 | * @return {string|Promise.} The template html as a string, or a promise 103 | * for that string. 104 | */ 105 | this.fromProvider = function (provider, params, locals) { 106 | return $injector.invoke(provider, null, locals || { params: params }); 107 | }; 108 | } 109 | 110 | angular.module('ui.router.util').service('$templateFactory', $TemplateFactory); 111 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_transitions.scss: -------------------------------------------------------------------------------- 1 | 2 | // iOS View Transitions 3 | // ------------------------------- 4 | 5 | $ios-transition-duration: 500ms !default; 6 | $ios-transition-timing-function: cubic-bezier(.36, .66, .04, 1) !default; 7 | $ios-transition-container-bg-color: #000 !default; 8 | 9 | 10 | [nav-view-transition="ios"] { 11 | 12 | [nav-view="entering"], 13 | [nav-view="leaving"] { 14 | @include transition-duration( $ios-transition-duration ); 15 | @include transition-timing-function( $ios-transition-timing-function ); 16 | -webkit-transition-property: opacity, -webkit-transform, box-shadow; 17 | transition-property: opacity, transform, box-shadow; 18 | } 19 | 20 | &[nav-view-direction="forward"], 21 | &[nav-view-direction="back"] { 22 | background-color: $ios-transition-container-bg-color; 23 | } 24 | 25 | [nav-view="active"], 26 | &[nav-view-direction="forward"] [nav-view="entering"], 27 | &[nav-view-direction="back"] [nav-view="leaving"] { 28 | z-index: $z-index-view-above; 29 | } 30 | 31 | &[nav-view-direction="back"] [nav-view="entering"], 32 | &[nav-view-direction="forward"] [nav-view="leaving"] { 33 | z-index: $z-index-view-below; 34 | } 35 | 36 | } 37 | 38 | 39 | 40 | // iOS Nav Bar Transitions 41 | // ------------------------------- 42 | 43 | [nav-bar-transition="ios"] { 44 | 45 | .title, 46 | .buttons, 47 | .back-text { 48 | @include transition-duration( $ios-transition-duration ); 49 | @include transition-timing-function( $ios-transition-timing-function ); 50 | -webkit-transition-property: opacity, -webkit-transform; 51 | transition-property: opacity, transform; 52 | } 53 | 54 | [nav-bar="active"], 55 | [nav-bar="entering"] { 56 | z-index: $z-index-bar-above; 57 | 58 | .bar { 59 | background: transparent; 60 | } 61 | } 62 | 63 | [nav-bar="cached"] { 64 | display: block; 65 | 66 | .header-item { 67 | display: none; 68 | } 69 | } 70 | 71 | } 72 | 73 | 74 | 75 | // Android View Transitions 76 | // ------------------------------- 77 | 78 | $android-transition-duration: 200ms !default; 79 | $android-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1) !default; 80 | 81 | 82 | [nav-view-transition="android"] { 83 | 84 | [nav-view="entering"], 85 | [nav-view="leaving"] { 86 | @include transition-duration( $android-transition-duration ); 87 | @include transition-timing-function( $android-transition-timing-function ); 88 | -webkit-transition-property: -webkit-transform; 89 | transition-property: transform; 90 | } 91 | 92 | [nav-view="active"], 93 | &[nav-view-direction="forward"] [nav-view="entering"], 94 | &[nav-view-direction="back"] [nav-view="leaving"] { 95 | z-index: $z-index-view-above; 96 | } 97 | 98 | &[nav-view-direction="back"] [nav-view="entering"], 99 | &[nav-view-direction="forward"] [nav-view="leaving"] { 100 | z-index: $z-index-view-below; 101 | } 102 | 103 | } 104 | 105 | 106 | 107 | // Android Nav Bar Transitions 108 | // ------------------------------- 109 | 110 | [nav-bar-transition="android"] { 111 | 112 | .title, 113 | .buttons { 114 | @include transition-duration( $android-transition-duration ); 115 | @include transition-timing-function( $android-transition-timing-function ); 116 | -webkit-transition-property: opacity; 117 | transition-property: opacity; 118 | } 119 | 120 | [nav-bar="active"], 121 | [nav-bar="entering"] { 122 | z-index: $z-index-bar-above; 123 | 124 | .bar { 125 | background: transparent; 126 | } 127 | } 128 | 129 | [nav-bar="cached"] { 130 | display: block; 131 | 132 | .header-item { 133 | display: none; 134 | } 135 | } 136 | 137 | } 138 | 139 | 140 | 141 | // Nav Swipe 142 | // ------------------------------- 143 | 144 | [nav-swipe="fast"] { 145 | [nav-view], 146 | .title, 147 | .buttons, 148 | .back-text { 149 | @include transition-duration(50ms); 150 | @include transition-timing-function(linear); 151 | } 152 | } 153 | 154 | [nav-swipe="slow"] { 155 | [nav-view], 156 | .title, 157 | .buttons, 158 | .back-text { 159 | @include transition-duration(160ms); 160 | @include transition-timing-function(linear); 161 | } 162 | } 163 | 164 | 165 | 166 | // Transition Settings 167 | // ------------------------------- 168 | 169 | [nav-view="cached"], 170 | [nav-bar="cached"] { 171 | display: none; 172 | } 173 | 174 | [nav-view="stage"] { 175 | opacity: 0; 176 | @include transition-duration( 0 ); 177 | } 178 | 179 | [nav-bar="stage"] { 180 | .title, 181 | .buttons, 182 | .back-text { 183 | position: absolute; 184 | opacity: 0; 185 | @include transition-duration(0s); 186 | } 187 | } 188 | 189 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/api/angular-ui-router.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for Angular JS 1.1.5+ (ui.router module) 2 | // Project: https://github.com/angular-ui/ui-router 3 | // Definitions by: Michel Salib 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | declare module ng.ui { 7 | 8 | interface IState { 9 | name?: string; 10 | template?: string; 11 | templateUrl?: any; // string || () => string 12 | templateProvider?: any; // () => string || IPromise 13 | controller?: any; 14 | controllerAs?: string; 15 | controllerProvider?: any; 16 | resolve?: {}; 17 | url?: string; 18 | params?: any; 19 | views?: {}; 20 | abstract?: boolean; 21 | onEnter?: (...args: any[]) => void; 22 | onExit?: (...args: any[]) => void; 23 | data?: any; 24 | reloadOnSearch?: boolean; 25 | } 26 | 27 | interface ITypedState extends IState { 28 | data?: T; 29 | } 30 | 31 | interface IStateProvider extends IServiceProvider { 32 | state(name: string, config: IState): IStateProvider; 33 | state(config: IState): IStateProvider; 34 | decorator(name?: string, decorator?: (state: IState, parent: Function) => any): any; 35 | } 36 | 37 | interface IUrlMatcher { 38 | concat(pattern: string): IUrlMatcher; 39 | exec(path: string, searchParams: {}): {}; 40 | parameters(): string[]; 41 | format(values: {}): string; 42 | } 43 | 44 | interface IUrlMatcherFactory { 45 | compile(pattern: string): IUrlMatcher; 46 | isMatcher(o: any): boolean; 47 | } 48 | 49 | interface IUrlRouterProvider extends IServiceProvider { 50 | when(whenPath: RegExp, handler: Function): IUrlRouterProvider; 51 | when(whenPath: RegExp, handler: any[]): IUrlRouterProvider; 52 | when(whenPath: RegExp, toPath: string): IUrlRouterProvider; 53 | when(whenPath: IUrlMatcher, hanlder: Function): IUrlRouterProvider; 54 | when(whenPath: IUrlMatcher, handler: any[]): IUrlRouterProvider; 55 | when(whenPath: IUrlMatcher, toPath: string): IUrlRouterProvider; 56 | when(whenPath: string, handler: Function): IUrlRouterProvider; 57 | when(whenPath: string, handler: any[]): IUrlRouterProvider; 58 | when(whenPath: string, toPath: string): IUrlRouterProvider; 59 | otherwise(handler: Function): IUrlRouterProvider; 60 | otherwise(handler: any[]): IUrlRouterProvider; 61 | otherwise(path: string): IUrlRouterProvider; 62 | rule(handler: Function): IUrlRouterProvider; 63 | rule(handler: any[]): IUrlRouterProvider; 64 | } 65 | 66 | interface IStateOptions { 67 | location?: any; 68 | inherit?: boolean; 69 | relative?: IState; 70 | notify?: boolean; 71 | reload?: boolean; 72 | } 73 | 74 | interface IHrefOptions { 75 | lossy?: boolean; 76 | inherit?: boolean; 77 | relative?: IState; 78 | absolute?: boolean; 79 | } 80 | 81 | interface IStateService { 82 | go(to: string, params?: {}, options?: IStateOptions): IPromise; 83 | transitionTo(state: string, params?: {}, updateLocation?: boolean): void; 84 | transitionTo(state: string, params?: {}, options?: IStateOptions): void; 85 | includes(state: string, params?: {}): boolean; 86 | is(state:string, params?: {}): boolean; 87 | is(state: IState, params?: {}): boolean; 88 | href(state: IState, params?: {}, options?: IHrefOptions): string; 89 | href(state: string, params?: {}, options?: IHrefOptions): string; 90 | get(state: string): IState; 91 | get(): IState[]; 92 | current: IState; 93 | params: any; 94 | reload(): void; 95 | } 96 | 97 | interface IStateParamsService { 98 | [key: string]: any; 99 | } 100 | 101 | interface IStateParams { 102 | [key: string]: any; 103 | } 104 | 105 | interface IUrlRouterService { 106 | /* 107 | * Triggers an update; the same update that happens when the address bar 108 | * url changes, aka $locationChangeSuccess. 109 | * 110 | * This method is useful when you need to use preventDefault() on the 111 | * $locationChangeSuccess event, perform some custom logic (route protection, 112 | * auth, config, redirection, etc) and then finally proceed with the transition 113 | * by calling $urlRouter.sync(). 114 | * 115 | */ 116 | sync(): void; 117 | } 118 | 119 | interface IUiViewScrollProvider { 120 | /* 121 | * Reverts back to using the core $anchorScroll service for scrolling 122 | * based on the url anchor. 123 | */ 124 | useAnchorScroll(): void; 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | marta.io 4 | 5 | MARTA realtime API results 6 | 7 | 8 | Jake Swanson 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /www/lib/ionic-platform-web-client/src/push/push-dev.js: -------------------------------------------------------------------------------- 1 | import { APIRequest } from "../core/request"; 2 | import { Settings } from "../core/settings"; 3 | import { Logger } from "../core/logger"; 4 | import { PushToken } from "./push-token"; 5 | 6 | var settings = new Settings(); 7 | 8 | /** 9 | * PushDev Service 10 | * 11 | * This service acts as a mock push service that is intended to be used pre-setup of 12 | * GCM/APNS in an Ionic.io project. 13 | * 14 | * How it works: 15 | * 16 | * When register() is called, this service is used to generate a random 17 | * development device token. This token is not valid for any service outside of 18 | * Ionic Push with `dev_push` set to true. These tokens do not last long and are not 19 | * eligible for use in a production app. 20 | * 21 | * The device will then periodically check the Push service for push notifications sent 22 | * to our development token -- so unlike a typical "push" update, this actually uses 23 | * "polling" to find new notifications. This means you *MUST* have the application open 24 | * and in the foreground to retreive messsages. 25 | * 26 | * The callbacks provided in your init() will still be triggered as normal, 27 | * but with these notable exceptions: 28 | * 29 | * - There is no payload data available with messages 30 | * - An alert() is called when a notification is received unlesss you return false 31 | * in your 'onNotification' callback. 32 | * 33 | */ 34 | export class PushDevService { 35 | constructor() { 36 | this.logger = new Logger({ 37 | 'prefix': 'Ionic Push (dev):' 38 | }); 39 | this._serviceHost = settings.getURL('push'); 40 | this._token = false; 41 | this._watch = false; 42 | } 43 | 44 | /** 45 | * Generate a development token 46 | * 47 | * @return {String} development device token 48 | */ 49 | getDevToken() { 50 | // Some crazy bit-twiddling to generate a random guid 51 | var token = 'DEV-xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 52 | var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); 53 | return v.toString(16); 54 | }); 55 | this._token = token; 56 | return this._token; 57 | } 58 | 59 | 60 | /** 61 | * Registers a development token with the Ionic Push service 62 | * 63 | * @param {IonicPushService} ionicPush Instantiated Push Service 64 | * @param {function} callback Registration Callback 65 | * @return {void} 66 | */ 67 | init(ionicPush, callback) { 68 | this._push = ionicPush; 69 | this._emitter = this._push._emitter; 70 | var token = this._token; 71 | var self = this; 72 | if (!token) { 73 | token = this.getDevToken(); 74 | } 75 | 76 | var requestOptions = { 77 | "method": 'POST', 78 | "uri": this._serviceHost + '/dev/push', 79 | 'headers': { 80 | 'Accept': 'application/json', 81 | 'Content-Type': 'application/json' 82 | }, 83 | "body": JSON.stringify({ 84 | "dev_token": token 85 | }) 86 | }; 87 | 88 | new APIRequest(requestOptions).then(function() { 89 | var data = { "registrationId": token }; 90 | self.logger.info('registered with development push service', token); 91 | self._emitter.emit("ionic_push:token", data); 92 | if ((typeof callback === 'function')) { 93 | callback(new PushToken(self._token)); 94 | } 95 | self.watch(); 96 | }, function(error) { 97 | self.logger.error("error connecting development push service.", error); 98 | }); 99 | } 100 | 101 | /** 102 | * Checks the push service for notifications that target the current development token 103 | * @return {void} 104 | */ 105 | checkForNotifications() { 106 | if (!this._token) { 107 | return false; 108 | } 109 | 110 | var self = this; 111 | var requestOptions = { 112 | 'method': 'GET', 113 | 'uri': this._serviceHost + '/dev/push/check', 114 | 'headers': { 115 | 'Accept': 'application/json', 116 | 'Content-Type': 'application/json', 117 | 'X-Ionic-Dev-Token': this._token 118 | }, 119 | 'json': true 120 | }; 121 | 122 | new APIRequest(requestOptions).then(function(result) { 123 | if (result.payload.messages.length > 0) { 124 | var message = { 125 | 'message': result.payload.messages[0], 126 | 'title': 'DEVELOPMENT PUSH' 127 | }; 128 | 129 | self.logger.warn("Ionic Push: Development Push received. Development pushes will not contain payload data."); 130 | self._emitter.emit("ionic_push:notification", message); 131 | } 132 | }, function(error) { 133 | self.logger.error("unable to check for development pushes.", error); 134 | }); 135 | } 136 | 137 | /** 138 | * Kicks off the "polling" of the Ionic Push service for new push notifications 139 | * @return {void} 140 | */ 141 | watch() { 142 | // Check for new dev pushes every 5 seconds 143 | this.logger.info('watching for new notifications'); 144 | var self = this; 145 | if (!this._watch) { 146 | this._watch = setInterval(function() { self.checkForNotifications(); }, 5000); 147 | } 148 | } 149 | 150 | /** 151 | * Puts the "polling" for new notifications on hold. 152 | * @return {void} 153 | */ 154 | halt() { 155 | if (this._watch) { 156 | clearInterval(this._watch); 157 | } 158 | } 159 | 160 | } 161 | -------------------------------------------------------------------------------- /www/js/controllers.js: -------------------------------------------------------------------------------- 1 | angular.module('starter.controllers', []) 2 | .controller('DashCtrl', function($scope, $state, Arrivals, MioFavs, $ionicPlatform, MioLocation, $ionicListDelegate) { 3 | var savedPositionString = localStorage.getItem('position2'); 4 | if (savedPositionString) { 5 | $scope.savedPosition = JSON.parse(savedPositionString); 6 | } 7 | // not needed i hope 8 | //$scope.arrivals = Arrivals.latestByStation(); 9 | //$scope.favs = MioFavs.intersection($scope.arrivals); 10 | $scope.loading = true; 11 | Arrivals.subscribe('arrivalsChanged', $scope); 12 | Arrivals.subscribe('apiError', $scope); 13 | $scope.$on('arrivalsChanged', function(event, rawArrivals, error) { 14 | $scope.error = null; 15 | $scope.connectionProblem = false; 16 | $scope.arrivals = Arrivals.latestByStation(); 17 | $scope.favs = MioFavs.intersection($scope.arrivals); 18 | $scope.emptyResponse = rawArrivals.length == 0; 19 | $scope.loading = false; 20 | if ($scope.savedPosition) { 21 | $scope.nearbyStations = Arrivals.closestTo($scope.savedPosition, $scope.arrivals); 22 | } 23 | }); 24 | $scope.$on('apiError', function(event, resp) { 25 | if (resp.status == 0) { 26 | $scope.connectionProblem = new Date(); 27 | } else { 28 | // HAPI sets these in the event of an error 29 | // (but MARTA doesn't give us feedback, so usually useless) 30 | $scope.error = { 31 | status: resp.status, 32 | statusText: resp.statusText, 33 | message: resp.data.message 34 | }; 35 | $scope.connectionProblem = false; 36 | } 37 | $scope.loading = false; 38 | $scope.emptyResponse = false; 39 | }); 40 | 41 | $scope.refreshArrivals = function() { 42 | Arrivals.refresh().finally(function() { 43 | $scope.$broadcast('scroll.refreshComplete'); 44 | }); 45 | }; 46 | 47 | var updateLocation = function() { 48 | $scope.geowait = true; 49 | MioLocation.locate().then(function(coords) { 50 | $scope.savedPosition = coords; 51 | $scope.nearbyStations = Arrivals.closestTo($scope.savedPosition, $scope.arrivals); 52 | $scope.geowait = false; 53 | }); 54 | }; 55 | updateLocation(); 56 | $ionicPlatform.ready(function() { 57 | $ionicPlatform.on('resume', updateLocation); 58 | }); 59 | 60 | $scope.stationView = function(stationName) { 61 | $state.go("station", {stationName: stationName}); 62 | }; 63 | 64 | var dirOrder = ['n', 's', 'w', 'e']; 65 | $scope.byDirection = function(obj) { 66 | if (!obj) { 67 | return null; 68 | } 69 | var res = {}; 70 | for (var i = 0; i < dirOrder.length; i++) { 71 | if (obj[dirOrder[i]]) { 72 | res[dirOrder[i]] = obj[dirOrder[i]]; 73 | } 74 | } 75 | return res; 76 | }; 77 | 78 | $scope.timeboxClass = function(arrival) { 79 | var ret = { 80 | scheduled: arrival.scheduled 81 | }; 82 | ret[arrival.line + '-line'] = true; 83 | return ret; 84 | }; 85 | 86 | $scope.isFavorite = function(stationName) { 87 | return MioFavs.all().indexOf(stationName) > -1; 88 | }; 89 | $scope.toggleFavorite = function(stationName) { 90 | MioFavs.toggle(stationName); 91 | $ionicListDelegate.closeOptionButtons(); 92 | $scope.favs = MioFavs.intersection($scope.arrivals); 93 | }; 94 | 95 | 96 | $scope.timeDisplay = function(arrival) { 97 | var text = arrival.waiting_time; 98 | if (['arriving', 'arrived'].indexOf(text) >= 0) { 99 | return ""; 100 | } else if (text == 'boarding') { 101 | return ""; 102 | } 103 | 104 | // waiting_time should start with a number, and parse to int 105 | return ":" + (parseInt(arrival.waiting_time) || 0); 106 | }; 107 | }) 108 | 109 | .controller('StationCtrl', function($scope, $state, Arrivals) { 110 | var stationName = $state.params.stationName + " station"; 111 | $scope.stationName = stationName; 112 | 113 | $scope.arrivals = Arrivals.by('station', stationName); 114 | Arrivals.subscribe('arrivalsChanged', $scope); 115 | $scope.$on('arrivalsChanged', function() { 116 | $scope.arrivals = Arrivals.by('station', stationName); 117 | }); 118 | 119 | $scope.arrivalClass = function(arrival) { 120 | var ret = { 121 | scheduled: arrival.scheduled 122 | }; 123 | ret[arrival.line + '-line'] = true; 124 | return ret; 125 | }; 126 | 127 | $scope.trainView = function(trainId) { 128 | if (!trainId) return; 129 | $state.go("train", {trainId: trainId}); 130 | }; 131 | 132 | $scope.refreshArrivals = function() { 133 | Arrivals.refresh().finally(function() { 134 | $scope.$broadcast('scroll.refreshComplete'); 135 | }); 136 | }; 137 | 138 | }) 139 | 140 | .controller('TrainCtrl', function($scope, $state, Arrivals) { 141 | var trainId = $scope.trainId = $state.params.trainId; 142 | $scope.arrivals = Arrivals.by('train_id', trainId); 143 | Arrivals.subscribe('arrivalsChanged', $scope); 144 | $scope.$on('arrivalsChanged', function() { 145 | $scope.arrivals = Arrivals.by('train_id', trainId); 146 | }); 147 | $scope.arrivalClass = function(arrival) { 148 | var ret = { 149 | scheduled: arrival.scheduled 150 | }; 151 | ret[arrival.line + '-line'] = true; 152 | return ret; 153 | }; 154 | 155 | $scope.refreshArrivals = function() { 156 | Arrivals.refresh().finally(function() { 157 | $scope.$broadcast('scroll.refreshComplete'); 158 | }); 159 | }; 160 | 161 | }); 162 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_checkbox.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Checkbox 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .checkbox { 8 | // set the color defaults 9 | @include checkbox-style($checkbox-off-border-default, $checkbox-on-bg-default, $checkbox-on-border-default); 10 | 11 | position: relative; 12 | display: inline-block; 13 | padding: ($checkbox-height / 4) ($checkbox-width / 4); 14 | cursor: pointer; 15 | } 16 | .checkbox-light { 17 | @include checkbox-style($checkbox-off-border-light, $checkbox-on-bg-light, $checkbox-off-border-light); 18 | } 19 | .checkbox-stable { 20 | @include checkbox-style($checkbox-off-border-stable, $checkbox-on-bg-stable, $checkbox-off-border-stable); 21 | } 22 | .checkbox-positive { 23 | @include checkbox-style($checkbox-off-border-positive, $checkbox-on-bg-positive, $checkbox-off-border-positive); 24 | } 25 | .checkbox-calm { 26 | @include checkbox-style($checkbox-off-border-calm, $checkbox-on-bg-calm, $checkbox-off-border-calm); 27 | } 28 | .checkbox-assertive { 29 | @include checkbox-style($checkbox-off-border-assertive, $checkbox-on-bg-assertive, $checkbox-off-border-assertive); 30 | } 31 | .checkbox-balanced { 32 | @include checkbox-style($checkbox-off-border-balanced, $checkbox-on-bg-balanced, $checkbox-off-border-balanced); 33 | } 34 | .checkbox-energized{ 35 | @include checkbox-style($checkbox-off-border-energized, $checkbox-on-bg-energized, $checkbox-off-border-energized); 36 | } 37 | .checkbox-royal { 38 | @include checkbox-style($checkbox-off-border-royal, $checkbox-on-bg-royal, $checkbox-off-border-royal); 39 | } 40 | .checkbox-dark { 41 | @include checkbox-style($checkbox-off-border-dark, $checkbox-on-bg-dark, $checkbox-off-border-dark); 42 | } 43 | 44 | .checkbox input:disabled:before, 45 | .checkbox input:disabled + .checkbox-icon:before { 46 | border-color: $checkbox-off-border-light; 47 | } 48 | 49 | .checkbox input:disabled:checked:before, 50 | .checkbox input:disabled:checked + .checkbox-icon:before { 51 | background: $checkbox-on-bg-light; 52 | } 53 | 54 | 55 | .checkbox.checkbox-input-hidden input { 56 | display: none !important; 57 | } 58 | 59 | .checkbox input, 60 | .checkbox-icon { 61 | position: relative; 62 | width: $checkbox-width; 63 | height: $checkbox-height; 64 | display: block; 65 | border: 0; 66 | background: transparent; 67 | cursor: pointer; 68 | -webkit-appearance: none; 69 | 70 | &:before { 71 | // what the checkbox looks like when its not checked 72 | display: table; 73 | width: 100%; 74 | height: 100%; 75 | border-width: $checkbox-border-width; 76 | border-style: solid; 77 | border-radius: $checkbox-border-radius; 78 | background: $checkbox-off-bg-color; 79 | content: ' '; 80 | @include transition(background-color 20ms ease-in-out); 81 | } 82 | } 83 | 84 | .checkbox input:checked:before, 85 | input:checked + .checkbox-icon:before { 86 | border-width: $checkbox-border-width + 1; 87 | } 88 | 89 | // the checkmark within the box 90 | .checkbox input:after, 91 | .checkbox-icon:after { 92 | @include transition(opacity .05s ease-in-out); 93 | @include rotate(-45deg); 94 | position: absolute; 95 | top: 33%; 96 | left: 25%; 97 | display: table; 98 | width: ($checkbox-width / 2); 99 | height: ($checkbox-width / 4) - 1; 100 | border: $checkbox-check-width solid $checkbox-check-color; 101 | border-top: 0; 102 | border-right: 0; 103 | content: ' '; 104 | opacity: 0; 105 | } 106 | 107 | .platform-android .checkbox-platform input:before, 108 | .platform-android .checkbox-platform .checkbox-icon:before, 109 | .checkbox-square input:before, 110 | .checkbox-square .checkbox-icon:before { 111 | border-radius: 2px; 112 | width: 72%; 113 | height: 72%; 114 | margin-top: 14%; 115 | margin-left: 14%; 116 | border-width: 2px; 117 | } 118 | 119 | .platform-android .checkbox-platform input:after, 120 | .platform-android .checkbox-platform .checkbox-icon:after, 121 | .checkbox-square input:after, 122 | .checkbox-square .checkbox-icon:after { 123 | border-width: 2px; 124 | top: 19%; 125 | left: 25%; 126 | width: ($checkbox-width / 2) - 1; 127 | height: 7px; 128 | } 129 | 130 | .platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after { 131 | top: 31%; 132 | } 133 | 134 | .grade-c .checkbox input:after, 135 | .grade-c .checkbox-icon:after { 136 | @include rotate(0); 137 | top: 3px; 138 | left: 4px; 139 | border: none; 140 | color: $checkbox-check-color; 141 | content: '\2713'; 142 | font-weight: bold; 143 | font-size: 20px; 144 | } 145 | 146 | // what the checkmark looks like when its checked 147 | .checkbox input:checked:after, 148 | input:checked + .checkbox-icon:after { 149 | opacity: 1; 150 | } 151 | 152 | // make sure item content have enough padding on left to fit the checkbox 153 | .item-checkbox { 154 | padding-left: ($item-padding * 2) + $checkbox-width; 155 | 156 | &.active { 157 | box-shadow: none; 158 | } 159 | } 160 | 161 | // position the checkbox to the left within an item 162 | .item-checkbox .checkbox { 163 | position: absolute; 164 | top: 50%; 165 | right: $item-padding / 2; 166 | left: $item-padding / 2; 167 | z-index: $z-index-item-checkbox; 168 | margin-top: (($checkbox-height + ($checkbox-height / 2)) / 2) * -1; 169 | } 170 | 171 | 172 | .item-checkbox.item-checkbox-right { 173 | padding-right: ($item-padding * 2) + $checkbox-width; 174 | padding-left: $item-padding; 175 | } 176 | 177 | .item-checkbox-right .checkbox input, 178 | .item-checkbox-right .checkbox-icon { 179 | float: right; 180 | } 181 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/angular-sanitize.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.4.3 3 | (c) 2010-2015 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join("")}function g(a,f){var d={},c=a.split(","),b;for(b=0;b=c;d--)f.end&&f.end(e[d]);e.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l="";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");f.chars&&f.chars(q(b));return""}),c("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e", 8 | b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML= 9 | a.replace(//g,">")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g="img"===a&&"src"===k|| 10 | "background"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(" "),c(e),c('="'),c(B(d)),c('"'))}),c(e?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i, 11 | I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a, 15 | c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); 16 | //# sourceMappingURL=angular-sanitize.min.js.map 17 | -------------------------------------------------------------------------------- /www/lib/ionic/js/angular/angular-sanitize.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.4.3 3 | (c) 2010-2015 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join("")}function g(a,f){var d={},c=a.split(","),b;for(b=0;b=c;d--)f.end&&f.end(e[d]);e.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l="";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");f.chars&&f.chars(q(b));return""}),c("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e", 8 | b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML= 9 | a.replace(//g,">")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g="img"===a&&"src"===k|| 10 | "background"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(" "),c(e),c('="'),c(B(d)),c('"'))}),c(e?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i, 11 | I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a, 15 | c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); 16 | //# sourceMappingURL=angular-sanitize.min.js.map 17 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_toggle.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Toggle 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .item-toggle { 8 | pointer-events: none; 9 | } 10 | 11 | .toggle { 12 | // set the color defaults 13 | @include toggle-style($toggle-on-default-border, $toggle-on-default-bg); 14 | 15 | position: relative; 16 | display: inline-block; 17 | pointer-events: auto; 18 | margin: -$toggle-hit-area-expansion; 19 | padding: $toggle-hit-area-expansion; 20 | 21 | &.dragging { 22 | .handle { 23 | background-color: $toggle-handle-dragging-bg-color !important; 24 | } 25 | } 26 | 27 | } 28 | 29 | .toggle { 30 | &.toggle-light { 31 | @include toggle-style($toggle-on-light-border, $toggle-on-light-bg); 32 | } 33 | &.toggle-stable { 34 | @include toggle-style($toggle-on-stable-border, $toggle-on-stable-bg); 35 | } 36 | &.toggle-positive { 37 | @include toggle-style($toggle-on-positive-border, $toggle-on-positive-bg); 38 | } 39 | &.toggle-calm { 40 | @include toggle-style($toggle-on-calm-border, $toggle-on-calm-bg); 41 | } 42 | &.toggle-assertive { 43 | @include toggle-style($toggle-on-assertive-border, $toggle-on-assertive-bg); 44 | } 45 | &.toggle-balanced { 46 | @include toggle-style($toggle-on-balanced-border, $toggle-on-balanced-bg); 47 | } 48 | &.toggle-energized { 49 | @include toggle-style($toggle-on-energized-border, $toggle-on-energized-bg); 50 | } 51 | &.toggle-royal { 52 | @include toggle-style($toggle-on-royal-border, $toggle-on-royal-bg); 53 | } 54 | &.toggle-dark { 55 | @include toggle-style($toggle-on-dark-border, $toggle-on-dark-bg); 56 | } 57 | } 58 | 59 | .toggle input { 60 | // hide the actual input checkbox 61 | display: none; 62 | } 63 | 64 | /* the track appearance when the toggle is "off" */ 65 | .toggle .track { 66 | @include transition-timing-function(ease-in-out); 67 | @include transition-duration($toggle-transition-duration); 68 | @include transition-property((background-color, border)); 69 | 70 | display: inline-block; 71 | box-sizing: border-box; 72 | width: $toggle-width; 73 | height: $toggle-height; 74 | border: solid $toggle-border-width $toggle-off-border-color; 75 | border-radius: $toggle-border-radius; 76 | background-color: $toggle-off-bg-color; 77 | content: ' '; 78 | cursor: pointer; 79 | pointer-events: none; 80 | } 81 | 82 | /* Fix to avoid background color bleeding */ 83 | /* (occured on (at least) Android 4.2, Asus MeMO Pad HD7 ME173X) */ 84 | .platform-android4_2 .toggle .track { 85 | -webkit-background-clip: padding-box; 86 | } 87 | 88 | /* the handle (circle) thats inside the toggle's track area */ 89 | /* also the handle's appearance when it is "off" */ 90 | .toggle .handle { 91 | @include transition($toggle-transition-duration cubic-bezier(0, 1.1, 1, 1.1)); 92 | @include transition-property((background-color, transform)); 93 | position: absolute; 94 | display: block; 95 | width: $toggle-handle-width; 96 | height: $toggle-handle-height; 97 | border-radius: $toggle-handle-radius; 98 | background-color: $toggle-handle-off-bg-color; 99 | top: $toggle-border-width + $toggle-hit-area-expansion; 100 | left: $toggle-border-width + $toggle-hit-area-expansion; 101 | box-shadow: 0 2px 7px rgba(0,0,0,.35), 0 1px 1px rgba(0,0,0,.15); 102 | 103 | &:before { 104 | // used to create a larger (but hidden) hit area to slide the handle 105 | position: absolute; 106 | top: -4px; 107 | left: ( ($toggle-handle-width / 2) * -1) - 8; 108 | padding: ($toggle-handle-height / 2) + 5 ($toggle-handle-width + 7); 109 | content: " "; 110 | } 111 | } 112 | 113 | .toggle input:checked + .track .handle { 114 | // the handle when the toggle is "on" 115 | @include translate3d($toggle-width - $toggle-handle-width - ($toggle-border-width * 2), 0, 0); 116 | background-color: $toggle-handle-on-bg-color; 117 | } 118 | 119 | .item-toggle.active { 120 | box-shadow: none; 121 | } 122 | 123 | .item-toggle, 124 | .item-toggle.item-complex .item-content { 125 | // make sure list item content have enough padding on right to fit the toggle 126 | padding-right: ($item-padding * 3) + $toggle-width; 127 | } 128 | 129 | .item-toggle.item-complex { 130 | padding-right: 0; 131 | } 132 | 133 | .item-toggle .toggle { 134 | // position the toggle to the right within a list item 135 | position: absolute; 136 | top: ($item-padding / 2) + 2; 137 | right: $item-padding; 138 | z-index: $z-index-item-toggle; 139 | } 140 | 141 | .toggle input:disabled + .track { 142 | opacity: .6; 143 | } 144 | 145 | .toggle-small { 146 | 147 | .track { 148 | border: 0; 149 | width: 34px; 150 | height: 15px; 151 | background: #9e9e9e; 152 | } 153 | input:checked + .track { 154 | background: rgba(0,150,137,.5); 155 | } 156 | .handle { 157 | top: 2px; 158 | left: 4px; 159 | width: 21px; 160 | height: 21px; 161 | box-shadow: 0 2px 5px rgba(0,0,0,.25); 162 | } 163 | input:checked + .track .handle { 164 | @include translate3d(16px, 0, 0); 165 | background: rgb(0,150,137); 166 | } 167 | &.item-toggle .toggle { 168 | top: 19px; 169 | } 170 | 171 | .toggle-light { 172 | @include toggle-small-style($toggle-on-light-bg); 173 | } 174 | .toggle-stable { 175 | @include toggle-small-style($toggle-on-stable-bg); 176 | } 177 | .toggle-positive { 178 | @include toggle-small-style($toggle-on-positive-bg); 179 | } 180 | .toggle-calm { 181 | @include toggle-small-style($toggle-on-calm-bg); 182 | } 183 | .toggle-assertive { 184 | @include toggle-small-style($toggle-on-assertive-bg); 185 | } 186 | .toggle-balanced { 187 | @include toggle-small-style($toggle-on-balanced-bg); 188 | } 189 | .toggle-energized { 190 | @include toggle-small-style($toggle-on-energized-bg); 191 | } 192 | .toggle-royal { 193 | @include toggle-small-style($toggle-on-royal-bg); 194 | } 195 | .toggle-dark { 196 | @include toggle-small-style($toggle-on-dark-bg); 197 | } 198 | } 199 | --------------------------------------------------------------------------------