├── .bowerrc ├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── config.xml ├── gulpfile.js ├── hooks ├── README.md └── after_prepare │ └── 010_add_platform_class.js ├── ionic.project ├── media ├── icons │ └── icon.png └── splashscreen │ ├── Default-568h@2x~iphone.png │ ├── Default@2x~iphone.png │ └── Default~iphone.png ├── package.json ├── scss └── ionic.app.scss └── www ├── api └── data.json ├── css └── style.css ├── img └── logo.jpg ├── index.html ├── js └── app.js ├── lib ├── angular-animate │ ├── .bower.json │ ├── README.md │ ├── angular-animate.js │ ├── angular-animate.min.js │ ├── angular-animate.min.js.map │ └── bower.json ├── angular-sanitize │ ├── .bower.json │ ├── README.md │ ├── angular-sanitize.js │ ├── angular-sanitize.min.js │ ├── angular-sanitize.min.js.map │ └── bower.json ├── angular-ui-router │ ├── .bower.json │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── bower.json │ ├── release │ │ ├── angular-ui-router.js │ │ └── angular-ui-router.min.js │ └── src │ │ ├── common.js │ │ ├── compat.js │ │ ├── resolve.js │ │ ├── state.js │ │ ├── stateDirectives.js │ │ ├── stateFilters.js │ │ ├── templateFactory.js │ │ ├── urlMatcherFactory.js │ │ ├── urlRouter.js │ │ ├── view.js │ │ ├── viewDirective.js │ │ └── viewScroll.js ├── angular │ ├── .bower.json │ ├── README.md │ ├── angular-csp.css │ ├── angular.js │ ├── angular.min.js │ ├── angular.min.js.gzip │ ├── angular.min.js.map │ └── bower.json ├── angularfire │ ├── .bower.json │ ├── README.md │ ├── bower.json │ └── dist │ │ ├── angularfire.js │ │ └── angularfire.min.js ├── collide │ ├── .bower.json │ ├── .gitignore │ ├── README.md │ ├── bower.json │ ├── collide.js │ ├── package.json │ ├── test.html │ └── test │ │ ├── animator.spec.js │ │ ├── core │ │ └── timeline.spec.js │ │ └── util │ │ └── simple-emitter.spec.js ├── firebase-simple-login │ ├── .bower.json │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── firebase-simple-login-debug.js │ └── firebase-simple-login.js ├── firebase │ ├── .bower.json │ ├── LICENSE │ ├── README.md │ ├── bower.json │ ├── firebase-debug.js │ └── firebase.js ├── ionic │ ├── .bower.json │ ├── README.md │ ├── bower.json │ ├── css │ │ ├── ionic.css │ │ └── ionic.min.css │ ├── fonts │ │ ├── ionicons.eot │ │ ├── ionicons.svg │ │ ├── ionicons.ttf │ │ └── ionicons.woff │ ├── js │ │ ├── ionic-angular.js │ │ ├── ionic-angular.min.js │ │ ├── ionic.bundle.js │ │ ├── ionic.bundle.min.js │ │ ├── ionic.js │ │ └── ionic.min.js │ └── scss │ │ ├── _action-sheet.scss │ │ ├── _animations.scss │ │ ├── _backdrop.scss │ │ ├── _badge.scss │ │ ├── _bar.scss │ │ ├── _button-bar.scss │ │ ├── _button.scss │ │ ├── _checkbox.scss │ │ ├── _form.scss │ │ ├── _grid.scss │ │ ├── _items.scss │ │ ├── _list.scss │ │ ├── _loading.scss │ │ ├── _menu.scss │ │ ├── _mixins.scss │ │ ├── _modal.scss │ │ ├── _platform.scss │ │ ├── _popover.scss │ │ ├── _popup.scss │ │ ├── _progress.scss │ │ ├── _radio.scss │ │ ├── _range.scss │ │ ├── _reset.scss │ │ ├── _scaffolding.scss │ │ ├── _select.scss │ │ ├── _slide-box.scss │ │ ├── _split-pane.scss │ │ ├── _tabs.scss │ │ ├── _toggle.scss │ │ ├── _type.scss │ │ ├── _util.scss │ │ ├── _variables.scss │ │ ├── ionic.scss │ │ └── ionicons │ │ ├── _ionicons-animation.scss │ │ ├── _ionicons-font.scss │ │ ├── _ionicons-icons.scss │ │ ├── _ionicons-variables.scss │ │ └── ionicons.scss └── mockfirebase │ ├── .bower.json │ ├── CONTRIBUTING.md │ ├── MAINTAINING.md │ ├── README.md │ ├── bower.json │ └── dist │ └── mockfirebase.js └── views ├── about └── about.html ├── events ├── events.html └── events.js ├── food ├── food.html ├── food.js └── preview.html ├── home ├── comments.html ├── home.html └── home.js ├── local ├── beaches.html ├── food.html ├── local.html └── sights.html ├── reservation ├── reservation.html └── reservation.js ├── tour ├── tour.html └── tour.js └── weather ├── weather.html └── weather.js /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "www/lib" 3 | } 4 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 4 | Jeremy Wilken (Gnome on the run) 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ionic Framework Demo App 2 | 3 | This is a demo app built with the Ionic Framework that you can preview in the browser or clone and run locally on an emulator or device. 4 | 5 | # View it now 6 | 7 | https://ionic-in-action.github.io/ionic-demo-resort-app/www/ 8 | 9 | # Run locally 10 | 11 | This assumes you already have an emulator setup for iOS or Android. Substitute `ios` for `android` below to use Android. 12 | 13 | npm install -g ionic cordova 14 | git clone https://github.com/ionic-in-action/ionic-demo-resort-app.git 15 | cd ionic-demo-resort-app 16 | ionic platform add ios 17 | ionic emulate ios 18 | 19 | # LICENSE 20 | 21 | Ionic is licensed under the MIT Open Source license. For more information, see the LICENSE file in this repository. 22 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic-in-action-demo", 3 | "private": "true", 4 | "dependencies": { 5 | "ionic": "driftyco/ionic-bower#1.0.0-beta.12", 6 | "firebase": "~1.0.21", 7 | "angularfire": "~0.8.2" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ionic In Action 4 | 5 | Demo of Ionic. 6 | 7 | 8 | Ionic in Action 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /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 | .pipe(gulp.dest('./www/css/')) 20 | .pipe(minifyCss({ 21 | keepSpecialComments: 0 22 | })) 23 | .pipe(rename({ extname: '.min.css' })) 24 | .pipe(gulp.dest('./www/css/')) 25 | .on('end', done); 26 | }); 27 | 28 | gulp.task('watch', function() { 29 | gulp.watch(paths.sass, ['sass']); 30 | }); 31 | 32 | gulp.task('install', ['git-check'], function() { 33 | return bower.commands.install() 34 | .on('log', function(data) { 35 | gutil.log('bower', gutil.colors.cyan(data.id), data.message); 36 | }); 37 | }); 38 | 39 | gulp.task('git-check', function(done) { 40 | if (!sh.which('git')) { 41 | console.log( 42 | ' ' + gutil.colors.red('Git is not installed.'), 43 | '\n Git, the version control system, is required to download Ionic.', 44 | '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', 45 | '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' 46 | ); 47 | process.exit(1); 48 | } 49 | done(); 50 | }); 51 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |

Sunshine Resort

43 |
44 | 45 | 46 | Home 47 | Reservation 48 | Call Concierge 49 | Weather 50 | Events 51 | Local Places 52 | Order Room Service 53 | About 54 | 55 | 56 |
57 | 58 |
59 | 60 | 61 | -------------------------------------------------------------------------------- /www/js/app.js: -------------------------------------------------------------------------------- 1 | angular.module('App', ['ionic', 'firebase']) 2 | 3 | .config(function ($stateProvider, $urlRouterProvider) { 4 | $stateProvider 5 | .state('tour', { 6 | url: '/tour', 7 | templateUrl: 'views/tour/tour.html', 8 | controller: 'TourCtrl' 9 | }) 10 | .state('home', { 11 | url: '/', 12 | templateUrl: 'views/home/home.html', 13 | controller: 'HomeCtrl' 14 | }) 15 | .state('about', { 16 | url: '/about', 17 | templateUrl: 'views/about/about.html' 18 | }) 19 | .state('reservation', { 20 | url: '/reservation', 21 | templateUrl: 'views/reservation/reservation.html', 22 | controller: 'ReservationCtrl' 23 | }) 24 | .state('events', { 25 | url: '/events', 26 | templateUrl: 'views/events/events.html', 27 | controller: 'EventsCtrl' 28 | }) 29 | .state('food', { 30 | url: '/food', 31 | templateUrl: 'views/food/food.html', 32 | controller: 'FoodCtrl' 33 | }) 34 | .state('weather', { 35 | url: '/weather', 36 | templateUrl: 'views/weather/weather.html', 37 | controller: 'WeatherCtrl' 38 | }) 39 | .state('local', { 40 | abstract: true, 41 | url: '/local', 42 | templateUrl: 'views/local/local.html' 43 | }) 44 | .state('local.food', { 45 | url: '/food', 46 | views: { 47 | 'local-food': { 48 | templateUrl: 'views/local/food.html' 49 | } 50 | } 51 | }) 52 | .state('local.beaches', { 53 | url: '/beaches', 54 | views: { 55 | 'local-beaches': { 56 | templateUrl: 'views/local/beaches.html' 57 | } 58 | } 59 | }) 60 | .state('local.sights', { 61 | url: '/sights', 62 | views: { 63 | 'local-sights': { 64 | templateUrl: 'views/local/sights.html' 65 | } 66 | } 67 | }); 68 | 69 | $urlRouterProvider.otherwise('/'); 70 | }) 71 | 72 | .run(function($ionicPlatform, $location) { 73 | $ionicPlatform.ready(function() { 74 | // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 75 | // for form inputs) 76 | if(window.cordova && window.cordova.plugins.Keyboard) { 77 | cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 78 | } 79 | if(window.StatusBar) { 80 | StatusBar.styleDefault(); 81 | } 82 | }); 83 | 84 | var firstVisit = localStorage.getItem('firstVisit'); 85 | if (!firstVisit) { 86 | $location.url('/tour'); 87 | } 88 | }) 89 | 90 | .factory('EventsService', function ($firebase) { 91 | var firebase = new Firebase('https://ionic-in-action-demo.firebaseio.com/events'); 92 | var service = $firebase(firebase); 93 | return service; 94 | }) 95 | 96 | .factory('MenuService', function ($firebase) { 97 | var firebase = new Firebase('https://ionic-in-action-demo.firebaseio.com/menu'); 98 | var service = $firebase(firebase); 99 | return service; 100 | }) 101 | 102 | .controller('NavbarCtrl', function ($scope, $ionicSideMenuDelegate) { 103 | 104 | $scope.openMenu = function () { 105 | $ionicSideMenuDelegate.toggleLeft(); 106 | }; 107 | }); 108 | -------------------------------------------------------------------------------- /www/lib/angular-animate/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-animate", 3 | "version": "1.2.24", 4 | "main": "./angular-animate.js", 5 | "dependencies": { 6 | "angular": "1.2.24" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-animate", 9 | "_release": "1.2.24", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.24", 13 | "commit": "953019049bd1f4a90888c7b92328eb307a1290b5" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-animate.git", 16 | "_target": "~1.2.17", 17 | "_originalSource": "angular-animate" 18 | } -------------------------------------------------------------------------------- /www/lib/angular-animate/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-animate 2 | 3 | This repo is for distribution on `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 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-animate 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | And add `ngAnimate` as a dependency for your app: 22 | 23 | ```javascript 24 | angular.module('myApp', ['ngAnimate']); 25 | ``` 26 | 27 | ## Documentation 28 | 29 | Documentation is available on the 30 | [AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). 31 | 32 | ## License 33 | 34 | The MIT License 35 | 36 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining a copy 39 | of this software and associated documentation files (the "Software"), to deal 40 | in the Software without restriction, including without limitation the rights 41 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the Software is 43 | furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in 46 | all copies or substantial portions of the Software. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 54 | THE SOFTWARE. 55 | -------------------------------------------------------------------------------- /www/lib/angular-animate/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-animate", 3 | "version": "1.2.24", 4 | "main": "./angular-animate.js", 5 | "dependencies": { 6 | "angular": "1.2.24" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.2.24", 4 | "main": "./angular-sanitize.js", 5 | "dependencies": { 6 | "angular": "1.2.24" 7 | }, 8 | "homepage": "https://github.com/angular/bower-angular-sanitize", 9 | "_release": "1.2.24", 10 | "_resolution": { 11 | "type": "version", 12 | "tag": "v1.2.24", 13 | "commit": "0cf487e8e13ff5d61388ed7359bed7386724385e" 14 | }, 15 | "_source": "git://github.com/angular/bower-angular-sanitize.git", 16 | "_target": "~1.2.17", 17 | "_originalSource": "angular-sanitize" 18 | } -------------------------------------------------------------------------------- /www/lib/angular-sanitize/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular-sanitize 2 | 3 | This repo is for distribution on `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 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular-sanitize 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | And add `ngSanitize` as a dependency for your app: 22 | 23 | ```javascript 24 | angular.module('myApp', ['ngSanitize']); 25 | ``` 26 | 27 | ## Documentation 28 | 29 | Documentation is available on the 30 | [AngularJS docs site](http://docs.angularjs.org/api/ngSanitize). 31 | 32 | ## License 33 | 34 | The MIT License 35 | 36 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining a copy 39 | of this software and associated documentation files (the "Software"), to deal 40 | in the Software without restriction, including without limitation the rights 41 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the Software is 43 | furnished to do so, subject to the following conditions: 44 | 45 | The above copyright notice and this permission notice shall be included in 46 | all copies or substantial portions of the Software. 47 | 48 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 54 | THE SOFTWARE. 55 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/angular-sanitize.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | AngularJS v1.2.24 3 | (c) 2010-2014 Google, Inc. http://angularjs.org 4 | License: MIT 5 | */ 6 | (function(q,g,r){'use strict';function F(a){var d=[];t(d,g.noop).chars(a);return d.join("")}function m(a){var d={};a=a.split(",");var c;for(c=0;c=c;e--)d.end&&d.end(f[e]);f.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,l,f=[],n=a,h;for(f.last=function(){return f[f.length-1]};a;){h="";l=!0;if(f.last()&&y[f.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(I,"$1").replace(J,"$1");d.chars&&d.chars(s(b));return""}),e("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(d.comment&&d.comment(a.substring(4, 8 | b)),a=a.substring(b+3),l=!1);else if(z.test(a)){if(b=a.match(z))a=a.replace(b[0],""),l=!1}else if(K.test(a)){if(b=a.match(A))a=a.substring(b[0].length),b[0].replace(A,e),l=!1}else L.test(a)&&((b=a.match(B))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(B,c)),l=!1):(h+="<",a=a.substring(1)));l&&(b=a.indexOf("<"),h+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),d.chars&&d.chars(s(h)))}if(a==n)throw M("badparse",a);n=a}e()}function s(a){if(!a)return"";var d=N.exec(a);a=d[1];var c=d[3];if(d=d[2])p.innerHTML= 9 | d.replace(//g,">")}function t(a,d){var c=!1,e=g.bind(a,a.push);return{start:function(a,l,f){a=g.lowercase(a);!c&&y[a]&&(c=a);c||!0!==D[a]||(e("<"),e(a),g.forEach(l,function(c,f){var k= 10 | g.lowercase(f),l="img"===a&&"src"===k||"background"===k;!0!==Q[k]||!0===E[k]&&!d(c,l)||(e(" "),e(f),e('="'),e(C(c)),e('"'))}),e(f?"/>":">"))},end:function(a){a=g.lowercase(a);c||!0!==D[a]||(e(""));a==c&&(c=!1)},chars:function(a){c||e(C(a))}}}var M=g.$$minErr("$sanitize"),B=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,A=/^<\/\s*([\w:-]+)[^>]*>/,H=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,L=/^]*?)>/i,J=/"]/,c=/^mailto:/;return function(e,b){function l(a){a&&k.push(F(a))}function f(a,c){k.push("');l(c);k.push("")} 14 | if(!e)return e;for(var n,h=e,k=[],m,p;n=h.match(d);)m=n[0],n[2]==n[3]&&(m="mailto:"+m),p=n.index,l(h.substr(0,p)),f(m,n[0].replace(c,"")),h=h.substring(p+n[0].length);l(h);return a(k.join(""))}}])})(window,window.angular); 15 | //# sourceMappingURL=angular-sanitize.min.js.map 16 | -------------------------------------------------------------------------------- /www/lib/angular-sanitize/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-sanitize", 3 | "version": "1.2.24", 4 | "main": "./angular-sanitize.js", 5 | "dependencies": { 6 | "angular": "1.2.24" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-ui-router", 3 | "version": "0.2.10", 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.10", 25 | "_resolution": { 26 | "type": "version", 27 | "tag": "0.2.10", 28 | "commit": "4f509d6393452c933aa5908939d0a17e47b59388" 29 | }, 30 | "_source": "git://github.com/angular-ui/ui-router.git", 31 | "_target": "0.2.10", 32 | "_originalSource": "angular-ui-router" 33 | } -------------------------------------------------------------------------------- /www/lib/angular-ui-router/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ### v0.2.8 (2014-01-16) 3 | 4 | 5 | #### Bug Fixes 6 | 7 | * **$state:** allow null to be passed as 'params' param ([094dc30e](https://github.com/angular-ui/ui-router/commit/094dc30e883e1bd14e50a475553bafeaade3b178)) 8 | * **$state.go:** param inheritance shouldn't inherit from siblings ([aea872e0](https://github.com/angular-ui/ui-router/commit/aea872e0b983cb433436ce5875df10c838fccedb)) 9 | * **uiSrefActive:** annotate controller injection ([85921422](https://github.com/angular-ui/ui-router/commit/85921422ff7fb0effed358136426d616cce3d583), closes [#671](https://github.com/angular-ui/ui-router/issues/671)) 10 | * **uiView:** 11 | * autoscroll tests pass on 1.2.4 & 1.1.5 ([86eacac0](https://github.com/angular-ui/ui-router/commit/86eacac09ca5e9000bd3b9c7ba6e2cc95d883a3a)) 12 | * don't animate initial load ([83b6634d](https://github.com/angular-ui/ui-router/commit/83b6634d27942ca74766b2b1244a7fc52c5643d9)) 13 | * test pass against 1.0.8 and 1.2.4 ([a402415a](https://github.com/angular-ui/ui-router/commit/a402415a2a28b360c43b9fe8f4f54c540f6c33de)) 14 | * it should autoscroll when expr is missing. ([8bb9e27a](https://github.com/angular-ui/ui-router/commit/8bb9e27a2986725f45daf44c4c9f846385095aff)) 15 | 16 | 17 | #### Features 18 | 19 | * **uiSref:** add target attribute behaviour ([c12bf9a5](https://github.com/angular-ui/ui-router/commit/c12bf9a520d30d70294e3d82de7661900f8e394e)) 20 | * **uiView:** 21 | * merge autoscroll expression test. ([b89e0f87](https://github.com/angular-ui/ui-router/commit/b89e0f871d5cc35c10925ede986c10684d5c9252)) 22 | * cache and test autoscroll expression ([ee262282](https://github.com/angular-ui/ui-router/commit/ee2622828c2ce83807f006a459ac4e11406d9258)) 23 | 24 | -------------------------------------------------------------------------------- /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/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-ui-router", 3 | "version": "0.2.10", 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/angular-ui-router/src/common.js: -------------------------------------------------------------------------------- 1 | /*jshint globalstrict:true*/ 2 | /*global angular:false*/ 3 | 'use strict'; 4 | 5 | var isDefined = angular.isDefined, 6 | isFunction = angular.isFunction, 7 | isString = angular.isString, 8 | isObject = angular.isObject, 9 | isArray = angular.isArray, 10 | forEach = angular.forEach, 11 | extend = angular.extend, 12 | copy = angular.copy; 13 | 14 | function inherit(parent, extra) { 15 | return extend(new (extend(function() {}, { prototype: parent }))(), extra); 16 | } 17 | 18 | function merge(dst) { 19 | forEach(arguments, function(obj) { 20 | if (obj !== dst) { 21 | forEach(obj, function(value, key) { 22 | if (!dst.hasOwnProperty(key)) dst[key] = value; 23 | }); 24 | } 25 | }); 26 | return dst; 27 | } 28 | 29 | /** 30 | * Finds the common ancestor path between two states. 31 | * 32 | * @param {Object} first The first state. 33 | * @param {Object} second The second state. 34 | * @return {Array} Returns an array of state names in descending order, not including the root. 35 | */ 36 | function ancestors(first, second) { 37 | var path = []; 38 | 39 | for (var n in first.path) { 40 | if (first.path[n] !== second.path[n]) break; 41 | path.push(first.path[n]); 42 | } 43 | return path; 44 | } 45 | 46 | /** 47 | * IE8-safe wrapper for `Object.keys()`. 48 | * 49 | * @param {Object} object A JavaScript object. 50 | * @return {Array} Returns the keys of the object as an array. 51 | */ 52 | function keys(object) { 53 | if (Object.keys) { 54 | return Object.keys(object); 55 | } 56 | var result = []; 57 | 58 | angular.forEach(object, function(val, key) { 59 | result.push(key); 60 | }); 61 | return result; 62 | } 63 | 64 | /** 65 | * IE8-safe wrapper for `Array.prototype.indexOf()`. 66 | * 67 | * @param {Array} array A JavaScript array. 68 | * @param {*} value A value to search the array for. 69 | * @return {Number} Returns the array index value of `value`, or `-1` if not present. 70 | */ 71 | function arraySearch(array, value) { 72 | if (Array.prototype.indexOf) { 73 | return array.indexOf(value, Number(arguments[2]) || 0); 74 | } 75 | var len = array.length >>> 0, from = Number(arguments[2]) || 0; 76 | from = (from < 0) ? Math.ceil(from) : Math.floor(from); 77 | 78 | if (from < 0) from += len; 79 | 80 | for (; from < len; from++) { 81 | if (from in array && array[from] === value) return from; 82 | } 83 | return -1; 84 | } 85 | 86 | /** 87 | * Merges a set of parameters with all parameters inherited between the common parents of the 88 | * current state and a given destination state. 89 | * 90 | * @param {Object} currentParams The value of the current state parameters ($stateParams). 91 | * @param {Object} newParams The set of parameters which will be composited with inherited params. 92 | * @param {Object} $current Internal definition of object representing the current state. 93 | * @param {Object} $to Internal definition of object representing state to transition to. 94 | */ 95 | function inheritParams(currentParams, newParams, $current, $to) { 96 | var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = []; 97 | 98 | for (var i in parents) { 99 | if (!parents[i].params || !parents[i].params.length) continue; 100 | parentParams = parents[i].params; 101 | 102 | for (var j in parentParams) { 103 | if (arraySearch(inheritList, parentParams[j]) >= 0) continue; 104 | inheritList.push(parentParams[j]); 105 | inherited[parentParams[j]] = currentParams[parentParams[j]]; 106 | } 107 | } 108 | return extend({}, inherited, newParams); 109 | } 110 | 111 | /** 112 | * Normalizes a set of values to string or `null`, filtering them by a list of keys. 113 | * 114 | * @param {Array} keys The list of keys to normalize/return. 115 | * @param {Object} values An object hash of values to normalize. 116 | * @return {Object} Returns an object hash of normalized string values. 117 | */ 118 | function normalize(keys, values) { 119 | var normalized = {}; 120 | 121 | forEach(keys, function (name) { 122 | var value = values[name]; 123 | normalized[name] = (value != null) ? String(value) : null; 124 | }); 125 | return normalized; 126 | } 127 | 128 | /** 129 | * Performs a non-strict comparison of the subset of two objects, defined by a list of keys. 130 | * 131 | * @param {Object} a The first object. 132 | * @param {Object} b The second object. 133 | * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified, 134 | * it defaults to the list of keys in `a`. 135 | * @return {Boolean} Returns `true` if the keys match, otherwise `false`. 136 | */ 137 | function equalForKeys(a, b, keys) { 138 | if (!keys) { 139 | keys = []; 140 | for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility 141 | } 142 | 143 | for (var i=0; i 228 | * 229 | * 230 | * 231 | * 232 | * 233 | * 234 | * 238 | * 239 | * 240 | * 241 | * 242 | * 243 | */ 244 | angular.module('ui.router', ['ui.router.state']); 245 | 246 | angular.module('ui.router.compat', ['ui.router']); 247 | -------------------------------------------------------------------------------- /www/lib/angular-ui-router/src/compat.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @ngdoc object 3 | * @name ui.router.compat.$routeProvider 4 | * 5 | * @requires ui.router.state.$stateProvider 6 | * @requires ui.router.router.$urlRouterProvider 7 | * 8 | * @description 9 | * `$routeProvider` of the `ui.router.compat` module overwrites the existing 10 | * `routeProvider` from the core. This is done to provide compatibility between 11 | * the UI Router and the core router. 12 | * 13 | * It also provides a `when()` method to register routes that map to certain urls. 14 | * Behind the scenes it actually delegates either to 15 | * {@link ui.router.router.$urlRouterProvider $urlRouterProvider} or to the 16 | * {@link ui.router.state.$stateProvider $stateProvider} to postprocess the given 17 | * router definition object. 18 | */ 19 | $RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider']; 20 | function $RouteProvider( $stateProvider, $urlRouterProvider) { 21 | 22 | var routes = []; 23 | 24 | onEnterRoute.$inject = ['$$state']; 25 | function onEnterRoute( $$state) { 26 | /*jshint validthis: true */ 27 | this.locals = $$state.locals.globals; 28 | this.params = this.locals.$stateParams; 29 | } 30 | 31 | function onExitRoute() { 32 | /*jshint validthis: true */ 33 | this.locals = null; 34 | this.params = null; 35 | } 36 | 37 | this.when = when; 38 | /* 39 | * @ngdoc function 40 | * @name ui.router.compat.$routeProvider#when 41 | * @methodOf ui.router.compat.$routeProvider 42 | * 43 | * @description 44 | * Registers a route with a given route definition object. The route definition 45 | * object has the same interface the angular core route definition object has. 46 | * 47 | * @example 48 | *
 49 |    * var app = angular.module('app', ['ui.router.compat']);
 50 |    *
 51 |    * app.config(function ($routeProvider) {
 52 |    *   $routeProvider.when('home', {
 53 |    *     controller: function () { ... },
 54 |    *     templateUrl: 'path/to/template'
 55 |    *   });
 56 |    * });
 57 |    * 
58 | * 59 | * @param {string} url URL as string 60 | * @param {object} route Route definition object 61 | * 62 | * @return {object} $routeProvider - $routeProvider instance 63 | */ 64 | function when(url, route) { 65 | /*jshint validthis: true */ 66 | if (route.redirectTo != null) { 67 | // Redirect, configure directly on $urlRouterProvider 68 | var redirect = route.redirectTo, handler; 69 | if (isString(redirect)) { 70 | handler = redirect; // leave $urlRouterProvider to handle 71 | } else if (isFunction(redirect)) { 72 | // Adapt to $urlRouterProvider API 73 | handler = function (params, $location) { 74 | return redirect(params, $location.path(), $location.search()); 75 | }; 76 | } else { 77 | throw new Error("Invalid 'redirectTo' in when()"); 78 | } 79 | $urlRouterProvider.when(url, handler); 80 | } else { 81 | // Regular route, configure as state 82 | $stateProvider.state(inherit(route, { 83 | parent: null, 84 | name: 'route:' + encodeURIComponent(url), 85 | url: url, 86 | onEnter: onEnterRoute, 87 | onExit: onExitRoute 88 | })); 89 | } 90 | routes.push(route); 91 | return this; 92 | } 93 | 94 | /* 95 | * @ngdoc object 96 | * @name ui.router.compat.$route 97 | * 98 | * @requires ui.router.state.$state 99 | * @requires $rootScope 100 | * @requires $routeParams 101 | * 102 | * @property {object} routes - Array of registered routes. 103 | * @property {object} params - Current route params as object. 104 | * @property {string} current - Name of the current route. 105 | * 106 | * @description 107 | * The `$route` service provides interfaces to access defined routes. It also let's 108 | * you access route params through `$routeParams` service, so you have fully 109 | * control over all the stuff you would actually get from angular's core `$route` 110 | * service. 111 | */ 112 | this.$get = $get; 113 | $get.$inject = ['$state', '$rootScope', '$routeParams']; 114 | function $get( $state, $rootScope, $routeParams) { 115 | 116 | var $route = { 117 | routes: routes, 118 | params: $routeParams, 119 | current: undefined 120 | }; 121 | 122 | function stateAsRoute(state) { 123 | return (state.name !== '') ? state : undefined; 124 | } 125 | 126 | $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) { 127 | $rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from)); 128 | }); 129 | 130 | $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) { 131 | $route.current = stateAsRoute(to); 132 | $rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from)); 133 | copy(toParams, $route.params); 134 | }); 135 | 136 | $rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) { 137 | $rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error); 138 | }); 139 | 140 | return $route; 141 | } 142 | } 143 | 144 | angular.module('ui.router.compat') 145 | .provider('$route', $RouteProvider) 146 | .directive('ngView', $ViewDirective); 147 | -------------------------------------------------------------------------------- /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 | return function(state) { 13 | return $state.is(state); 14 | }; 15 | } 16 | 17 | /** 18 | * @ngdoc filter 19 | * @name ui.router.state.filter:includedByState 20 | * 21 | * @requires ui.router.state.$state 22 | * 23 | * @description 24 | * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}. 25 | */ 26 | $IncludedByStateFilter.$inject = ['$state']; 27 | function $IncludedByStateFilter($state) { 28 | return function(state) { 29 | return $state.includes(state); 30 | }; 31 | } 32 | 33 | angular.module('ui.router.state') 34 | .filter('isState', $IsStateFilter) 35 | .filter('includedByState', $IncludedByStateFilter); 36 | -------------------------------------------------------------------------------- /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 }) 87 | .then(function(response) { return response.data; }); 88 | }; 89 | 90 | /** 91 | * @ngdoc function 92 | * @name ui.router.util.$templateFactory#fromUrl 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/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/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/angular/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.2.24", 4 | "main": "./angular.js", 5 | "dependencies": {}, 6 | "homepage": "https://github.com/angular/bower-angular", 7 | "_release": "1.2.24", 8 | "_resolution": { 9 | "type": "version", 10 | "tag": "v1.2.24", 11 | "commit": "e2acb3e79e8f571bd36e12f31c7b2587e0c9dff3" 12 | }, 13 | "_source": "git://github.com/angular/bower-angular.git", 14 | "_target": "~1.2.17", 15 | "_originalSource": "angular" 16 | } -------------------------------------------------------------------------------- /www/lib/angular/README.md: -------------------------------------------------------------------------------- 1 | # bower-angular 2 | 3 | This repo is for distribution on `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 | Install with `bower`: 10 | 11 | ```shell 12 | bower install angular 13 | ``` 14 | 15 | Add a ` 19 | ``` 20 | 21 | ## Documentation 22 | 23 | Documentation is available on the 24 | [AngularJS docs site](http://docs.angularjs.org/). 25 | 26 | ## License 27 | 28 | The MIT License 29 | 30 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org 31 | 32 | Permission is hereby granted, free of charge, to any person obtaining a copy 33 | of this software and associated documentation files (the "Software"), to deal 34 | in the Software without restriction, including without limitation the rights 35 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 36 | copies of the Software, and to permit persons to whom the Software is 37 | furnished to do so, subject to the following conditions: 38 | 39 | The above copyright notice and this permission notice shall be included in 40 | all copies or substantial portions of the Software. 41 | 42 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 43 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 44 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 45 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 46 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 47 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 48 | THE SOFTWARE. 49 | -------------------------------------------------------------------------------- /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 { 8 | display: none !important; 9 | } 10 | 11 | ng\:form { 12 | display: block; 13 | } 14 | 15 | .ng-animate-block-transitions { 16 | transition:0s all!important; 17 | -webkit-transition:0s all!important; 18 | } 19 | 20 | /* show the element during a show/hide animation when the 21 | * animation is ongoing, but the .ng-hide class is active */ 22 | .ng-hide-add-active, .ng-hide-remove { 23 | display: block!important; 24 | } 25 | -------------------------------------------------------------------------------- /www/lib/angular/angular.min.js.gzip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionic-in-action/ionic-demo-resort-app/45ffed0175699c674b7aa88379513a9dff68c320/www/lib/angular/angular.min.js.gzip -------------------------------------------------------------------------------- /www/lib/angular/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.2.24", 4 | "main": "./angular.js", 5 | "dependencies": { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /www/lib/angularfire/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angularfire", 3 | "description": "The officially supported AngularJS binding for Firebase", 4 | "version": "0.8.2", 5 | "authors": [ 6 | "Firebase (https://www.firebase.com/)" 7 | ], 8 | "homepage": "https://github.com/firebase/angularfire", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/firebase/angularfire.git" 12 | }, 13 | "license": "MIT", 14 | "keywords": [ 15 | "angular", 16 | "angularjs", 17 | "firebase", 18 | "realtime" 19 | ], 20 | "main": "dist/angularfire.min.js", 21 | "ignore": [ 22 | "**/.*", 23 | "src", 24 | "tests", 25 | "node_modules", 26 | "bower_components", 27 | "firebase.json", 28 | "package.json", 29 | "Gruntfile.js", 30 | "changelog.txt" 31 | ], 32 | "dependencies": { 33 | "angular": "1.2.x || 1.3.x", 34 | "firebase": "1.0.x", 35 | "firebase-simple-login": "1.6.x", 36 | "mockfirebase": "~0.2.9" 37 | }, 38 | "devDependencies": { 39 | "lodash": "~2.4.1", 40 | "angular-mocks": "~1.2.18" 41 | }, 42 | "_release": "0.8.2", 43 | "_resolution": { 44 | "type": "version", 45 | "tag": "v0.8.2", 46 | "commit": "e1345a96b6299fa23850403e5af2119ab4f62fb1" 47 | }, 48 | "_source": "git://github.com/firebase/angularFire.git", 49 | "_target": "~0.8.2", 50 | "_originalSource": "angularfire", 51 | "_direct": true 52 | } -------------------------------------------------------------------------------- /www/lib/angularfire/README.md: -------------------------------------------------------------------------------- 1 | 2 | # AngularFire 3 | 4 | [![Build Status](https://travis-ci.org/firebase/angularfire.svg?branch=master)](https://travis-ci.org/firebase/angularfire) 5 | [![Coverage Status](https://img.shields.io/coveralls/firebase/angularfire.svg)](https://coveralls.io/r/firebase/angularfire) 6 | [![Version](https://badge.fury.io/gh/firebase%2Fangularfire.svg)](http://badge.fury.io/gh/firebase%2Fangularfire) 7 | 8 | AngularFire is the officially supported [AngularJS](http://angularjs.org/) binding for 9 | [Firebase](http://www.firebase.com/?utm_medium=web&utm_source=angularfire). Firebase is a full 10 | backend so you don't need servers to build your Angular app. AngularFire provides you with the 11 | `$firebase` service which allows you to easily keep your `$scope` variables in sync with your 12 | Firebase backend. 13 | 14 | 15 | ## Downloading AngularFire 16 | 17 | In order to use AngularFire in your project, you need to include the following files in your HTML: 18 | 19 | ```html 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ``` 29 | 30 | Use the URL above to download both the minified and non-minified versions of AngularFire from the 31 | Firebase CDN. You can also download them from the 32 | [releases page of this GitHub repository](https://github.com/firebase/angularfire/releases). 33 | [Firebase](https://www.firebase.com/docs/web/quickstart.html?utm_medium=web&utm_source=angularfire) and 34 | [Angular](https://angularjs.org/) can be downloaded directly from their respective websites. 35 | 36 | You can also install AngularFire via Bower and its dependencies will be downloaded automatically: 37 | 38 | ```bash 39 | $ bower install angularfire --save 40 | ``` 41 | 42 | Once you've included AngularFire and its dependencies into your project, you will have access to 43 | the `$firebase` service. 44 | 45 | You can also start hacking on AngularFire in a matter of seconds on 46 | [Nitrous.IO](https://www.nitrous.io/?utm_source=github.com&utm_campaign=angularfire&utm_medium=hackonnitrous): 47 | 48 | [![Hack firebase/angularfire on 49 | Nitrous.IO](https://d3o0mnbgv6k92a.cloudfront.net/assets/hack-l-v1-3cc067e71372f6045e1949af9d96095b.png)](https://www.nitrous.io/hack_button?source=embed&runtime=nodejs&repo=firebase%2Fangularfire&file_to_open=README.md) 50 | 51 | 52 | ## Getting Started with Firebase 53 | 54 | AngularFire requires Firebase in order to sync data. You can 55 | [sign up here](https://www.firebase.com/signup/?utm_medium=web&utm_source=angularfire) for a free 56 | account. 57 | 58 | 59 | ## Documentation 60 | 61 | The Firebase docs have a [quickstart](https://www.firebase.com/docs/web/bindings/angular/quickstart.html?utm_medium=web&utm_source=angularfire), 62 | [guide](https://www.firebase.com/docs/web/bindings/angular/guide.html?utm_medium=web&utm_source=angularfire), 63 | and [full API reference](https://www.firebase.com/docs/web/bindings/angular/api.html?utm_medium=web&utm_source=angularfire) 64 | for AngularFire. 65 | 66 | We also have a [tutorial](https://www.firebase.com/tutorial/#tutorial/angular/0?utm_medium=web&utm_source=angularfire) 67 | to help you get started with AngularFire. 68 | 69 | Join our [Firebase + Angular Google Group](https://groups.google.com/forum/#!forum/firebase-angular) 70 | to ask questions, provide feedback, and share apps you've built with AngularFire. 71 | 72 | 73 | ## Contributing 74 | 75 | If you'd like to contribute to AngularFire, you'll need to run the following commands to get your 76 | environment set up: 77 | 78 | ```bash 79 | $ git clone https://github.com/firebase/angularfire.git 80 | $ cd angularfire # go to the angularfire directory 81 | $ npm install -g grunt-cli # globally install grunt task runner 82 | $ npm install -g bower # globally install Bower package manager 83 | $ npm install # install local npm build / test dependencies 84 | $ bower install # install local JavaScript dependencies 85 | $ grunt install # install Selenium server for end-to-end tests 86 | $ grunt watch # watch for source file changes 87 | ``` 88 | 89 | `grunt watch` will watch for changes in the `/src/` directory and lint, concatenate, and minify the 90 | source files when a change occurs. The output files - `angularfire.js` and `angularfire.min.js` - 91 | are written to the `/dist/` directory. `grunt watch` will also re-run the unit tests every time you 92 | update any source files. 93 | 94 | You can run the entire test suite via the command line using `grunt test`. To only run the unit 95 | tests, run `grunt test:unit`. To only run the end-to-end [Protractor](https://github.com/angular/protractor/) 96 | tests, run `grunt test:e2e`. 97 | 98 | In addition to the automated test suite, there is an additional manual test suite that ensures that 99 | the `$firebaseSimpleLogin` service is working properly with the authentication providers. These tests 100 | can be run with `grunt test:manual`. Note that you must click "Close this window", login to Twitter, 101 | etc. when prompted in order for these tests to complete successfully. 102 | -------------------------------------------------------------------------------- /www/lib/angularfire/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angularfire", 3 | "description": "The officially supported AngularJS binding for Firebase", 4 | "version": "0.0.0", 5 | "authors": [ 6 | "Firebase (https://www.firebase.com/)" 7 | ], 8 | "homepage": "https://github.com/firebase/angularfire", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/firebase/angularfire.git" 12 | }, 13 | "license": "MIT", 14 | "keywords": [ 15 | "angular", 16 | "angularjs", 17 | "firebase", 18 | "realtime" 19 | ], 20 | "main": "dist/angularfire.min.js", 21 | "ignore": [ 22 | "**/.*", 23 | "src", 24 | "tests", 25 | "node_modules", 26 | "bower_components", 27 | "firebase.json", 28 | "package.json", 29 | "Gruntfile.js", 30 | "changelog.txt" 31 | ], 32 | "dependencies": { 33 | "angular": "1.2.x || 1.3.x", 34 | "firebase": "1.0.x", 35 | "firebase-simple-login": "1.6.x", 36 | "mockfirebase": "~0.2.9" 37 | }, 38 | "devDependencies": { 39 | "lodash": "~2.4.1", 40 | "angular-mocks": "~1.2.18" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /www/lib/collide/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "collide", 3 | "version": "1.0.0-beta.1", 4 | "main": "collide.js", 5 | "ignore": [ 6 | "src" 7 | ], 8 | "dependencies": {}, 9 | "homepage": "https://github.com/driftyco/collide", 10 | "_release": "1.0.0-beta.1", 11 | "_resolution": { 12 | "type": "version", 13 | "tag": "v1.0.0-beta.1", 14 | "commit": "bbc4a1c2b160181d4115c2c7369ae82243cbb475" 15 | }, 16 | "_source": "git://github.com/driftyco/collide.git", 17 | "_target": "1.0.0-beta.1", 18 | "_originalSource": "collide" 19 | } -------------------------------------------------------------------------------- /www/lib/collide/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Commenting this out is preferred by some people, see 24 | # https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 25 | node_modules 26 | bower_components 27 | 28 | # Users Environment Variables 29 | .lock-wscript 30 | 31 | # Built files 32 | dist 33 | -------------------------------------------------------------------------------- /www/lib/collide/README.md: -------------------------------------------------------------------------------- 1 | Collide 2 | -------- 3 | 4 | Collide is a powerful yet simple javascript animation engine for web and hybrid mobile apps, inspired by [Facebook Pop](https://github.com/facebook/pop), built by the [Ionic Framework](http://ionicframework.com/) team. 5 | 6 | Animations in Collide have more power and control than CSS animations or transitions, all without sacrificing performance. 7 | 8 | Collide allows the user to pause, play, reverse, repeat, and skip to any part of an animation at any time, and has support for non-cubic bezier curves, enabling powerful Physics animations (Springs, Gravity, and Velocity) without the complexity of a full-fledged physics engine. 9 | 10 | We built Collide because we wanted to give Ionic developers the power to build complicated animation and gesture driven mobile apps with HTML5 and Javascript, something that wasn't possible before. 11 | 12 | Collide solves the problems with CSS animations using a simple Javascript animation engine and API. It also provides a tweening API similar to WebAnimations, and allows the developer to hook into every frame for full control over the behavior of the animation. 13 | 14 | Coming Soon: 15 | 16 | - Animation decay. Set a velocity on an animation and let it decelerate to a certain point. 17 | 18 | ### Development 19 | 20 | - `npm install` 21 | - `npm install -g browserify` 22 | - `npm run test` runs jasmine-node tests. `npm run autotest` will watch and test 23 | - `npm run build` 24 | - Generated file `dist/collide.js` is require/CommonJS/window friendly. If you include it, it will be included as `window.collide`. 25 | - Note: the `collide.js` found in project root is only updated on release. The built version in dist is not added to git and should be used while developing. 26 | 27 | ### API 28 | 29 | **This is in flux, better documentation coming after API is stable** 30 | 31 | ```js 32 | var animator = collide.animator({ 33 | // 'linear|ease|ease-in|ease-out|ease-in-out|cubic-bezer(x1,y1,x2,y2)', 34 | // or function(t, duration), 35 | // or a dynamics configuration (see below) 36 | easing: 'ease-in-out', 37 | duration: 1000, 38 | percent: 0, 39 | reverse: false 40 | }); 41 | 42 | // Actions, all of these return `this` and are chainable 43 | // .on('step' callback is given a 'percent', 0-1, as argument (for springs it could be outside 0-1 range) 44 | // .on('stop' callback is given a boolean, wasCompleted 45 | animator.on(/step|destroy|start|stop|complete/, function() {}) 46 | animator.once(...) //same event types 47 | animator.off(...) //works like jquery.off 48 | animator.stop(); //stop/pause at current position 49 | animator.start(); //start from current position 50 | animator.restrart(); //start over 51 | animator.destroy(); //unbind all events & deallocate 52 | 53 | animator.isRunning(); //boolean getter 54 | 55 | //These are getters and setters. 56 | //No arguments is a getter, argument is a chainable setter. 57 | animator.percent(newPercent); //0-1 58 | animator.duration(duration); //milliseconds 59 | animator.reverse(isReverse); 60 | animator.easing(easing); //setter, string|function(t,duration)|dynamicsConfiguration. 61 | // Dynamics configuration looks like this one of these: 62 | // animator.easing({ 63 | // type: 'spring', 64 | // frequency: 15, 65 | // friction: 200, 66 | // initialForce: false 67 | // }); 68 | // animator.easing({ 69 | // type: 'gravity', 70 | // frequency: 15, 71 | // friction: 200, 72 | // initialForce: false 73 | // }); 74 | 75 | ``` 76 | 77 | ### Examples 78 | 79 | See test.html. 80 | 81 | ```js 82 | var animator = collide.animator({ 83 | duration: 1000, 84 | easing: 'ease-in-out' 85 | }) 86 | .on('step', function(v) { 87 | //Have the element spring over 400px 88 | myElement.css('webkitTransform', 'translateX(' + (v*400) + 'px)'); 89 | }) 90 | .start(); 91 | ``` 92 | -------------------------------------------------------------------------------- /www/lib/collide/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "collide", 3 | "version": "1.0.0-beta.1", 4 | "main": "collide.js", 5 | "ignore": [ 6 | "src" 7 | ], 8 | "dependencies": {} 9 | } 10 | -------------------------------------------------------------------------------- /www/lib/collide/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "collide", 3 | "version": "0.0.4", 4 | "main": "collide.js", 5 | "scripts": { 6 | "build": "mkdir -p dist && browserify src/index.js -s collide > dist/collide.js", 7 | "test": "node_modules/.bin/jasmine-node test --color", 8 | "autotest": "node_modules/.bin/jasmine-node test --watch src --autotest --color" 9 | }, 10 | "dependencies": { 11 | "raf": "^2.0.1", 12 | "feature": "^0.1.4", 13 | "performance-now": "^0.1.3" 14 | }, 15 | "devDependencies": { 16 | "jasmine-node": "^1.14.5", 17 | "proxyquire": "^1.0.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /www/lib/collide/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 26 | 27 | 28 | 29 | 30 | 31 |
32 |
33 | 34 |
35 | 39 | 43 |
44 | 48 |
49 | 53 |
54 | 58 |
59 | 60 | 61 | 62 |

63 | 64 | 65 | 66 | 67 | 68 |

69 |

70 | 71 | 72 |

73 |
74 | {{animationResult}} 75 |
76 | 77 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /www/lib/collide/test/core/timeline.spec.js: -------------------------------------------------------------------------------- 1 | 2 | var lastRafId; 3 | var nextRafCb; 4 | function mockRaf(cb) { 5 | nextRafCb = cb; 6 | return lastRafId++; 7 | } 8 | mockRaf.cancel = jasmine.createSpy('rafCancel'); 9 | 10 | var nextTime = 0; 11 | function mockTime() { 12 | return nextTime; 13 | } 14 | 15 | var proxyquire = require('proxyquire'); 16 | var timeline = proxyquire('../../src/core/timeline', { 17 | 'raf': mockRaf, 18 | 'performance-now': mockTime 19 | }); 20 | 21 | describe('timeline', function() { 22 | 23 | beforeEach(function() { 24 | lastRafId = 0; 25 | nextRafCb = null; 26 | nextTime = 0; 27 | }); 28 | 29 | it('starting animation should start ticking only on first animation', function() { 30 | spyOn(timeline, 'tick').andCallThrough(); 31 | timeline.animationStarted({ _: { id: 0 } }); 32 | expect(timeline.tick).toHaveBeenCalled(); 33 | expect(timeline.isTicking).toBe(true); 34 | 35 | timeline.tick.reset(); 36 | timeline.animationStarted({ _: { id: 1 } }); 37 | expect(timeline.tick).not.toHaveBeenCalled(); 38 | }); 39 | 40 | it('stopping animation should maybeStopTicking', function() { 41 | spyOn(timeline, 'maybeStopTicking'); 42 | timeline.animationStopped({ _: { id: 0 } }); 43 | expect(timeline.maybeStopTicking).toHaveBeenCalled(); 44 | }); 45 | 46 | it('maybeStopTicking should stop ticking if no animations left', function() { 47 | timeline._running = { 1: true }; 48 | timeline.isTicking = true; 49 | timeline._rafId = 0; 50 | timeline.maybeStopTicking(); 51 | expect(mockRaf.cancel).not.toHaveBeenCalled(); 52 | 53 | timeline._running = {}; 54 | timeline.maybeStopTicking(); 55 | expect(mockRaf.cancel).toHaveBeenCalledWith(timeline._rafId); 56 | }); 57 | 58 | it('tick() should step every frame, and tick running with deltaT', function() { 59 | var tickSpy = jasmine.createSpy('tick'); 60 | timeline._running = { 61 | 0: { _tick: tickSpy } 62 | }; 63 | nextTime = 0; 64 | timeline.tick(); 65 | expect(tickSpy).not.toHaveBeenCalled(); 66 | 67 | nextTime = 100; 68 | nextRafCb(); 69 | expect(tickSpy).toHaveBeenCalledWith(100); 70 | 71 | nextTime = 149; 72 | nextRafCb(); 73 | expect(tickSpy).toHaveBeenCalledWith(49); 74 | }); 75 | }); 76 | -------------------------------------------------------------------------------- /www/lib/collide/test/util/simple-emitter.spec.js: -------------------------------------------------------------------------------- 1 | var Emitter = require('../../src/util/simple-emitter'); 2 | 3 | describe('SimpleEmitter', function() { 4 | 5 | it('should on() and emit()', function() { 6 | var receive = jasmine.createSpy('receive'); 7 | var emitter = new Emitter(); 8 | emitter.on('send', receive); 9 | emitter.emit('send'); 10 | expect(receive).toHaveBeenCalledWith(); 11 | 12 | receive.reset(); 13 | emitter.emit('send', 1); 14 | expect(receive).toHaveBeenCalledWith(1); 15 | }); 16 | 17 | it('should on() and off()', function() { 18 | var receive = jasmine.createSpy('receive'); 19 | var emitter = new Emitter(); 20 | emitter.on('send', receive); 21 | 22 | emitter.emit('send'); 23 | expect(receive).toHaveBeenCalledWith(); 24 | 25 | emitter.off('send', receive); 26 | receive.reset(); 27 | emitter.emit('send'); 28 | expect(receive).not.toHaveBeenCalled(); 29 | }); 30 | 31 | it('should on() and off() with multiple listeners', function() { 32 | var receive = jasmine.createSpy('receive'); 33 | var receive2 = jasmine.createSpy('receive2'); 34 | var emitter = new Emitter(); 35 | emitter.on('send', receive); 36 | emitter.on('send', receive2); 37 | emitter.emit('send', 2); 38 | 39 | expect(receive).toHaveBeenCalledWith(2); 40 | expect(receive2).toHaveBeenCalledWith(2); 41 | 42 | emitter.off('send', receive2); 43 | receive.reset(); 44 | receive2.reset(); 45 | 46 | emitter.emit('send'); 47 | expect(receive).toHaveBeenCalledWith(); 48 | expect(receive2).not.toHaveBeenCalled(); 49 | }); 50 | 51 | it('should once()', function() { 52 | var receive = jasmine.createSpy('receive'); 53 | var emitter = new Emitter(); 54 | emitter.once('send', receive); 55 | emitter.emit('send'); 56 | expect(receive).toHaveBeenCalledWith(); 57 | receive.reset(); 58 | emitter.emit('send'); 59 | expect(receive).not.toHaveBeenCalled(); 60 | }); 61 | 62 | it('should off() all events for a type', function() { 63 | var receive = jasmine.createSpy('receive'); 64 | var receive2 = jasmine.createSpy('receive2'); 65 | var emitter = new Emitter(); 66 | emitter.on('send', receive); 67 | emitter.on('send', receive2); 68 | emitter.off('send'); 69 | 70 | emitter.emit('send'); 71 | expect(receive).not.toHaveBeenCalledWith(); 72 | expect(receive2).not.toHaveBeenCalled(); 73 | }); 74 | 75 | it('should off() all events', function() { 76 | var receive = jasmine.createSpy('receive'); 77 | var receive2 = jasmine.createSpy('receive2'); 78 | var emitter = new Emitter(); 79 | emitter.on('send1', receive); 80 | emitter.on('send2', receive2); 81 | emitter.off(); 82 | 83 | emitter.emit('send1'); 84 | emitter.emit('send2'); 85 | 86 | expect(receive).not.toHaveBeenCalledWith(); 87 | expect(receive2).not.toHaveBeenCalled(); 88 | }); 89 | 90 | }); 91 | -------------------------------------------------------------------------------- /www/lib/firebase-simple-login/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase-simple-login", 3 | "description": "Firebase Simple Login web client", 4 | "version": "1.6.3", 5 | "authors": [ 6 | "Firebase (https://www.firebase.com/)" 7 | ], 8 | "homepage": "https://github.com/firebase/firebase-simple-login/", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/firebase/firebase-simple-login.git" 12 | }, 13 | "license": "MIT", 14 | "keywords": [ 15 | "login", 16 | "email", 17 | "password", 18 | "realtime", 19 | "Firebase", 20 | "websocket", 21 | "authentication", 22 | "synchronization" 23 | ], 24 | "main": "firebase-simple-login.js", 25 | "ignore": [ 26 | "**/.*", 27 | "js/", 28 | "lib/", 29 | "node_modules/", 30 | "bower_components/", 31 | "firebase-simple-login-java/", 32 | "firebase-simple-login-objc/", 33 | "bower.json", 34 | "release.sh", 35 | "Gruntfile.js", 36 | "package.json", 37 | "CONTRIBUTING.md" 38 | ], 39 | "dependencies": { 40 | "firebase": "1.0.x" 41 | }, 42 | "devDependencies": { 43 | "jasmine": "2.0.x", 44 | "jquery": "2.1.x" 45 | }, 46 | "_release": "1.6.3", 47 | "_resolution": { 48 | "type": "version", 49 | "tag": "v1.6.3", 50 | "commit": "ca9b28c20fb1308788d164b6032e8eae532dba32" 51 | }, 52 | "_source": "git://github.com/firebase/firebase-simple-login.git", 53 | "_target": "1.6.x", 54 | "_originalSource": "firebase-simple-login" 55 | } -------------------------------------------------------------------------------- /www/lib/firebase-simple-login/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | v1.6.3 2 | ------------- 3 | Release Date: 2014-08-15 4 | 5 | * The callback argument for `createUser()`, `changePassword()`, `sendPasswordResetEmail()`, and `removeUser()` is now optional. 6 | * Fixed issue where we accidentally formatted error messages twice resulting in wrong error messages. 7 | * Fixed bug where we assumed a script tag existed for the JSONP transport. 8 | * Removed `displayName` from the anonymous authentication user payload. 9 | 10 | v1.6.2 11 | ------------- 12 | Release Date: 2014-07-18 13 | 14 | * Fixed bug in PhoneGap, Trigger.io, and Windows Metro transports which caused response payloads with an "&" in them to be improperly handled, resulting in an "UNKNOWN ERROR". 15 | 16 | v1.6.1 17 | ------------- 18 | Release Date: 2014-06-20 19 | 20 | * Add (internal) option to keep pop-up window alive after communicating reply to opener. 21 | * Fixed issue where we accidentally formatted error messages twice resulting in wrong error messages. 22 | 23 | v1.6.0 24 | ------------- 25 | Release Date: 2014-06-12 26 | 27 | * NOTE: This update modifies the Firebase Simple Login persistence, so updating to this version will have the effect 28 | of blowing away your users' existing, persisted sessions. 29 | * Remove dependency on cookies / SJCL to better support the PhoneGap / Cordova environments. 30 | * Increase the PhoneGap / Cordova InAppBrowser timeout from 40 to 120 seconds (thanks @VishalRJoshi). 31 | 32 | v1.5.0 33 | ------------- 34 | Release Date: 2014-06-02 35 | 36 | * Persona provider officially removed 37 | 38 | v1.4.1 39 | ------------- 40 | Release Date: 2014-04-29 41 | 42 | * Add Persona provider deprecation warning (will be removed on 2014-06-02) 43 | 44 | v1.4.0 45 | ------------- 46 | Release Date: 2014-04-17 47 | 48 | * Fixes issue with cross-domain XHR in IE9 49 | * Return Promises/A+ standards-compliant promises (using RSVP) from all asynchronous login / user management methods 50 | * Expose `FirebaseSimpleLogin.VERSION` attribute in the client for programmatic detection 51 | 52 | v1.3.2 53 | ------------- 54 | Release Date: 2014-03-30 55 | 56 | * Fixes issue with session persistence ([#22](https://github.com/firebase/firebase-simple-login/issues/22)) 57 | 58 | v1.3.1 59 | ------------- 60 | Release Date: 2014-03-29 61 | 62 | * Add support for `isTemporaryPassword` flag when logging in using the email / password provider ([#17](https://github.com/firebase/firebase-simple-login/issues/17)) 63 | * Reduce filesize by using a custom XHR integration ([#13](https://github.com/firebase/firebase-simple-login/issues/13)) 64 | 65 | v1.3.0 66 | ------------- 67 | Release Date: 2014-02-28 68 | 69 | * Add support for Google / Google+ authentication ([#1](https://github.com/firebase/firebase-simple-login/issues/1)) 70 | * Enable automatic redirect-based OAuth for iOS standalone apps, Chrome on iOS, and the Twitter / Facebook iOS preview panes ([#7](https://github.com/firebase/firebase-simple-login/issues/7)) 71 | * Enable optional redirect-based OAuth via the `preferRedirect: true` flag for all OAuth-based `.login(...)` methods ([#10](https://github.com/firebase/firebase-simple-login/issues/10)) 72 | * Support extra options for Mozilla Persona login ([#8](https://github.com/firebase/firebase-simple-login/issues/8)) 73 | 74 | v1.2.5 75 | ------------- 76 | Release Date: 2014-02-05 77 | 78 | * Fix bug impacting persisting sessions across page refreshes 79 | 80 | v1.2.4 81 | ------------- 82 | Release Date: 2014-02-05 83 | 84 | * Adds support for Windows Metro applications via WebAuthenticationBroker 85 | 86 | v1.2.3 87 | ------------- 88 | Release Date: 2014-01-27 89 | 90 | * Fix intermittent eventing issues with multiple clients on a single page 91 | 92 | v1.2.2 93 | ------------- 94 | Release Date: 2014-01-24 95 | 96 | * Fix [#5 - sessionLengthDays not used when setting the session in attemptAuth](https://github.com/firebase/firebase-simple-login/issues/5) 97 | 98 | v1.2.1 99 | ------------- 100 | Release Date: 2014-01-19 101 | 102 | * Fix [#4 - Persona not working](https://github.com/firebase/firebase-simple-login/pull/4) 103 | 104 | v1.2.0 105 | ------------- 106 | Release Date: 2014-01-15 107 | 108 | * Add support for password resets (see [https://www.firebase.com/docs/javascript/simplelogin/sendpasswordresetemail.html](https://www.firebase.com/docs/javascript/simplelogin/sendpasswordresetemail.html)) 109 | -------------------------------------------------------------------------------- /www/lib/firebase-simple-login/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2014 Firebase 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | of the Software, and to permit persons to whom the Software is furnished to do 10 | so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /www/lib/firebase-simple-login/README.md: -------------------------------------------------------------------------------- 1 | # Firebase Simple Login - Web Client 2 | 3 | [![GitHub version](https://badge.fury.io/gh/firebase%2Ffirebase-simple-login.svg)](http://badge.fury.io/gh/firebase%2Ffirebase-simple-login) 4 | [![Build Status](https://api.travis-ci.org/firebase/firebase-simple-login.svg?branch=master)](https://travis-ci.org/firebase/firebase-simple-login) 5 | [![Dependency Status](https://gemnasium.com/firebase/firebase-simple-login.png)](https://gemnasium.com/firebase/firebase-simple-login) 6 | 7 | Firebase Simple Login is a simple, easy-to-use authentication service built on top of 8 | [Firebase Custom Login](https://www.firebase.com/docs/web/guide/simple-login/custom.html), 9 | allowing you to authenticate users without any server-side code. 10 | 11 | Firebase Simple Login offers several types of authentication: email/password, anonymous, and 12 | third-party integration with Facebook, GitHub, Google, and Twitter. It allows you to authenticate 13 | your users without having to manually store authentication credentials or run a server. 14 | 15 | 16 | ## Installation 17 | 18 | In order to use Firebase Simple Login in your project, you need to include the following files 19 | in your HTML: 20 | 21 | ```html 22 | 23 | 24 | 25 | 26 | 27 | ``` 28 | 29 | Use the URL above to download both the minified (`firebase-simple-login.js`) and non-minified 30 | (`firebase-simple-login-debug.js`) versions of Firebase Simple Login from the Firebase CDN. 31 | 32 | The only dependency is the Firebase web client, which is also available on the Firebase CDN 33 | using the above URL. Alternatively, you can download the latest client version from the 34 | [Firebase developer documentation](https://www.firebase.com/docs/web/). 35 | 36 | You can also install Firebase Simple Login via Bower and its dependencies will be downloaded 37 | automatically: 38 | 39 | ```bash 40 | $ bower install firebase-simple-login --save 41 | ``` 42 | 43 | ## Getting Started with Firebase 44 | 45 | Firebase Simple Login requires Firebase in order to authenticate your users. You can 46 | [sign up here for a free account](https://www.firebase.com/signup/). 47 | 48 | 49 | ## Documentation & API Reference 50 | 51 | You can read through [the complete documentation](https://www.firebase.com/docs/web/guide/user-auth.html) 52 | as well as [the full API reference](https://www.firebase.com/docs/web/api/firebasesimplelogin/) 53 | in the Firebase developer documentation. 54 | 55 | 56 | ## Configuration 57 | 58 | Before adding authentication to your application, you need enable the authentication providers 59 | you want to use. You can do this from the "Simple Login" tab in your Firebase's Dashboard, at 60 | `https://.firebaseio.com`. From there you can enable/disable authentication 61 | providers, setup OAuth credentials, and configure valid OAuth request origins. 62 | 63 | Our developer documentation contains more information about how to 64 | [configure each of the authentication providers](https://www.firebase.com/docs/web/guide/user-auth.html#section-providers). 65 | 66 | 67 | ## Usage 68 | 69 | Start monitoring user authentication state in your application by instantiating 70 | the Firebase Simple Login client with a Firebase reference and a callback. 71 | 72 | This `function(error, user)` callback will be invoked once after instantiation, 73 | and again every time the user's authentication state changes: 74 | 75 | ```javascript 76 | var ref = new Firebase('https://.firebaseio.com'); 77 | var auth = new FirebaseSimpleLogin(ref, function(error, user) { 78 | if (error) { 79 | console.log('Authentication error: ', error); 80 | } else if (user) { 81 | console.log('User ' + user.id + ' authenticated via the ' + user.provider + ' provider!'); 82 | } else { 83 | console.log("User is logged out.") 84 | } 85 | }); 86 | ``` 87 | 88 | If the user is logged out, try authenticating using the provider of your choice: 89 | 90 | ```javascript 91 | auth.login(''); // 'password', 'anonymous', 'facebook', 'github', etc. 92 | ``` 93 | 94 | You can read through [the complete documentation](https://www.firebase.com/docs/web/guide/user-auth.html) 95 | as well as [the full API reference](https://www.firebase.com/docs/web/api/firebasesimplelogin/) 96 | in the Firebase developer documentation. 97 | 98 | 99 | ## Contributing 100 | 101 | Firebase Simple Login is an open-source project and we welcome contributions to the library. 102 | Please read the [Contribution Guidelines](./CONTRIBUTING.md) in addition to following the steps 103 | below. 104 | 105 | If you'd like to contribute to Firebase Simple Login, you'll need to run the following commands 106 | to get your environment set up: 107 | 108 | ```bash 109 | $ git clone https://github.com/firebase/firebase-simple-login.git 110 | $ cd firebase-simple-login # go to the firebase-simple-login directory 111 | $ git submodule update --init lib/ # update the Google Closure library submodule 112 | $ npm install -g grunt-cli # globally install gulp task runner 113 | $ npm install -g bower # globally install Bower package manager 114 | $ npm install -g phantomjs # globally install PhantomJS test framework 115 | $ npm install -g casperjs # globally install CasperJS test framework 116 | $ npm install # install local npm build / test dependencies 117 | $ bower install # install local JavaScript dependencies 118 | ``` 119 | 120 | The source files are located at `/js/src/simple-login/`. Once you've made a change in one of 121 | those files, run `grunt build` to generate the distribution files `firebase-simple-login.js` 122 | and `firebase-simple-login-debug.js` which can be found at the root of this repository. 123 | 124 | You can run the test suite via the command line by running `grunt test`. This will run both 125 | the Jasmine and Casper test suites. If you just want to run one, use `grunt test:jasmine` or 126 | `grunt test:casper`. 127 | 128 | You can also run the Jasmine test suite from within the browser. You first need to spin up a 129 | local server: 130 | 131 | ```bash 132 | $ python -m SimpleHTTPServer 7070 133 | ``` 134 | 135 | Then, navigate to `http://localhost:7070/js/test/jasmine/index.html` and the test suite will 136 | start automatically. 137 | -------------------------------------------------------------------------------- /www/lib/firebase/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase", 3 | "version": "1.0.21", 4 | "homepage": "https://firebase.com", 5 | "authors": [ 6 | "Firebase " 7 | ], 8 | "description": "Firebase Web Client", 9 | "main": "firebase.js", 10 | "keywords": [ 11 | "Firebase", 12 | "synchronization", 13 | "real-time", 14 | "websocket" 15 | ], 16 | "license": "MIT", 17 | "private": false, 18 | "ignore": [ 19 | "**/.*", 20 | "node_modules", 21 | "bower_components", 22 | "test", 23 | "tests" 24 | ], 25 | "_release": "1.0.21", 26 | "_resolution": { 27 | "type": "version", 28 | "tag": "v1.0.21", 29 | "commit": "e7feeb9b49eb9794cc57de423919816259a45d5f" 30 | }, 31 | "_source": "git://github.com/firebase/firebase-bower.git", 32 | "_target": "1.0.x", 33 | "_originalSource": "firebase" 34 | } -------------------------------------------------------------------------------- /www/lib/firebase/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2014 Firebase 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /www/lib/firebase/README.md: -------------------------------------------------------------------------------- 1 | firebase-bower 2 | ============== 3 | 4 | Firebase Bower 5 | -------------------------------------------------------------------------------- /www/lib/firebase/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase", 3 | "version": "1.0.21", 4 | "homepage": "https://firebase.com", 5 | "authors": [ 6 | "Firebase " 7 | ], 8 | "description": "Firebase Web Client", 9 | "main": "firebase.js", 10 | "keywords": [ 11 | "Firebase", 12 | "synchronization", 13 | "real-time", 14 | "websocket" 15 | ], 16 | "license": "MIT", 17 | "private": false, 18 | "ignore": [ 19 | "**/.*", 20 | "node_modules", 21 | "bower_components", 22 | "test", 23 | "tests" 24 | ] 25 | } -------------------------------------------------------------------------------- /www/lib/ionic/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic", 3 | "version": "1.0.0-beta.12", 4 | "codename": "krypton-koala", 5 | "homepage": "https://github.com/driftyco/ionic", 6 | "authors": [ 7 | "Max Lynch ", 8 | "Adam Bradley ", 9 | "Ben Sperry " 10 | ], 11 | "description": "Advanced HTML5 hybrid mobile app development framework.", 12 | "main": [ 13 | "css/ionic.css", 14 | "fonts/*", 15 | "js/ionic.js", 16 | "js/ionic-angular.js" 17 | ], 18 | "keywords": [ 19 | "mobile", 20 | "html5", 21 | "ionic", 22 | "cordova", 23 | "phonegap", 24 | "trigger", 25 | "triggerio", 26 | "angularjs", 27 | "angular" 28 | ], 29 | "license": "MIT", 30 | "private": false, 31 | "dependencies": { 32 | "angular": "~1.2.17", 33 | "angular-animate": "~1.2.17", 34 | "angular-sanitize": "~1.2.17", 35 | "angular-ui-router": "0.2.10", 36 | "collide": "1.0.0-beta.1" 37 | }, 38 | "_release": "1.0.0-beta.12", 39 | "_resolution": { 40 | "type": "version", 41 | "tag": "v1.0.0-beta.12", 42 | "commit": "e1fee0fbab52f6137c1d3da74a94d56e19fbaa6f" 43 | }, 44 | "_source": "git://github.com/driftyco/ionic-bower.git", 45 | "_target": "1.0.0-beta.12", 46 | "_originalSource": "driftyco/ionic-bower" 47 | } -------------------------------------------------------------------------------- /www/lib/ionic/README.md: -------------------------------------------------------------------------------- 1 | # ionic-bower 2 | 3 | Bower repository for [Ionic Framework](http://github.com/driftyco/ionic) 4 | 5 | ### Usage 6 | 7 | Include `js/ionic.bundle.js` to get ionic and all of its dependencies. 8 | 9 | Alternatively, include the individual ionic files with the dependencies separately. 10 | 11 | ### Versions 12 | 13 | To install the latest stable version, `bower install driftyco/ionic-bower` 14 | 15 | To install the latest nightly release, `bower install driftyco/ionic-bower#master` 16 | -------------------------------------------------------------------------------- /www/lib/ionic/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ionic", 3 | "version": "1.0.0-beta.12", 4 | "codename": "krypton-koala", 5 | "homepage": "https://github.com/driftyco/ionic", 6 | "authors": [ 7 | "Max Lynch ", 8 | "Adam Bradley ", 9 | "Ben Sperry " 10 | ], 11 | "description": "Advanced HTML5 hybrid mobile app development framework.", 12 | "main": [ 13 | "css/ionic.css", 14 | "fonts/*", 15 | "js/ionic.js", 16 | "js/ionic-angular.js" 17 | ], 18 | "keywords": [ 19 | "mobile", 20 | "html5", 21 | "ionic", 22 | "cordova", 23 | "phonegap", 24 | "trigger", 25 | "triggerio", 26 | "angularjs", 27 | "angular" 28 | ], 29 | "license": "MIT", 30 | "private": false, 31 | "dependencies": { 32 | "angular": "~1.2.17", 33 | "angular-animate": "~1.2.17", 34 | "angular-sanitize": "~1.2.17", 35 | "angular-ui-router": "0.2.10", 36 | "collide": "1.0.0-beta.1" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /www/lib/ionic/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionic-in-action/ionic-demo-resort-app/45ffed0175699c674b7aa88379513a9dff68c320/www/lib/ionic/fonts/ionicons.eot -------------------------------------------------------------------------------- /www/lib/ionic/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionic-in-action/ionic-demo-resort-app/45ffed0175699c674b7aa88379513a9dff68c320/www/lib/ionic/fonts/ionicons.ttf -------------------------------------------------------------------------------- /www/lib/ionic/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ionic-in-action/ionic-demo-resort-app/45ffed0175699c674b7aa88379513a9dff68c320/www/lib/ionic/fonts/ionicons.woff -------------------------------------------------------------------------------- /www/lib/ionic/scss/_action-sheet.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Action Sheets 3 | * -------------------------------------------------- 4 | */ 5 | 6 | .action-sheet-backdrop { 7 | @include transition(background-color 300ms ease-in-out); 8 | position: fixed; 9 | top: 0; 10 | left: 0; 11 | z-index: $z-index-action-sheet; 12 | width: 100%; 13 | height: 100%; 14 | background-color: rgba(0,0,0,0); 15 | 16 | &.active { 17 | background-color: rgba(0,0,0,0.5); 18 | } 19 | } 20 | 21 | .action-sheet-wrapper { 22 | @include translate3d(0, 100%, 0); 23 | @include transition(all ease-in-out 300ms); 24 | position: absolute; 25 | bottom: 0; 26 | width: 100%; 27 | } 28 | 29 | .action-sheet-up { 30 | @include translate3d(0, 0, 0); 31 | } 32 | 33 | .action-sheet { 34 | margin-left: 15px; 35 | margin-right: 15px; 36 | width: auto; 37 | z-index: $z-index-action-sheet; 38 | overflow: hidden; 39 | 40 | .button { 41 | display: block; 42 | padding: 1px; 43 | width: 100%; 44 | border-radius: 0; 45 | 46 | background-color: transparent; 47 | 48 | color: $positive; 49 | font-size: 18px; 50 | 51 | &.destructive { 52 | color: $assertive; 53 | } 54 | } 55 | } 56 | 57 | .action-sheet-title { 58 | padding: 10px; 59 | color: lighten($base-color, 40%); 60 | text-align: center; 61 | font-size: 12px; 62 | } 63 | 64 | .action-sheet-group { 65 | margin-bottom: 5px; 66 | border-radius: $sheet-border-radius; 67 | background-color: #fff; 68 | .button { 69 | border-width: 1px 0px 0px 0px; 70 | border-radius: 0; 71 | 72 | &.active { 73 | background-color: transparent; 74 | color: inherit; 75 | } 76 | } 77 | .button:first-child:last-child { 78 | border-width: 0; 79 | } 80 | } 81 | 82 | .action-sheet-open { 83 | pointer-events: none; 84 | 85 | &.modal-open .modal { 86 | pointer-events: none; 87 | } 88 | 89 | .action-sheet-backdrop { 90 | pointer-events: auto; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /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: rgba(0,0,0,0.4); 12 | 13 | visibility: hidden; 14 | opacity: 0; 15 | 16 | &.visible { 17 | visibility: visible; 18 | } 19 | &.active { 20 | opacity: 1; 21 | } 22 | 23 | @include transition(0.1s opacity linear); 24 | } 25 | -------------------------------------------------------------------------------- /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/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: 2px 0px 0px 2px; 49 | } 50 | &:last-child { 51 | border-right-width: 1px; 52 | border-radius: 0px 2px 2px 0px; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_button.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Buttons 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .button { 8 | // set the color defaults 9 | @include button-style($button-default-bg, $button-default-border, $button-default-active-bg, $button-default-active-border, $button-default-text); 10 | 11 | position: relative; 12 | display: inline-block; 13 | margin: 0; 14 | padding: 0 $button-padding; 15 | 16 | min-width: ($button-padding * 3) + $button-font-size; 17 | min-height: $button-height + 5px; 18 | 19 | border-width: $button-border-width; 20 | border-style: solid; 21 | border-radius: $button-border-radius; 22 | 23 | vertical-align: top; 24 | text-align: center; 25 | 26 | text-overflow: ellipsis; 27 | font-size: $button-font-size; 28 | line-height: $button-height - $button-border-width + 1px; 29 | 30 | cursor: pointer; 31 | 32 | &:after { 33 | // used to create a larger button "hit" area 34 | position: absolute; 35 | top: -6px; 36 | right: -6px; 37 | bottom: -6px; 38 | left: -6px; 39 | content: ' '; 40 | } 41 | 42 | .icon { 43 | vertical-align: top; 44 | pointer-events: none; 45 | } 46 | 47 | .icon:before, 48 | &.icon:before, 49 | &.icon-left:before, 50 | &.icon-right:before { 51 | display: inline-block; 52 | padding: 0 0 $button-border-width 0; 53 | vertical-align: inherit; 54 | font-size: $button-icon-size; 55 | line-height: $button-height - $button-border-width; 56 | pointer-events: none; 57 | } 58 | &.icon-left:before { 59 | float: left; 60 | padding-right: .2em; 61 | padding-left: 0; 62 | } 63 | &.icon-right:before { 64 | float: right; 65 | padding-right: 0; 66 | padding-left: .2em; 67 | } 68 | 69 | &.button-block, &.button-full { 70 | margin-top: $button-block-margin; 71 | margin-bottom: $button-block-margin; 72 | } 73 | 74 | &.button-light { 75 | @include button-style($button-light-bg, $button-light-border, $button-light-active-bg, $button-light-active-border, $button-light-text); 76 | @include button-clear($button-light-border); 77 | @include button-outline($button-light-border); 78 | } 79 | 80 | &.button-stable { 81 | @include button-style($button-stable-bg, $button-stable-border, $button-stable-active-bg, $button-stable-active-border, $button-stable-text); 82 | @include button-clear($button-stable-border); 83 | @include button-outline($button-stable-border); 84 | } 85 | 86 | &.button-positive { 87 | @include button-style($button-positive-bg, $button-positive-border, $button-positive-active-bg, $button-positive-active-border, $button-positive-text); 88 | @include button-clear($button-positive-bg); 89 | @include button-outline($button-positive-bg); 90 | } 91 | 92 | &.button-calm { 93 | @include button-style($button-calm-bg, $button-calm-border, $button-calm-active-bg, $button-calm-active-border, $button-calm-text); 94 | @include button-clear($button-calm-bg); 95 | @include button-outline($button-calm-bg); 96 | } 97 | 98 | &.button-assertive { 99 | @include button-style($button-assertive-bg, $button-assertive-border, $button-assertive-active-bg, $button-assertive-active-border, $button-assertive-text); 100 | @include button-clear($button-assertive-bg); 101 | @include button-outline($button-assertive-bg); 102 | } 103 | 104 | &.button-balanced { 105 | @include button-style($button-balanced-bg, $button-balanced-border, $button-balanced-active-bg, $button-balanced-active-border, $button-balanced-text); 106 | @include button-clear($button-balanced-bg); 107 | @include button-outline($button-balanced-bg); 108 | } 109 | 110 | &.button-energized { 111 | @include button-style($button-energized-bg, $button-energized-border, $button-energized-active-bg, $button-energized-active-border, $button-energized-text); 112 | @include button-clear($button-energized-bg); 113 | @include button-outline($button-energized-bg); 114 | } 115 | 116 | &.button-royal { 117 | @include button-style($button-royal-bg, $button-royal-border, $button-royal-active-bg, $button-royal-active-border, $button-royal-text); 118 | @include button-clear($button-royal-bg); 119 | @include button-outline($button-royal-bg); 120 | } 121 | 122 | &.button-dark { 123 | @include button-style($button-dark-bg, $button-dark-border, $button-dark-active-bg, $button-dark-active-border, $button-dark-text); 124 | @include button-clear($button-dark-bg); 125 | @include button-outline($button-dark-bg); 126 | } 127 | } 128 | 129 | .button-small { 130 | padding: 2px $button-small-padding 1px; 131 | min-width: $button-small-height; 132 | min-height: $button-small-height + 2; 133 | font-size: $button-small-font-size; 134 | line-height: $button-small-height - $button-border-width - 1; 135 | 136 | .icon:before, 137 | &.icon:before, 138 | &.icon-left:before, 139 | &.icon-right:before { 140 | font-size: $button-small-icon-size; 141 | line-height: $button-small-icon-size + 3; 142 | margin-top: 3px; 143 | } 144 | } 145 | 146 | .button-large { 147 | padding: 0 $button-large-padding; 148 | min-width: ($button-large-padding * 3) + $button-large-font-size; 149 | min-height: $button-large-height + 5; 150 | font-size: $button-large-font-size; 151 | line-height: $button-large-height - $button-border-width; 152 | 153 | .icon:before, 154 | &.icon:before, 155 | &.icon-left:before, 156 | &.icon-right:before { 157 | padding-bottom: ($button-border-width * 2); 158 | font-size: $button-large-icon-size; 159 | line-height: $button-large-height - ($button-border-width * 2) - 1; 160 | } 161 | } 162 | 163 | .button-icon { 164 | @include transition(opacity .1s); 165 | padding: 0 6px; 166 | min-width: initial; 167 | border-color: transparent; 168 | background: none; 169 | 170 | &.button.active, 171 | &.button.activated { 172 | border-color: transparent; 173 | background: none; 174 | box-shadow: none; 175 | opacity: 0.3; 176 | } 177 | 178 | .icon:before, 179 | &.icon:before { 180 | font-size: $button-large-icon-size; 181 | } 182 | } 183 | 184 | .button-clear { 185 | @include button-clear($button-default-border); 186 | @include transition(opacity .1s); 187 | padding: 0 $button-clear-padding; 188 | max-height: $button-height; 189 | border-color: transparent; 190 | background: none; 191 | box-shadow: none; 192 | 193 | &.active, 194 | &.activated { 195 | opacity: 0.3; 196 | } 197 | } 198 | 199 | .button-outline { 200 | @include button-outline($button-default-border); 201 | @include transition(opacity .1s); 202 | background: none; 203 | box-shadow: none; 204 | } 205 | 206 | .padding > .button.button-block:first-child { 207 | margin-top: 0; 208 | } 209 | 210 | .button-block { 211 | display: block; 212 | clear: both; 213 | 214 | &:after { 215 | clear: both; 216 | } 217 | } 218 | 219 | .button-full, 220 | .button-full > .button { 221 | display: block; 222 | margin-right: 0; 223 | margin-left: 0; 224 | border-right-width: 0; 225 | border-left-width: 0; 226 | border-radius: 0; 227 | } 228 | 229 | button.button-block, 230 | button.button-full, 231 | .button-full > button.button, 232 | input.button.button-block { 233 | width: 100%; 234 | } 235 | 236 | a.button { 237 | text-decoration: none; 238 | 239 | .icon:before, 240 | &.icon:before, 241 | &.icon-left:before, 242 | &.icon-right:before { 243 | margin-top: 2px; 244 | } 245 | } 246 | 247 | .button.disabled, 248 | .button[disabled] { 249 | opacity: .4; 250 | cursor: default !important; 251 | pointer-events: none; 252 | } 253 | -------------------------------------------------------------------------------- /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); 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); 18 | } 19 | .checkbox-stable { 20 | @include checkbox-style($checkbox-off-border-stable, $checkbox-on-bg-stable); 21 | } 22 | .checkbox-positive { 23 | @include checkbox-style($checkbox-off-border-positive, $checkbox-on-bg-positive); 24 | } 25 | .checkbox-calm { 26 | @include checkbox-style($checkbox-off-border-calm, $checkbox-on-bg-calm); 27 | } 28 | .checkbox-assertive { 29 | @include checkbox-style($checkbox-off-border-assertive, $checkbox-on-bg-assertive); 30 | } 31 | .checkbox-balanced { 32 | @include checkbox-style($checkbox-off-border-balanced, $checkbox-on-bg-balanced); 33 | } 34 | .checkbox-energized{ 35 | @include checkbox-style($checkbox-off-border-energized, $checkbox-on-bg-energized); 36 | } 37 | .checkbox-royal { 38 | @include checkbox-style($checkbox-off-border-royal, $checkbox-on-bg-royal); 39 | } 40 | .checkbox-dark { 41 | @include checkbox-style($checkbox-off-border-dark, $checkbox-on-bg-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 | 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: 30%; 96 | left: 26%; 97 | display: table; 98 | width: ($checkbox-width / 2) + 1; 99 | height: ($checkbox-width / 3) + 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 | .grade-c .checkbox input:after, 108 | .grade-c .checkbox-icon:after { 109 | @include rotate(0); 110 | top: 3px; 111 | left: 4px; 112 | border: none; 113 | color: $checkbox-check-color; 114 | content: '\2713'; 115 | font-weight: bold; 116 | font-size: 20px; 117 | } 118 | 119 | // what the checkmark looks like when its checked 120 | .checkbox input:checked:after, 121 | input:checked + .checkbox-icon:after { 122 | opacity: 1; 123 | } 124 | 125 | // make sure item content have enough padding on left to fit the checkbox 126 | .item-checkbox { 127 | padding-left: ($item-padding * 2) + $checkbox-width; 128 | 129 | &.active { 130 | box-shadow: none; 131 | } 132 | } 133 | 134 | // position the checkbox to the left within an item 135 | .item-checkbox .checkbox { 136 | position: absolute; 137 | top: 50%; 138 | right: $item-padding / 2; 139 | left: $item-padding / 2; 140 | z-index: $z-index-item-checkbox; 141 | margin-top: (($checkbox-height + ($checkbox-height / 2)) / 2) * -1; 142 | } 143 | 144 | 145 | .item-checkbox.item-checkbox-right { 146 | padding-right: ($item-padding * 2) + $checkbox-width; 147 | padding-left: $item-padding; 148 | } 149 | 150 | .item-checkbox-right .checkbox input, 151 | .item-checkbox-right .checkbox-icon { 152 | float: right; 153 | } -------------------------------------------------------------------------------- /www/lib/ionic/scss/_form.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Forms 3 | * -------------------------------------------------- 4 | */ 5 | 6 | // Make all forms have space below them 7 | form { 8 | margin: 0 0 $line-height-base; 9 | } 10 | 11 | // Groups of fields with labels on top (legends) 12 | legend { 13 | display: block; 14 | margin-bottom: $line-height-base; 15 | padding: 0; 16 | width: 100%; 17 | border: $input-border-width solid $input-border; 18 | color: $dark; 19 | font-size: $font-size-base * 1.5; 20 | line-height: $line-height-base * 2; 21 | 22 | small { 23 | color: $stable; 24 | font-size: $line-height-base * .75; 25 | } 26 | } 27 | 28 | // Set font for forms 29 | label, 30 | input, 31 | button, 32 | select, 33 | textarea { 34 | @include font-shorthand($font-size-base, normal, $line-height-base); // Set size, weight, line-height here 35 | } 36 | input, 37 | button, 38 | select, 39 | textarea { 40 | font-family: $font-family-base; // And only set font-family here for those that need it (note the missing label element) 41 | } 42 | 43 | 44 | // Input List 45 | // ------------------------------- 46 | 47 | .item-input { 48 | @include display-flex(); 49 | @include align-items(center); 50 | position: relative; 51 | overflow: hidden; 52 | padding: 6px 0 5px 16px; 53 | 54 | input { 55 | @include border-radius(0); 56 | @include flex(1, 0, 220px); 57 | @include appearance(none); 58 | margin: 0; 59 | padding-right: 24px; 60 | background-color: transparent; 61 | } 62 | 63 | .button .icon { 64 | @include flex(0, 0, 24px); 65 | position: static; 66 | display: inline-block; 67 | height: auto; 68 | text-align: center; 69 | font-size: 16px; 70 | } 71 | 72 | .button-bar { 73 | @include border-radius(0); 74 | @include flex(1, 0, 220px); 75 | @include appearance(none); 76 | } 77 | 78 | .icon { 79 | min-width: 14px; 80 | } 81 | } 82 | 83 | .item-input-inset { 84 | @include display-flex(); 85 | @include align-items(center); 86 | position: relative; 87 | overflow: hidden; 88 | padding: ($item-padding / 3) * 2; 89 | } 90 | 91 | .item-input-wrapper { 92 | @include display-flex(); 93 | @include flex(1, 0); 94 | @include align-items(center); 95 | @include border-radius(4px); 96 | padding-right: 8px; 97 | padding-left: 8px; 98 | background: #eee; 99 | } 100 | 101 | .item-input-inset .item-input-wrapper input { 102 | padding-left: 4px; 103 | height: 29px; 104 | background: transparent; 105 | line-height: 18px; 106 | } 107 | 108 | .item-input-wrapper ~ .button { 109 | margin-left: ($item-padding / 3) * 2; 110 | } 111 | 112 | .input-label { 113 | @include flex(1, 0, 100px); 114 | display: table; 115 | padding: 7px 10px 7px 0px; 116 | max-width: 200px; 117 | width: 35%; 118 | color: $input-label-color; 119 | font-size: 16px; 120 | } 121 | 122 | .placeholder-icon { 123 | color: #aaa; 124 | &:first-child { 125 | padding-right: 6px; 126 | } 127 | &:last-child { 128 | padding-left: 6px; 129 | } 130 | } 131 | 132 | .item-stacked-label { 133 | display: block; 134 | background-color: transparent; 135 | box-shadow: none; 136 | 137 | .input-label, .icon { 138 | display: inline-block; 139 | padding: 4px 0 0 0px; 140 | vertical-align: middle; 141 | } 142 | } 143 | 144 | .item-stacked-label input, 145 | .item-stacked-label textarea { 146 | @include border-radius(2px); 147 | padding: 4px 8px 3px 0; 148 | border: none; 149 | background-color: $input-bg; 150 | } 151 | .item-stacked-label input { 152 | overflow: hidden; 153 | height: $line-height-computed + $font-size-base + 12px; 154 | } 155 | 156 | .item-floating-label { 157 | display: block; 158 | background-color: transparent; 159 | box-shadow: none; 160 | 161 | .input-label { 162 | position: relative; 163 | padding: 5px 0 0 0; 164 | opacity: 0; 165 | top: 10px; 166 | @include transition(opacity .15s ease-in, top .2s linear); 167 | 168 | &.has-input { 169 | opacity: 1; 170 | top: 0; 171 | @include transition(opacity .15s ease-in, top .2s linear); 172 | } 173 | } 174 | } 175 | 176 | 177 | // Form Controls 178 | // ------------------------------- 179 | 180 | // Shared size and type resets 181 | textarea, 182 | input[type="text"], 183 | input[type="password"], 184 | input[type="datetime"], 185 | input[type="datetime-local"], 186 | input[type="date"], 187 | input[type="month"], 188 | input[type="time"], 189 | input[type="week"], 190 | input[type="number"], 191 | input[type="email"], 192 | input[type="url"], 193 | input[type="search"], 194 | input[type="tel"], 195 | input[type="color"] { 196 | display: block; 197 | padding-top: 2px; 198 | padding-left: 0; 199 | height: $line-height-computed + $font-size-base; 200 | color: $input-color; 201 | vertical-align: middle; 202 | font-size: $font-size-base; 203 | line-height: $font-size-base + 2; 204 | } 205 | 206 | .platform-ios, 207 | .platform-android { 208 | input[type="datetime-local"], 209 | input[type="date"], 210 | input[type="month"], 211 | input[type="time"], 212 | input[type="week"] { 213 | padding-top: 8px; 214 | } 215 | } 216 | 217 | input, 218 | textarea { 219 | width: 100%; 220 | } 221 | textarea { 222 | padding-left: 0; 223 | @include placeholder($input-color-placeholder, -3px); 224 | } 225 | 226 | // Reset height since textareas have rows 227 | textarea { 228 | height: auto; 229 | } 230 | 231 | // Everything else 232 | textarea, 233 | input[type="text"], 234 | input[type="password"], 235 | input[type="datetime"], 236 | input[type="datetime-local"], 237 | input[type="date"], 238 | input[type="month"], 239 | input[type="time"], 240 | input[type="week"], 241 | input[type="number"], 242 | input[type="email"], 243 | input[type="url"], 244 | input[type="search"], 245 | input[type="tel"], 246 | input[type="color"] { 247 | border: 0; 248 | } 249 | 250 | // Position radios and checkboxes better 251 | input[type="radio"], 252 | input[type="checkbox"] { 253 | margin: 0; 254 | line-height: normal; 255 | } 256 | 257 | // Reset width of input images, buttons, radios, checkboxes 258 | input[type="file"], 259 | input[type="image"], 260 | input[type="submit"], 261 | input[type="reset"], 262 | input[type="button"], 263 | input[type="radio"], 264 | input[type="checkbox"] { 265 | width: auto; // Override of generic input selector 266 | } 267 | 268 | // Set the height of file to match text inputs 269 | input[type="file"] { 270 | line-height: $input-height-base; 271 | } 272 | 273 | // Text input classes to hide text caret during scroll 274 | .previous-input-focus, 275 | .cloned-text-input + input, 276 | .cloned-text-input + textarea { 277 | position: absolute !important; 278 | left: -9999px; 279 | width: 200px; 280 | } 281 | 282 | 283 | // Placeholder 284 | // ------------------------------- 285 | input, 286 | textarea { 287 | @include placeholder(); 288 | } 289 | 290 | 291 | // DISABLED STATE 292 | // ------------------------------- 293 | 294 | // Disabled and read-only inputs 295 | input[disabled], 296 | select[disabled], 297 | textarea[disabled], 298 | input[readonly]:not(.cloned-text-input), 299 | textarea[readonly]:not(.cloned-text-input), 300 | select[readonly] { 301 | background-color: $input-bg-disabled; 302 | cursor: not-allowed; 303 | } 304 | // Explicitly reset the colors here 305 | input[type="radio"][disabled], 306 | input[type="checkbox"][disabled], 307 | input[type="radio"][readonly], 308 | input[type="checkbox"][readonly] { 309 | background-color: transparent; 310 | } 311 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_grid.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Grid 3 | * -------------------------------------------------- 4 | * Using flexbox for the grid, inspired by Philip Walton: 5 | * http://philipwalton.github.io/solved-by-flexbox/demos/grids/ 6 | * By default each .col within a .row will evenly take up 7 | * available width, and the height of each .col with take 8 | * up the height of the tallest .col in the same .row. 9 | */ 10 | 11 | .row { 12 | @include display-flex(); 13 | padding: ($grid-padding-width / 2); 14 | width: 100%; 15 | } 16 | 17 | .row-wrap { 18 | @include flex-wrap(wrap); 19 | } 20 | 21 | .row + .row { 22 | margin-top: ($grid-padding-width / 2) * -1; 23 | padding-top: 0; 24 | } 25 | 26 | .col { 27 | @include flex(1); 28 | display: block; 29 | padding: ($grid-padding-width / 2); 30 | width: 100%; 31 | } 32 | 33 | 34 | /* Vertically Align Columns */ 35 | /* .row-* vertically aligns every .col in the .row */ 36 | .row-top { 37 | @include align-items(flex-start); 38 | } 39 | .row-bottom { 40 | @include align-items(flex-end); 41 | } 42 | .row-center { 43 | @include align-items(center); 44 | } 45 | .row-stretch { 46 | @include align-items(stretch); 47 | } 48 | .row-baseline { 49 | @include align-items(baseline); 50 | } 51 | 52 | /* .col-* vertically aligns an individual .col */ 53 | .col-top { 54 | @include align-self(flex-start); 55 | } 56 | .col-bottom { 57 | @include align-self(flex-end); 58 | } 59 | .col-center { 60 | @include align-self(center); 61 | } 62 | 63 | /* Column Offsets */ 64 | .col-offset-10 { 65 | margin-left: 10%; 66 | } 67 | .col-offset-20 { 68 | margin-left: 20%; 69 | } 70 | .col-offset-25 { 71 | margin-left: 25%; 72 | } 73 | .col-offset-33, .col-offset-34 { 74 | margin-left: 33.3333%; 75 | } 76 | .col-offset-50 { 77 | margin-left: 50%; 78 | } 79 | .col-offset-66, .col-offset-67 { 80 | margin-left: 66.6666%; 81 | } 82 | .col-offset-75 { 83 | margin-left: 75%; 84 | } 85 | .col-offset-80 { 86 | margin-left: 80%; 87 | } 88 | .col-offset-90 { 89 | margin-left: 90%; 90 | } 91 | 92 | 93 | /* Explicit Column Percent Sizes */ 94 | /* By default each grid column will evenly distribute */ 95 | /* across the grid. However, you can specify individual */ 96 | /* columns to take up a certain size of the available area */ 97 | .col-10 { 98 | @include flex(0, 0, 10%); 99 | max-width: 10%; 100 | } 101 | .col-20 { 102 | @include flex(0, 0, 20%); 103 | max-width: 20%; 104 | } 105 | .col-25 { 106 | @include flex(0, 0, 25%); 107 | max-width: 25%; 108 | } 109 | .col-33, .col-34 { 110 | @include flex(0, 0, 33.3333%); 111 | max-width: 33.3333%; 112 | } 113 | .col-50 { 114 | @include flex(0, 0, 50%); 115 | max-width: 50%; 116 | } 117 | .col-66, .col-67 { 118 | @include flex(0, 0, 66.6666%); 119 | max-width: 66.6666%; 120 | } 121 | .col-75 { 122 | @include flex(0, 0, 75%); 123 | max-width: 75%; 124 | } 125 | .col-80 { 126 | @include flex(0, 0, 80%); 127 | max-width: 80%; 128 | } 129 | .col-90 { 130 | @include flex(0, 0, 90%); 131 | max-width: 90%; 132 | } 133 | 134 | 135 | /* Responsive Grid Classes */ 136 | /* Adding a class of responsive-X to a row */ 137 | /* will trigger the flex-direction to */ 138 | /* change to column and add some margin */ 139 | /* to any columns in the row for clearity */ 140 | 141 | @include responsive-grid-break('.responsive-sm', $grid-responsive-sm-break); 142 | @include responsive-grid-break('.responsive-md', $grid-responsive-md-break); 143 | @include responsive-grid-break('.responsive-lg', $grid-responsive-lg-break); 144 | -------------------------------------------------------------------------------- /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: 0 1px 4px rgba(0, 0, 0, .25); 60 | } 61 | 62 | .padding { 63 | .card, .list-inset { 64 | margin-left: 0; 65 | margin-right: 0; 66 | } 67 | } 68 | 69 | .card .item, 70 | .list-inset .item, 71 | .padding > .list .item 72 | { 73 | &:first-child { 74 | border-top-left-radius: $card-border-radius; 75 | border-top-right-radius: $card-border-radius; 76 | 77 | .item-content { 78 | border-top-left-radius: $card-border-radius; 79 | border-top-right-radius: $card-border-radius; 80 | } 81 | } 82 | &:last-child { 83 | border-bottom-right-radius: $card-border-radius; 84 | border-bottom-left-radius: $card-border-radius; 85 | 86 | .item-content { 87 | border-bottom-right-radius: $card-border-radius; 88 | border-bottom-left-radius: $card-border-radius; 89 | } 90 | } 91 | } 92 | 93 | .card .item:last-child, 94 | .list-inset .item:last-child { 95 | margin-bottom: $item-border-width * -1; 96 | } 97 | 98 | .card .item, 99 | .list-inset .item, 100 | .padding > .list .item, 101 | .padding-horizontal > .list .item { 102 | margin-right: 0; 103 | margin-left: 0; 104 | 105 | &.item-input input { 106 | padding-right: 44px; 107 | } 108 | } 109 | .padding-left > .list .item { 110 | margin-left: 0; 111 | } 112 | .padding-right > .list .item { 113 | margin-right: 0; 114 | } 115 | -------------------------------------------------------------------------------- /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 | &.visible { 25 | visibility: visible; 26 | } 27 | &.active { 28 | opacity: 1; 29 | } 30 | 31 | .loading { 32 | padding: $loading-padding; 33 | 34 | border-radius: $loading-border-radius; 35 | background-color: $loading-bg-color; 36 | 37 | color: $loading-text-color; 38 | 39 | text-align: center; 40 | text-overflow: ellipsis; 41 | font-size: $loading-font-size; 42 | 43 | h1, h2, h3, h4, h5, h6 { 44 | color: $loading-text-color; 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /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 | 40 | .grade-b .menu-content, 41 | .grade-c .menu-content { 42 | @include box-sizing(content-box); 43 | right: -1px; 44 | left: -1px; 45 | border-right: 1px solid #ccc; 46 | border-left: 1px solid #ccc; 47 | box-shadow: none; 48 | } 49 | 50 | .menu-left { 51 | left: 0; 52 | } 53 | 54 | .menu-right { 55 | right: 0; 56 | } 57 | 58 | .aside-open.aside-resizing .menu-right { 59 | display: none; 60 | } 61 | 62 | .menu-animated { 63 | @include transition-transform($menu-animation-speed ease); 64 | } 65 | -------------------------------------------------------------------------------- /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 | @include transition(background-color 300ms ease-in-out); 10 | position: fixed; 11 | top: 0; 12 | left: 0; 13 | z-index: $z-index-modal; 14 | width: 100%; 15 | height: 100%; 16 | background-color: $modal-backdrop-bg-inactive; 17 | 18 | &.active { 19 | background-color: $modal-backdrop-bg-active; 20 | } 21 | } 22 | 23 | .modal { 24 | display: block; 25 | position: absolute; 26 | top: 0; 27 | z-index: $z-index-modal; 28 | overflow: hidden; 29 | min-height: 100%; 30 | width: 100%; 31 | background-color: $modal-bg-color; 32 | } 33 | 34 | @media (min-width: $modal-inset-mode-break-point) { 35 | // inset mode is when the modal doesn't fill the entire 36 | // display but instead is centered within a large display 37 | .modal { 38 | top: $modal-inset-mode-top; 39 | right: $modal-inset-mode-right; 40 | bottom: $modal-inset-mode-bottom; 41 | left: $modal-inset-mode-left; 42 | overflow: visible; 43 | min-height: $modal-inset-mode-min-height; 44 | width: (100% - $modal-inset-mode-left - $modal-inset-mode-right); 45 | } 46 | 47 | .modal.ng-leave-active { 48 | bottom: 0; 49 | } 50 | 51 | // remove ios header padding from inset header 52 | .platform-ios.platform-cordova .modal-wrapper .modal{ 53 | .bar-header:not(.bar-subheader) { 54 | height: $bar-height; 55 | > * { 56 | margin-top: 0; 57 | } 58 | } 59 | .tabs-top > .tabs, 60 | .tabs.tabs-top { 61 | top: $bar-height; 62 | } 63 | .has-header, 64 | .bar-subheader { 65 | top: $bar-height; 66 | } 67 | .has-subheader { 68 | top: (2 * $bar-height); 69 | } 70 | .has-tabs-top { 71 | top: $bar-height + $tabs-height; 72 | } 73 | .has-header.has-subheader.has-tabs-top { 74 | top: 2 * $bar-height + $tabs-height; 75 | } 76 | } 77 | } 78 | 79 | // disable clicks on all but the modal 80 | .modal-open { 81 | pointer-events: none; 82 | 83 | .modal, 84 | .modal-backdrop { 85 | pointer-events: auto; 86 | } 87 | // prevent clicks on modal when loading overlay is active though 88 | &.loading-active { 89 | .modal, 90 | .modal-backdrop { 91 | pointer-events: none; 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_platform.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Platform 4 | * -------------------------------------------------- 5 | * Platform specific tweaks 6 | */ 7 | 8 | 9 | /** 10 | * Apply roboto font 11 | */ 12 | 13 | .roboto { 14 | font-family: "Roboto", $font-family-base; 15 | 16 | input { 17 | font-family: "Roboto", $font-family-base; 18 | } 19 | } 20 | /* 21 | .platform-android { 22 | 23 | 24 | .bar { 25 | padding: 0; 26 | 27 | line-height: 40px; 28 | 29 | .button { 30 | line-height: 40px; 31 | } 32 | 33 | .button-icon:before { 34 | font-size: 24px; 35 | } 36 | } 37 | 38 | .back-button { 39 | &.button-icon:before { 40 | line-height: 40px; 41 | } 42 | margin-left: -3px; 43 | padding: 0px 2px !important; 44 | &.ion-android-arrow-back:before { 45 | font-size: 12px; 46 | } 47 | 48 | &.back-button.active, 49 | &.back-button.activated { 50 | background-color: rgba(0,0,0,0.1); 51 | } 52 | } 53 | 54 | .item-divider { 55 | background: none; 56 | border-top-width: 0; 57 | border-bottom-width: 2px; 58 | text-transform: uppercase; 59 | margin-top: 10px; 60 | font-size: 14px; 61 | } 62 | .item { 63 | border-left-width: 0; 64 | border-right-width: 0; 65 | } 66 | 67 | .item-divider ~ .item:not(.item-divider) { 68 | border-bottom-width: 0; 69 | } 70 | 71 | .back-button:not(.ng-hide) + .left-buttons + .title { 72 | // Don't allow normal titles in this mode 73 | display: none; 74 | } 75 | 76 | .bar .title { 77 | text-align: left; 78 | font-weight: normal; 79 | } 80 | 81 | font-family: 'Roboto'; 82 | 83 | h1, h2, h3, h4, h5 { 84 | font-family: 'Roboto', $font-family-base; 85 | } 86 | 87 | .tab-item { 88 | font-family: 'Roboto', $font-family-base; 89 | } 90 | 91 | 92 | input, button, select, textarea { 93 | font-family: 'Roboto', $font-family-base; 94 | } 95 | */ 96 | //} 97 | 98 | .platform-ios.platform-cordova { 99 | // iOS7/8 has a status bar which sits on top of the header. 100 | // Bump down everything to make room for it. However, if 101 | // if its in Cordova, and set to fullscreen, then disregard the bump. 102 | &:not(.fullscreen) { 103 | .bar-header:not(.bar-subheader) { 104 | height: $bar-height + $ios-statusbar-height; 105 | 106 | &.item-input-inset .item-input-wrapper { 107 | margin-top: 19px !important; 108 | } 109 | 110 | > * { 111 | margin-top: $ios-statusbar-height; 112 | } 113 | } 114 | .tabs-top > .tabs, 115 | .tabs.tabs-top { 116 | top: $bar-height + $ios-statusbar-height; 117 | } 118 | 119 | .has-header, 120 | .bar-subheader { 121 | top: $bar-height + $ios-statusbar-height; 122 | } 123 | .has-subheader { 124 | top: (2 * $bar-height) + $ios-statusbar-height; 125 | } 126 | .has-tabs-top { 127 | top: $bar-height + $tabs-height + $ios-statusbar-height; 128 | } 129 | .has-header.has-subheader.has-tabs-top { 130 | top: 2 * $bar-height + $tabs-height + $ios-statusbar-height; 131 | } 132 | } 133 | &.status-bar-hide { 134 | // Cordova doesn't adjust the body height correctly, this makes up for it 135 | margin-bottom: 20px; 136 | } 137 | } 138 | 139 | @media (orientation:landscape) { 140 | .platform-ios.platform-browser.platform-ipad { 141 | position: fixed; // required for iPad 7 Safari 142 | } 143 | } 144 | 145 | .platform-c:not(.enable-transitions) * { 146 | // disable transitions on grade-c devices (Android 2) 147 | -webkit-transition: none !important; 148 | transition: none !important; 149 | } 150 | 151 | -------------------------------------------------------------------------------- /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-left: -$popover-width / 2; 29 | height: $popover-height; 30 | width: $popover-width; 31 | background-color: $popover-bg-color; 32 | box-shadow: $popover-box-shadow; 33 | opacity: 0; 34 | 35 | .item:first-child { 36 | border-top: 0; 37 | } 38 | 39 | .item:last-child { 40 | border-bottom: 0; 41 | } 42 | 43 | &.popover-top { 44 | margin-top: 12px; 45 | } 46 | &.popover-bottom { 47 | margin-top: -12px; 48 | } 49 | } 50 | 51 | 52 | // Set popover border-radius 53 | .popover, 54 | .popover .bar-header { 55 | border-radius: $popover-border-radius; 56 | } 57 | .popover .scroll-content { 58 | z-index: 1; 59 | margin: 2px 0; 60 | } 61 | .popover .bar-header { 62 | border-bottom-right-radius: 0; 63 | border-bottom-left-radius: 0; 64 | } 65 | .popover .has-header { 66 | border-top-right-radius: 0; 67 | border-top-left-radius: 0; 68 | } 69 | .popover-arrow { 70 | display: none; 71 | } 72 | 73 | 74 | // iOS Popover 75 | .platform-ios { 76 | 77 | .popover { 78 | box-shadow: $popover-box-shadow-ios; 79 | } 80 | 81 | .popover, 82 | .popover .bar-header { 83 | border-radius: $popover-border-radius-ios; 84 | } 85 | .popover .scroll-content { 86 | margin: 8px 0; 87 | border-radius: $popover-border-radius-ios; 88 | } 89 | .popover .scroll-content.has-header { 90 | margin-top: 0; 91 | } 92 | .popover-arrow { 93 | position: absolute; 94 | display: block; 95 | width: 30px; 96 | height: 19px; 97 | overflow: hidden; 98 | 99 | &:after { 100 | position: absolute; 101 | top: 12px; 102 | left: 5px; 103 | width: 20px; 104 | height: 20px; 105 | background-color: $popover-bg-color; 106 | border-radius: 3px; 107 | content: ''; 108 | @include rotate(-45deg); 109 | } 110 | } 111 | .popover-top .popover-arrow { 112 | top: -17px; 113 | } 114 | .popover-bottom .popover-arrow { 115 | bottom: -10px; 116 | &:after { 117 | top: -6px; 118 | } 119 | } 120 | } 121 | 122 | 123 | // Android Popover 124 | .platform-android { 125 | 126 | .popover { 127 | background-color: $popover-bg-color-android; 128 | box-shadow: $popover-box-shadow-android; 129 | 130 | .item { 131 | border-color: $popover-bg-color-android; 132 | background-color: $popover-bg-color-android; 133 | color: #4d4d4d; 134 | } 135 | &.popover-top { 136 | margin-top: -32px; 137 | } 138 | &.popover-bottom { 139 | margin-top: 32px; 140 | } 141 | } 142 | 143 | .popover-backdrop, 144 | .popover-backdrop.active { 145 | background-color: transparent; 146 | } 147 | } 148 | 149 | 150 | // disable clicks on all but the popover 151 | .popover-open { 152 | pointer-events: none; 153 | 154 | .popover, 155 | .popover-backdrop { 156 | pointer-events: auto; 157 | } 158 | // prevent clicks on popover when loading overlay is active though 159 | &.loading-active { 160 | .popover, 161 | .popover-backdrop { 162 | pointer-events: none; 163 | } 164 | } 165 | } 166 | 167 | 168 | // wider popover on larger viewports 169 | @media (min-width: $popover-large-break-point) { 170 | .popover { 171 | width: $popover-large-width; 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /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 | 54 | .popup-head { 55 | padding: 15px 0px; 56 | border-bottom: 1px solid #eee; 57 | text-align: center; 58 | } 59 | .popup-title { 60 | margin: 0; 61 | padding: 0; 62 | font-size: 15px; 63 | } 64 | .popup-sub-title { 65 | margin: 5px 0 0 0; 66 | padding: 0; 67 | font-weight: normal; 68 | font-size: 11px; 69 | } 70 | .popup-body { 71 | padding: 10px; 72 | overflow: scroll; 73 | } 74 | 75 | .popup-buttons { 76 | @include display-flex(); 77 | @include flex-direction(row); 78 | padding: 10px; 79 | min-height: $popup-button-min-height + 20; 80 | 81 | .button { 82 | @include flex(1); 83 | min-height: $popup-button-min-height; 84 | border-radius: $popup-button-border-radius; 85 | line-height: $popup-button-line-height; 86 | 87 | margin-right: 5px; 88 | &:last-child { 89 | margin-right: 0px; 90 | } 91 | } 92 | } 93 | 94 | .popup-open { 95 | pointer-events: none; 96 | 97 | &.modal-open .modal { 98 | pointer-events: none; 99 | } 100 | 101 | .popup-backdrop, .popup { 102 | pointer-events: auto; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /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/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 ~ .item-content { 38 | /* style the item content when its checked */ 39 | background: #f7f7f7; 40 | } 41 | 42 | &:checked ~ .radio-icon { 43 | /* show the checkmark icon when its checked */ 44 | visibility: visible; 45 | } 46 | } 47 | 48 | // Hack for Android to correctly display the checked item 49 | // http://timpietrusky.com/advanced-checkbox-hack 50 | .platform-android.grade-b .item-radio, 51 | .platform-android.grade-c .item-radio { 52 | -webkit-animation: androidCheckedbugfix infinite 1s; 53 | } 54 | @-webkit-keyframes androidCheckedbugfix { 55 | from { padding: 0; } 56 | to { padding: 0; } 57 | } 58 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_range.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Range 4 | * -------------------------------------------------- 5 | */ 6 | 7 | input[type="range"] { 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 | &::-webkit-slider-thumb { 25 | position: relative; 26 | width: $range-slider-width; 27 | height: $range-slider-height; 28 | border-radius: $range-slider-border-radius; 29 | background-color: $toggle-handle-off-bg-color; 30 | box-shadow: 0 0 2px rgba(0,0,0,.5), 1px 3px 5px rgba(0,0,0,0.25); 31 | cursor: pointer; 32 | -webkit-appearance: none; 33 | } 34 | 35 | &::-webkit-slider-thumb:before { 36 | /* what creates the colorful line on the left side of the slider */ 37 | position: absolute; 38 | top: ($range-slider-height / 2) - ($range-track-height / 2); 39 | left: -2001px; 40 | width: 2000px; 41 | height: $range-track-height; 42 | background: $dark; 43 | content: ' '; 44 | } 45 | 46 | &::-webkit-slider-thumb:after { 47 | /* create a larger (but hidden) hit area */ 48 | position: absolute; 49 | top: -20px; 50 | left: -20px; 51 | padding: 30px; 52 | content: ' '; 53 | //background: red; 54 | //opacity: .5; 55 | } 56 | 57 | } 58 | 59 | .range { 60 | @include display-flex(); 61 | @include align-items(center); 62 | padding: 2px 11px; 63 | 64 | &.range-light { 65 | input { @include range-style($range-light-track-bg); } 66 | } 67 | &.range-stable { 68 | input { @include range-style($range-stable-track-bg); } 69 | } 70 | &.range-positive { 71 | input { @include range-style($range-positive-track-bg); } 72 | } 73 | &.range-calm { 74 | input { @include range-style($range-calm-track-bg); } 75 | } 76 | &.range-balanced { 77 | input { @include range-style($range-balanced-track-bg); } 78 | } 79 | &.range-assertive { 80 | input { @include range-style($range-assertive-track-bg); } 81 | } 82 | &.range-energized { 83 | input { @include range-style($range-energized-track-bg); } 84 | } 85 | &.range-royal { 86 | input { @include range-style($range-royal-track-bg); } 87 | } 88 | &.range-dark { 89 | input { @include range-style($range-dark-track-bg); } 90 | } 91 | } 92 | 93 | .range .icon { 94 | @include flex(0); 95 | display: block; 96 | min-width: $range-icon-size; 97 | text-align: center; 98 | font-size: $range-icon-size; 99 | } 100 | 101 | .range input { 102 | @include flex(1); 103 | display: block; 104 | margin-right: 10px; 105 | margin-left: 10px; 106 | } 107 | 108 | .range-label { 109 | @include flex(0, 0, auto); 110 | display: block; 111 | white-space: nowrap; 112 | } 113 | 114 | .range-label:first-child { 115 | padding-left: 5px; 116 | } 117 | .range input + .range-label { 118 | padding-right: 5px; 119 | padding-left: 0; 120 | } 121 | 122 | -------------------------------------------------------------------------------- /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 | right: 0; 15 | padding: ($item-padding - 2) ($item-padding * 3) ($item-padding) $item-padding; 16 | max-width: 65%; 17 | 18 | border: none; 19 | background: $item-default-bg; 20 | color: #333; 21 | 22 | // hack to hide default dropdown arrow in FF 23 | text-indent: .01px; 24 | text-overflow: ''; 25 | 26 | white-space: nowrap; 27 | font-size: $font-size-base; 28 | 29 | cursor: pointer; 30 | direction: rtl; // right align the select text 31 | } 32 | 33 | select::-ms-expand { 34 | // hide default dropdown arrow in IE 35 | display: none; 36 | } 37 | 38 | option { 39 | direction: ltr; 40 | } 41 | 42 | &:after { 43 | position: absolute; 44 | top: 50%; 45 | right: $item-padding; 46 | margin-top: -3px; 47 | width: 0; 48 | height: 0; 49 | border-top: 5px solid; 50 | border-right: 5px solid rgba(0, 0, 0, 0); 51 | border-left: 5px solid rgba(0, 0, 0, 0); 52 | color: #999; 53 | content: ""; 54 | pointer-events: none; 55 | } 56 | &.item-light { 57 | select{ 58 | background:$item-light-bg; 59 | color:$item-light-text; 60 | } 61 | } 62 | &.item-stable { 63 | select{ 64 | background:$item-stable-bg; 65 | color:$item-stable-text; 66 | } 67 | &:after, .input-label{ 68 | color:darken($item-stable-border,30%); 69 | } 70 | } 71 | &.item-positive { 72 | select{ 73 | background:$item-positive-bg; 74 | color:$item-positive-text; 75 | } 76 | &:after, .input-label{ 77 | color:$item-positive-text; 78 | } 79 | } 80 | &.item-calm { 81 | select{ 82 | background:$item-calm-bg; 83 | color:$item-calm-text; 84 | } 85 | &:after, .input-label{ 86 | color:$item-calm-text; 87 | } 88 | } 89 | &.item-assertive { 90 | select{ 91 | background:$item-assertive-bg; 92 | color:$item-assertive-text; 93 | } 94 | &:after, .input-label{ 95 | color:$item-assertive-text; 96 | } 97 | } 98 | &.item-balanced { 99 | select{ 100 | background:$item-balanced-bg; 101 | color:$item-balanced-text; 102 | } 103 | &:after, .input-label{ 104 | color:$item-balanced-text; 105 | } 106 | } 107 | &.item-energized { 108 | select{ 109 | background:$item-energized-bg; 110 | color:$item-energized-text; 111 | } 112 | &:after, .input-label{ 113 | color:$item-energized-text; 114 | } 115 | } 116 | &.item-royal { 117 | select{ 118 | background:$item-royal-bg; 119 | color:$item-royal-text; 120 | } 121 | &:after, .input-label{ 122 | color:$item-royal-text; 123 | } 124 | } 125 | &.item-dark { 126 | select{ 127 | background:$item-dark-bg; 128 | color:$item-dark-text; 129 | } 130 | &:after, .input-label{ 131 | color:$item-dark-text; 132 | } 133 | } 134 | } 135 | 136 | select { 137 | &[multiple], 138 | &[size] { 139 | height: auto; 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_split-pane.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Split Pane 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .split-pane { 8 | @include display-flex(); 9 | @include align-items(stretch); 10 | width: 100%; 11 | height: 100%; 12 | } 13 | 14 | .split-pane-menu { 15 | @include flex(0, 0, $split-pane-menu-width); 16 | 17 | overflow-y: auto; 18 | width: $split-pane-menu-width; 19 | height: 100%; 20 | border-right: 1px solid $split-pane-menu-border-color; 21 | 22 | @media all and (max-width: 568px) { 23 | border-right: none; 24 | } 25 | } 26 | 27 | .split-pane-content { 28 | @include flex(1, 0, auto); 29 | } 30 | -------------------------------------------------------------------------------- /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 | &.toggle-light { 28 | @include toggle-style($toggle-on-light-border, $toggle-on-light-bg); 29 | } 30 | &.toggle-stable { 31 | @include toggle-style($toggle-on-stable-border, $toggle-on-stable-bg); 32 | } 33 | &.toggle-positive { 34 | @include toggle-style($toggle-on-positive-border, $toggle-on-positive-bg); 35 | } 36 | &.toggle-calm { 37 | @include toggle-style($toggle-on-calm-border, $toggle-on-calm-bg); 38 | } 39 | &.toggle-assertive { 40 | @include toggle-style($toggle-on-assertive-border, $toggle-on-assertive-bg); 41 | } 42 | &.toggle-balanced { 43 | @include toggle-style($toggle-on-balanced-border, $toggle-on-balanced-bg); 44 | } 45 | &.toggle-energized { 46 | @include toggle-style($toggle-on-energized-border, $toggle-on-energized-bg); 47 | } 48 | &.toggle-royal { 49 | @include toggle-style($toggle-on-royal-border, $toggle-on-royal-bg); 50 | } 51 | &.toggle-dark { 52 | @include toggle-style($toggle-on-dark-border, $toggle-on-dark-bg); 53 | } 54 | } 55 | 56 | .toggle input { 57 | // hide the actual input checkbox 58 | display: none; 59 | } 60 | 61 | /* the track appearance when the toggle is "off" */ 62 | .toggle .track { 63 | @include transition-timing-function(ease-in-out); 64 | @include transition-duration($toggle-transition-duration); 65 | @include transition-property((background-color, border)); 66 | 67 | display: inline-block; 68 | box-sizing: border-box; 69 | width: $toggle-width; 70 | height: $toggle-height; 71 | border: solid $toggle-border-width $toggle-off-border-color; 72 | border-radius: $toggle-border-radius; 73 | background-color: $toggle-off-bg-color; 74 | content: ' '; 75 | cursor: pointer; 76 | pointer-events: none; 77 | } 78 | 79 | /* Fix to avoid background color bleeding */ 80 | /* (occured on (at least) Android 4.2, Asus MeMO Pad HD7 ME173X) */ 81 | .platform-android4_2 .toggle .track { 82 | -webkit-background-clip: padding-box; 83 | } 84 | 85 | /* the handle (circle) thats inside the toggle's track area */ 86 | /* also the handle's appearance when it is "off" */ 87 | .toggle .handle { 88 | @include transition($toggle-transition-duration ease-in-out); 89 | position: absolute; 90 | display: block; 91 | width: $toggle-handle-width; 92 | height: $toggle-handle-height; 93 | border-radius: $toggle-handle-radius; 94 | background-color: $toggle-handle-off-bg-color; 95 | top: $toggle-border-width + $toggle-hit-area-expansion; 96 | left: $toggle-border-width + $toggle-hit-area-expansion; 97 | 98 | &:before { 99 | // used to create a larger (but hidden) hit area to slide the handle 100 | position: absolute; 101 | top: -4px; 102 | left: ( ($toggle-handle-width / 2) * -1) - 8; 103 | padding: ($toggle-handle-height / 2) + 5 ($toggle-handle-width + 7); 104 | content: " "; 105 | } 106 | } 107 | 108 | .toggle input:checked + .track .handle { 109 | // the handle when the toggle is "on" 110 | @include translate3d($toggle-width - $toggle-handle-width - ($toggle-border-width * 2), 0, 0); 111 | background-color: $toggle-handle-on-bg-color; 112 | } 113 | 114 | .item-toggle.active { 115 | box-shadow: none; 116 | } 117 | 118 | .item-toggle, 119 | .item-toggle.item-complex .item-content { 120 | // make sure list item content have enough padding on right to fit the toggle 121 | padding-right: ($item-padding * 3) + $toggle-width; 122 | } 123 | 124 | .item-toggle.item-complex { 125 | padding-right: 0; 126 | } 127 | 128 | .item-toggle .toggle { 129 | // position the toggle to the right within a list item 130 | position: absolute; 131 | top: $item-padding / 2; 132 | right: $item-padding; 133 | z-index: $z-index-item-toggle; 134 | } 135 | 136 | .toggle input:disabled + .track { 137 | opacity: .6; 138 | } 139 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_type.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Typography 4 | * -------------------------------------------------- 5 | */ 6 | 7 | 8 | // Body text 9 | // ------------------------- 10 | 11 | p { 12 | margin: 0 0 ($line-height-computed / 2); 13 | } 14 | 15 | 16 | // Emphasis & misc 17 | // ------------------------- 18 | 19 | small { font-size: 85%; } 20 | cite { font-style: normal; } 21 | 22 | 23 | // Alignment 24 | // ------------------------- 25 | 26 | .text-left { text-align: left; } 27 | .text-right { text-align: right; } 28 | .text-center { text-align: center; } 29 | 30 | 31 | // Headings 32 | // ------------------------- 33 | 34 | h1, h2, h3, h4, h5, h6, 35 | .h1, .h2, .h3, .h4, .h5, .h6 { 36 | color: $base-color; 37 | font-weight: $headings-font-weight; 38 | font-family: $headings-font-family; 39 | line-height: $headings-line-height; 40 | 41 | small { 42 | font-weight: normal; 43 | line-height: 1; 44 | } 45 | } 46 | 47 | h1, .h1, 48 | h2, .h2, 49 | h3, .h3 { 50 | margin-top: $line-height-computed; 51 | margin-bottom: ($line-height-computed / 2); 52 | 53 | &:first-child { 54 | margin-top: 0; 55 | } 56 | 57 | + h1, + .h1, 58 | + h2, + .h2, 59 | + h3, + .h3 { 60 | margin-top: ($line-height-computed / 2); 61 | } 62 | } 63 | 64 | h4, .h4, 65 | h5, .h5, 66 | h6, .h6 { 67 | margin-top: ($line-height-computed / 2); 68 | margin-bottom: ($line-height-computed / 2); 69 | } 70 | 71 | h1, .h1 { font-size: floor($font-size-base * 2.60); } // ~36px 72 | h2, .h2 { font-size: floor($font-size-base * 2.15); } // ~30px 73 | h3, .h3 { font-size: ceil($font-size-base * 1.70); } // ~24px 74 | h4, .h4 { font-size: ceil($font-size-base * 1.25); } // ~18px 75 | h5, .h5 { font-size: $font-size-base; } 76 | h6, .h6 { font-size: ceil($font-size-base * 0.85); } // ~12px 77 | 78 | h1 small, .h1 small { font-size: ceil($font-size-base * 1.70); } // ~24px 79 | h2 small, .h2 small { font-size: ceil($font-size-base * 1.25); } // ~18px 80 | h3 small, .h3 small, 81 | h4 small, .h4 small { font-size: $font-size-base; } 82 | 83 | 84 | // Description Lists 85 | // ------------------------- 86 | 87 | dl { 88 | margin-bottom: $line-height-computed; 89 | } 90 | dt, 91 | dd { 92 | line-height: $line-height-base; 93 | } 94 | dt { 95 | font-weight: bold; 96 | } 97 | 98 | 99 | // Blockquotes 100 | // ------------------------- 101 | 102 | blockquote { 103 | margin: 0 0 $line-height-computed; 104 | padding: ($line-height-computed / 2) $line-height-computed; 105 | border-left: 5px solid gray; 106 | 107 | p { 108 | font-weight: 300; 109 | font-size: ($font-size-base * 1.25); 110 | line-height: 1.25; 111 | } 112 | 113 | p:last-child { 114 | margin-bottom: 0; 115 | } 116 | 117 | small { 118 | display: block; 119 | line-height: $line-height-base; 120 | &:before { 121 | content: '\2014 \00A0';// EM DASH, NBSP; 122 | } 123 | } 124 | } 125 | 126 | 127 | // Quotes 128 | // ------------------------- 129 | 130 | q:before, 131 | q:after, 132 | blockquote:before, 133 | blockquote:after { 134 | content: ""; 135 | } 136 | 137 | 138 | // Addresses 139 | // ------------------------- 140 | 141 | address { 142 | display: block; 143 | margin-bottom: $line-height-computed; 144 | font-style: normal; 145 | line-height: $line-height-base; 146 | } 147 | 148 | 149 | // Links 150 | // ------------------------- 151 | 152 | a.subdued { 153 | padding-right: 10px; 154 | color: #888; 155 | text-decoration: none; 156 | 157 | &:hover { 158 | text-decoration: none; 159 | } 160 | &:last-child { 161 | padding-right: 0; 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/_util.scss: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Utility Classes 4 | * -------------------------------------------------- 5 | */ 6 | 7 | .hide { 8 | display: none; 9 | } 10 | .opacity-hide { 11 | opacity: 0; 12 | } 13 | .grade-b .opacity-hide, 14 | .grade-c .opacity-hide { 15 | opacity: 1; 16 | display: none; 17 | } 18 | .show { 19 | display: block; 20 | } 21 | .opacity-show { 22 | opacity: 1; 23 | } 24 | .invisible { 25 | visibility: hidden; 26 | } 27 | 28 | .keyboard-open .hide-on-keyboard-open { 29 | display: none; 30 | } 31 | 32 | .keyboard-open .tabs.hide-on-keyboard-open + .pane .has-tabs, 33 | .keyboard-open .bar-footer.hide-on-keyboard-open + .pane .has-footer { 34 | bottom: 0; 35 | } 36 | 37 | .inline { 38 | display: inline-block; 39 | } 40 | 41 | .disable-pointer-events { 42 | pointer-events: none; 43 | } 44 | 45 | .enable-pointer-events { 46 | pointer-events: auto; 47 | } 48 | 49 | .disable-user-behavior { 50 | // used to prevent the browser from doing its native behavior. this doesnt 51 | // prevent the scrolling, but cancels the contextmenu, tap highlighting, etc 52 | 53 | @include user-select(none); 54 | @include touch-callout(none); 55 | @include tap-highlight-transparent(); 56 | 57 | -webkit-user-drag: none; 58 | 59 | -ms-touch-action: none; 60 | -ms-content-zooming: none; 61 | } 62 | 63 | // Fill the screen to block clicks (a better pointer-events: none) for the body 64 | // to avoid full-page reflows and paints which can cause flickers 65 | .click-block { 66 | position: absolute; 67 | top: 0; 68 | left: 0; 69 | z-index: $z-index-click-block; 70 | width: 100%; 71 | height: 100%; 72 | background: transparent; 73 | } 74 | 75 | .no-resize { 76 | resize: none; 77 | } 78 | 79 | .block { 80 | display: block; 81 | clear: both; 82 | &:after { 83 | display: block; 84 | visibility: hidden; 85 | clear: both; 86 | height: 0; 87 | content: "."; 88 | } 89 | } 90 | 91 | .full-image { 92 | width: 100%; 93 | } 94 | 95 | .clearfix { 96 | *zoom: 1; 97 | &:before, 98 | &:after { 99 | display: table; 100 | content: ""; 101 | // Fixes Opera/contenteditable bug: 102 | // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952 103 | line-height: 0; 104 | } 105 | &:after { 106 | clear: both; 107 | } 108 | } 109 | 110 | /** 111 | * Content Padding 112 | * -------------------------------------------------- 113 | */ 114 | 115 | .padding { 116 | padding: $content-padding; 117 | } 118 | 119 | .padding-top, 120 | .padding-vertical { 121 | padding-top: $content-padding; 122 | } 123 | 124 | .padding-right, 125 | .padding-horizontal { 126 | padding-right: $content-padding; 127 | } 128 | 129 | .padding-bottom, 130 | .padding-vertical { 131 | padding-bottom: $content-padding; 132 | } 133 | 134 | .padding-left, 135 | .padding-horizontal { 136 | padding-left: $content-padding; 137 | } 138 | 139 | 140 | /** 141 | * Rounded 142 | * -------------------------------------------------- 143 | */ 144 | 145 | .rounded { 146 | border-radius: $border-radius-base; 147 | } 148 | 149 | 150 | /** 151 | * Utility Colors 152 | * -------------------------------------------------- 153 | * Utility colors are added to help set a naming convention. You'll 154 | * notice we purposely do not use words like "red" or "blue", but 155 | * instead have colors which represent an emotion or generic theme. 156 | */ 157 | 158 | .light, a.light { 159 | color: $light; 160 | } 161 | .light-bg { 162 | background-color: $light; 163 | } 164 | .light-border { 165 | border-color: $button-light-border; 166 | } 167 | 168 | .stable, a.stable { 169 | color: $stable; 170 | } 171 | .stable-bg { 172 | background-color: $stable; 173 | } 174 | .stable-border { 175 | border-color: $button-stable-border; 176 | } 177 | 178 | .positive, a.positive { 179 | color: $positive; 180 | } 181 | .positive-bg { 182 | background-color: $positive; 183 | } 184 | .positive-border { 185 | border-color: $button-positive-border; 186 | } 187 | 188 | .calm, a.calm { 189 | color: $calm; 190 | } 191 | .calm-bg { 192 | background-color: $calm; 193 | } 194 | .calm-border { 195 | border-color: $button-calm-border; 196 | } 197 | 198 | .assertive, a.assertive { 199 | color: $assertive; 200 | } 201 | .assertive-bg { 202 | background-color: $assertive; 203 | } 204 | .assertive-border { 205 | border-color: $button-assertive-border; 206 | } 207 | 208 | .balanced, a.balanced { 209 | color: $balanced; 210 | } 211 | .balanced-bg { 212 | background-color: $balanced; 213 | } 214 | .balanced-border { 215 | border-color: $button-balanced-border; 216 | } 217 | 218 | .energized, a.energized { 219 | color: $energized; 220 | } 221 | .energized-bg { 222 | background-color: $energized; 223 | } 224 | .energized-border { 225 | border-color: $button-energized-border; 226 | } 227 | 228 | .royal, a.royal { 229 | color: $royal; 230 | } 231 | .royal-bg { 232 | background-color: $royal; 233 | } 234 | .royal-border { 235 | border-color: $button-royal-border; 236 | } 237 | 238 | .dark, a.dark { 239 | color: $dark; 240 | } 241 | .dark-bg { 242 | background-color: $dark; 243 | } 244 | .dark-border { 245 | border-color: $button-dark-border; 246 | } 247 | -------------------------------------------------------------------------------- /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 | 31 | // Forms 32 | "form", 33 | "checkbox", 34 | "toggle", 35 | "radio", 36 | "range", 37 | "select", 38 | "progress", 39 | 40 | // Buttons 41 | "button", 42 | "button-bar", 43 | 44 | // Util 45 | "animations", 46 | "grid", 47 | "util", 48 | "platform"; 49 | -------------------------------------------------------------------------------- /www/lib/ionic/scss/ionicons/_ionicons-animation.scss: -------------------------------------------------------------------------------- 1 | // Animation Icons 2 | // -------------------------- 3 | 4 | .#{$ionicons-prefix}spin { 5 | -webkit-animation: spin 1s infinite linear; 6 | -moz-animation: spin 1s infinite linear; 7 | -o-animation: spin 1s infinite linear; 8 | animation: spin 1s infinite linear; 9 | } 10 | 11 | @-moz-keyframes spin { 12 | 0% { -moz-transform: rotate(0deg); } 13 | 100% { -moz-transform: rotate(359deg); } 14 | } 15 | @-webkit-keyframes spin { 16 | 0% { -webkit-transform: rotate(0deg); } 17 | 100% { -webkit-transform: rotate(359deg); } 18 | } 19 | @-o-keyframes spin { 20 | 0% { -o-transform: rotate(0deg); } 21 | 100% { -o-transform: rotate(359deg); } 22 | } 23 | @-ms-keyframes spin { 24 | 0% { -ms-transform: rotate(0deg); } 25 | 100% { -ms-transform: rotate(359deg); } 26 | } 27 | @keyframes spin { 28 | 0% { transform: rotate(0deg); } 29 | 100% { transform: rotate(359deg); } 30 | } 31 | 32 | 33 | .#{$ionicons-prefix}loading-a, 34 | .#{$ionicons-prefix}loading-b, 35 | .#{$ionicons-prefix}loading-c, 36 | .#{$ionicons-prefix}loading-d, 37 | .#{$ionicons-prefix}looping, 38 | .#{$ionicons-prefix}refreshing, 39 | .#{$ionicons-prefix}ios7-reloading { 40 | @extend .ion; 41 | @extend .#{$ionicons-prefix}spin; 42 | } 43 | 44 | .#{$ionicons-prefix}loading-a { 45 | -webkit-animation-timing-function: steps(8, start); 46 | -moz-animation-timing-function: steps(8, start); 47 | animation-timing-function: steps(8, start); 48 | } 49 | 50 | .#{$ionicons-prefix}loading-a:before { 51 | @extend .#{$ionicons-prefix}load-a:before; 52 | } 53 | 54 | .#{$ionicons-prefix}loading-b:before { 55 | @extend .#{$ionicons-prefix}load-b:before; 56 | } 57 | 58 | .#{$ionicons-prefix}loading-c:before { 59 | @extend .#{$ionicons-prefix}load-c:before; 60 | } 61 | 62 | .#{$ionicons-prefix}loading-d:before { 63 | @extend .#{$ionicons-prefix}load-d:before; 64 | } 65 | 66 | .#{$ionicons-prefix}looping:before { 67 | @extend .#{$ionicons-prefix}loop:before; 68 | } 69 | 70 | .#{$ionicons-prefix}refreshing:before { 71 | @extend .#{$ionicons-prefix}refresh:before; 72 | } 73 | 74 | .#{$ionicons-prefix}ios7-reloading:before { 75 | @extend .#{$ionicons-prefix}ios7-reload:before; 76 | } 77 | -------------------------------------------------------------------------------- /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.svg?v=#{$ionicons-version}#Ionicons") format("svg"); 11 | font-weight: normal; 12 | font-style: normal; 13 | } 14 | 15 | .ion { 16 | display: inline-block; 17 | font-family: $ionicons-font-family; 18 | speak: none; 19 | font-style: normal; 20 | font-weight: normal; 21 | font-variant: normal; 22 | text-transform: none; 23 | text-rendering: auto; 24 | line-height: 1; 25 | -webkit-font-smoothing: antialiased; 26 | -moz-osx-font-smoothing: grayscale; 27 | } -------------------------------------------------------------------------------- /www/lib/ionic/scss/ionicons/ionicons.scss: -------------------------------------------------------------------------------- 1 | @import "ionicons-variables"; 2 | /*! 3 | Ionicons, v1.5.2 4 | Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ 5 | https://twitter.com/benjsperry https://twitter.com/ionicframework 6 | MIT License: https://github.com/driftyco/ionicons 7 | */ 8 | 9 | @import "ionicons-font"; 10 | @import "ionicons-animation"; 11 | @import "ionicons-icons"; 12 | -------------------------------------------------------------------------------- /www/lib/mockfirebase/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mockfirebase", 3 | "version": "0.2.9", 4 | "homepage": "https://github.com/katowulf/mockfirebase", 5 | "authors": [ 6 | "Kato" 7 | ], 8 | "description": "An experimental Firebase stub/spy library for writing unit tests (not supported by Firebase)", 9 | "main": "./dist/mockfirebase.js", 10 | "moduleType": [ 11 | "amd", 12 | "globals", 13 | "node" 14 | ], 15 | "keywords": [ 16 | "firebase", 17 | "mock" 18 | ], 19 | "license": "MIT", 20 | "ignore": [ 21 | "**/.*", 22 | "node_modules", 23 | "test", 24 | "helpers", 25 | "gulpfile.js", 26 | "package.json", 27 | "src" 28 | ], 29 | "_release": "0.2.9", 30 | "_resolution": { 31 | "type": "version", 32 | "tag": "v0.2.9", 33 | "commit": "4f8b874a3d83fa1ccd55681137d4f0fed1218cbe" 34 | }, 35 | "_source": "git://github.com/katowulf/mockfirebase.git", 36 | "_target": "~0.2.9", 37 | "_originalSource": "mockfirebase" 38 | } -------------------------------------------------------------------------------- /www/lib/mockfirebase/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Issues 2 | 3 | If you've encountered a bug or want to request new functionality, go ahead and file an issue. Please provide as much detail as possible, including a live example, reproduction steps, and debugging steps you've already taken where possible. 4 | 5 | # Contributing 6 | 7 | * Fork the repo 8 | * `npm install` 9 | * make your additions in src/ 10 | * add test units in test/ 11 | * `npm test` 12 | * submit a pull request when all tests pass 13 | -------------------------------------------------------------------------------- /www/lib/mockfirebase/MAINTAINING.md: -------------------------------------------------------------------------------- 1 | # Releasing 2 | 3 | Call `gulp release` to release a new patch version. For *minor* or *major* releases, use the `--type` flag: 4 | 5 | ```bash 6 | $ gulp release --type minor 7 | ``` 8 | 9 | To push the release commit and tag: 10 | 11 | ```bash 12 | $ git push --follow-tags 13 | ``` 14 | -------------------------------------------------------------------------------- /www/lib/mockfirebase/README.md: -------------------------------------------------------------------------------- 1 | MockFirebase 2 | ============ 3 | 4 | **This is an experimental library. It is not supported by Firebase. Use with caution and submit PRs for fixes and enhancements.** 5 | 6 | A Firebase stub useful for unit testing. 7 | 8 | [![Build Status](https://travis-ci.org/katowulf/mockfirebase.svg?branch=master)](https://travis-ci.org/katowulf/mockfirebase) 9 | 10 | ## Installation 11 | 12 | ### Node.js 13 | 14 | ```bash 15 | $ npm install mockfirebase 16 | ``` 17 | 18 | ### Web 19 | ```html 20 | 21 | 22 | 23 | ``` 24 | ### Browser Support 25 | 26 | Works by default with IE 9 and up. To add support for older versions, just include polyfills for [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Compatibility), 27 | [Array.prototype.indexOf](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Polyfill), and [Array.prototype.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill). 28 | 29 | Jasmine tests will run in the browser without any configuration. To add support for any other test suite (e.g. Mocha), 30 | just include [sinon.js](http://sinonjs.org/) in the browser script tags, Karma config, etc. 31 | 32 | ## Usage 33 | 34 | MockFirebase is designed to be used synchronously or asynchronously for unit testing by allowing you complete 35 | control over when each event is triggered, via the `flush()` command. 36 | 37 | ```js 38 | var fb = new MockFirebase(ANY_URLISH_STRING); // loads the default data 39 | var spy = sinon.spy(); 40 | fb.on('value', spy); 41 | fb.set({ foo: 'bar' }); 42 | expect(spy.called).to.be(false); // it is! 43 | fb.flush(); 44 | expect(spy.called).to.be(true); // it is! 45 | ``` 46 | 47 | See [angularFire's unit tests](https://github.com/firebase/angularFire/blob/master/tests/unit/AngularFire.spec.js) for examples of the MockFirebase in action. 48 | 49 | ## Specifying data 50 | 51 | You can specify the default data to be used by setting `MockFirebase.DEFAULT_DATA` to an object. You can also 52 | specify data per-instance by adding a second arg to the constructor: `new MockFirebase(ANY_URLISH_STRING, dataToUse);` 53 | 54 | ## API 55 | 56 | All the regular Firebase methods are(?) supported. In addition, the following test-related methods exist: 57 | 58 | ### flush 59 | 60 | @param {boolean|int} [delay] in milliseconds 61 | @returns {MockFirebase} 62 | 63 | Invoke all the operations that have been queued thus far. If a numeric delay is specified, this 64 | occurs asynchronously. Otherwise, it is a synchronous event (at the time flush is called). 65 | 66 | This allows Firebase to be used in synchronous tests without waiting for async callbacks. It also 67 | provides a rudimentary mechanism for simulating locally cached data (events are triggered 68 | synchronously when you do on('value') or on('child_added')) 69 | 70 | If you call this multiple times with different delay values, you can invoke the events out 71 | of order, as might happen on a network with some latency, or if multiple users update values "simultaneously". 72 | 73 | ### autoFlush 74 | 75 | @param {int|boolean} [delay] in milliseconds 76 | 77 | Automatically trigger a flush event after each operation. If a numeric delay is specified, this is an 78 | asynchronous event. If value is set to true, it is synchronous (flush is triggered immediately). Setting 79 | this to false disabled autoFlush 80 | 81 | ### failNext 82 | 83 | @param {String} methodName currently only supports `set` and `transaction` 84 | @param {String|Error} error 85 | 86 | Simulate a failure by specifying that the next invocation of methodName should fail with the provided error. 87 | 88 | ## getData 89 | 90 | @returns {*} 91 | 92 | Returns a copy of the current data 93 | 94 | # Proxying Firebase 95 | 96 | When writing unit tests, you'll probably want to patch calls to `Firebase` in your source code with `MockFirebase`. 97 | 98 | ## Browser 99 | 100 | If `Firebase` is attached to the `window`, you can just replace it using the override method: 101 | 102 | ```js 103 | MockFirebase.override(); 104 | ``` 105 | 106 | Make sure to include `MockFirebase` before overwriting Firebase and then add your tests after the patch. 107 | 108 | ## Node/Browserify 109 | In Node/Browserify, you need to patch `require` itself. [proxyquire](https://github.com/thlorenz/proxyquire) and [proxyquireify](https://github.com/thlorenz/proxyquireify) make this easy. 110 | 111 | ```js 112 | // ./mySrc.js 113 | var Firebase = require('firebase'); 114 | var ref = new Firebase('myRefUrl'); 115 | ref.on('value', function (snapshot) { 116 | console.log(snapshot.val()); 117 | }); 118 | ``` 119 | 120 | In order to test the above source code, we use proxyquire like this: 121 | 122 | ```js 123 | // ./test.js 124 | var proxyquire = require('proxyquire'); 125 | var mySrc = proxyquire('./mySrc', { 126 | firebase: require('mockfirebase').MockFirebase.autoFlush() 127 | }); 128 | // data is logged 129 | ``` 130 | 131 | Note that the key in the stubs object matches the module name (`'firebase'`) and not the capitalized variable name. 132 | 133 | # Support 134 | 135 | Use the [issues list](https://github.com/katowulf/mockfirebase/issues) for questions and troubleshooting help. 136 | -------------------------------------------------------------------------------- /www/lib/mockfirebase/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mockfirebase", 3 | "version": "0.2.9", 4 | "homepage": "https://github.com/katowulf/mockfirebase", 5 | "authors": [ 6 | "Kato" 7 | ], 8 | "description": "An experimental Firebase stub/spy library for writing unit tests (not supported by Firebase)", 9 | "main": "./dist/mockfirebase.js", 10 | "moduleType": [ 11 | "amd", 12 | "globals", 13 | "node" 14 | ], 15 | "keywords": [ 16 | "firebase", 17 | "mock" 18 | ], 19 | "license": "MIT", 20 | "ignore": [ 21 | "**/.*", 22 | "node_modules", 23 | "test", 24 | "helpers", 25 | "gulpfile.js", 26 | "package.json", 27 | "src" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /www/views/about/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

App built as an example for demonstrating many features of the Ionic Framework. Built by Jeremy Wilken, @gnomeontherun.

5 |

Projects Used

6 | 12 |

Want to make improvements, found a bug, or just have questions? Open an issue on the GitHub project.

13 |

Icon and Splashscreen licensed as CC 3.0 BY-SA/BYCG by Manamedia.com.

14 |
15 |
16 | -------------------------------------------------------------------------------- /www/views/events/events.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 | 5 |
  • {{day.day}}
  • 6 |
  • 7 |

    {{event.event}}

    8 |

    {{event.time}}, {{event.location}}

    9 |
  • 10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /www/views/events/events.js: -------------------------------------------------------------------------------- 1 | angular.module('App').controller('EventsCtrl', function ($scope, EventsService) { 2 | 3 | var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; 4 | var day = new Date().getDay(); 5 | var index = 0; 6 | $scope.events = EventsService.$asArray(); 7 | 8 | $scope.events.$loaded().then(function () { 9 | while (day != index && index < 7) { 10 | $scope.events.push($scope.events.shift()); 11 | index++; 12 | } 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /www/views/food/food.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Total: {{order.total | currency}}, Items {{order.items.length}}

7 |
8 | 9 | 10 | 11 | {{course.meal}} 12 | 13 | {{item.item}} {{item.price | currency}} 14 | Order 15 | 16 | 17 | 18 | 19 |
20 | -------------------------------------------------------------------------------- /www/views/food/food.js: -------------------------------------------------------------------------------- 1 | angular.module('App').controller('FoodCtrl', function ($scope, $ionicListDelegate, $ionicLoading, $ionicModal, $ionicPopup, MenuService) { 2 | 3 | $scope.sendOrder = function () { 4 | $ionicPopup.alert({ 5 | title: 'Order submitted', 6 | template: 'Your order will be delieved to your room within 30 minutes.', 7 | }).then(function (code) { 8 | $scope.modal.hide(); 9 | }); 10 | } 11 | 12 | $scope.openPreview = function() { 13 | $ionicModal.fromTemplateUrl('views/food/preview.html', { 14 | scope: $scope, 15 | animation: 'slide-in-up' 16 | }).then(function(modal) { 17 | $scope.modal = modal; 18 | $scope.modal.show(); 19 | }); 20 | }; 21 | 22 | $scope.cancelPreview = function () { 23 | $scope.modal.hide(); 24 | }; 25 | 26 | $scope.$on('$destroy', function() { 27 | if ($scope.modal) { 28 | $scope.modal.remove(); 29 | } 30 | }); 31 | 32 | $scope.order = { 33 | items: [], 34 | total: 0 35 | }; 36 | 37 | $scope.add = function (item) { 38 | $ionicListDelegate.closeOptionButtons(); 39 | $scope.order.items.push(angular.copy(item)); 40 | $scope.order.total += item.price; 41 | }; 42 | 43 | $scope.remove = function (index) { 44 | $scope.order.total -= $scope.order.items[index].price; 45 | $scope.order.items.splice(index, 1); 46 | }; 47 | 48 | $ionicLoading.show({ 49 | template: ' Loading menu' 50 | }); 51 | 52 | $scope.menu = MenuService.$asArray(); 53 | $scope.menu.$loaded().then(function () { 54 | $ionicLoading.hide(); 55 | }); 56 | 57 | }); 58 | -------------------------------------------------------------------------------- /www/views/food/preview.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
6 |

Preview Order

7 |
8 | 9 |
10 |
11 | 12 | 13 | No items 14 | 15 | {{item.item}} {{item.price | currency}} 16 | Remove 17 | 18 | 19 |
20 | -------------------------------------------------------------------------------- /www/views/home/comments.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Send Us Comments

4 |
5 | 6 |
7 |
8 | 9 |
10 |
11 |
Message
12 |
13 |
14 | 15 |
16 |
17 |
Rate your experience
18 |
19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 |
29 |
30 |
31 | -------------------------------------------------------------------------------- /www/views/home/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
Welcome to Sunshine Resort
5 |
6 | We hope you enjoy your stay! Here you can see the daily schedule. You can view the events list to add things to your schedule or discover local places in the menu. 7 |
8 |
9 | 10 |
11 |
Current Weather
12 |
13 |
14 |

Currently {{weather.main.temp}}°F and {{weather.weather[0].description}}.

15 |
16 | See Forecast 17 |
18 | 19 |
20 |
Today's Events
21 |
22 |
{{item.event}}, {{item.time}}
23 | See all events 24 |
25 | 26 |
27 |
28 | Send us a comment 29 |
30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /www/views/home/home.js: -------------------------------------------------------------------------------- 1 | angular.module('App').controller('HomeCtrl', function ($scope, $http, $timeout, $ionicModal, $ionicLoading, $ionicPopup, EventsService) { 2 | 3 | var comment = { 4 | message: '', 5 | rating: 5 6 | }; 7 | $scope.comment = angular.copy(comment); 8 | 9 | $scope.sendComments = function () { 10 | // Send comment 11 | $scope.cancelComments(); 12 | $ionicPopup.alert({ 13 | title: 'Thank you!', 14 | template: 'We appreciate your comments!', 15 | okText: 'Close' 16 | }); 17 | }; 18 | 19 | $scope.cancelComments = function () { 20 | $scope.comment = angular.copy(comment); 21 | $scope.modal.hide(); 22 | } 23 | 24 | $scope.openComments = function() { 25 | $ionicModal.fromTemplateUrl('views/home/comments.html', { 26 | scope: $scope, 27 | animation: 'slide-in-up' 28 | }).then(function(modal) { 29 | $scope.modal = modal; 30 | $scope.modal.show(); 31 | }); 32 | }; 33 | 34 | //Cleanup the modal when we're done with it! 35 | $scope.$on('$destroy', function() { 36 | if ($scope.modal) { 37 | $scope.modal.remove(); 38 | } 39 | }); 40 | 41 | $http.get('http://api.openweathermap.org/data/2.5/weather?q=Key%20West,FL&units=imperial').success(function (data) { 42 | $scope.weather = data; 43 | }); 44 | 45 | var events = EventsService.$asArray(); 46 | events.$loaded().then(function () { 47 | $scope.today = events[new Date().getDay()]; 48 | }); 49 | 50 | }); 51 | -------------------------------------------------------------------------------- /www/views/local/beaches.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 |
  • Public
  • 5 |
  • 6 |

    Green Beach

    7 |

    0.4 miles

    8 |
  • 9 |
  • 10 |

    Marty's Pointe

    11 |

    1.0 miles

    12 |
  • 13 |
  • 14 |

    Shipwreck Beach

    15 |

    4.2 miles

    16 |
  • 17 |
  • 18 |

    Seal Beach

    19 |

    5.7 miles

    20 |
  • 21 |
  • 22 |

    Glass Beach

    23 |

    8.6 miles

    24 |
  • 25 |
  • Private
  • 26 |
  • 27 |

    East Pointe Beach, $5

    28 |

    3.2 miles

    29 |
  • 30 |
  • 31 |

    Secret Beach, $10

    32 |

    6.7 miles

    33 |
  • 34 |
  • 35 |

    Tide Pool Beach, $8

    36 |

    9.3 miles

    37 |
  • 38 |
39 |
40 |
41 | -------------------------------------------------------------------------------- /www/views/local/food.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 |
  • Casual
  • 5 |
  • 6 |

    Route 66 Cafe

    7 |

    1.4 miles

    8 |
  • 9 |
  • 10 |

    Applebee's

    11 |

    1.5 miles

    12 |
  • 13 |
  • 14 |

    Sally's Sundaes

    15 |

    3.2 miles

    16 |
  • 17 |
  • 18 |

    Cafe 888

    19 |

    3.6 miles

    20 |
  • 21 |
  • 22 |

    La Fiesta

    23 |

    4.3 miles

    24 |
  • 25 |
  • Fine Dining
  • 26 |
  • 27 |

    Italiano

    28 |

    3.2 miles

    29 |
  • 30 |
  • 31 |

    John's Steakhouse

    32 |

    3.5 miles

    33 |
  • 34 |
  • 35 |

    Gulf Coast Seafood

    36 |

    5.4 miles

    37 |
  • 38 |
39 |
40 |
41 | -------------------------------------------------------------------------------- /www/views/local/local.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /www/views/local/sights.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 |
  • Natural
  • 5 |
  • 6 |

    Botanical Gardens

    7 |

    4.4 miles

    8 |
  • 9 |
  • 10 |

    Hidden Falls

    11 |

    7.5 miles

    12 |
  • 13 |
  • 14 |

    Lookout Point

    15 |

    8.2 miles

    16 |
  • 17 |
  • 18 |

    Natural Stone Arches

    19 |

    12.3 miles

    20 |
  • 21 |
  • Kid Friendly
  • 22 |
  • 23 |

    Zoo

    24 |

    3.8 miles

    25 |
  • 26 |
  • 27 |

    Amusement Park

    28 |

    7.5 miles

    29 |
  • 30 |
  • 31 |

    Putt Putt

    32 |

    10.4 miles

    33 |
  • 34 |
35 |
36 |
37 | -------------------------------------------------------------------------------- /www/views/reservation/reservation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 | Check in: {{reservation.checkin | date}} 6 |
7 |
8 | Check out: {{reservation.checkout | date}} 9 |
10 |
11 | Room service: {{reservation.service | date}} 12 |
13 |
14 | Room: {{reservation.room}} 15 |
16 |
17 | Type: 2 Bed, 1 Bath 18 |
19 |
20 | Parking space: {{reservation.parkingSpace}} 21 |
22 |
23 | Daily rate: {{reservation.rate | currency}} 24 |
25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /www/views/reservation/reservation.js: -------------------------------------------------------------------------------- 1 | angular.module('App').controller('ReservationCtrl', function ($scope, $timeout, $ionicModal, $ionicLoading, $ionicPopup) { 2 | 3 | $ionicLoading.show({ 4 | template: ' Loading your reservation details' 5 | }); 6 | 7 | $timeout(function () { 8 | var today = new Date(); 9 | $scope.reservation = { 10 | checkin: today, 11 | checkout: new Date(today.getTime() + 1000 * 60 * 60 * 24 * 7), 12 | service: new Date(today.getTime() + 1000 * 60 * 60 * 24 * 4), 13 | room: 156, 14 | parkingSpace: 324, 15 | rate: 149 16 | }; 17 | $ionicLoading.hide(); 18 | }, 2000); 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /www/views/tour/tour.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Welcome to
Sunshine Resort

8 |
9 | 10 |

View your reservation

11 |

Call the concierge

12 |

Order room service

13 |

Discover resort events

14 |

Find local places

15 |

and much more!

16 |
17 | 18 | 19 | 20 | 21 |
22 |
23 | -------------------------------------------------------------------------------- /www/views/tour/tour.js: -------------------------------------------------------------------------------- 1 | angular.module('App').controller('TourCtrl', function ($scope, $location, $ionicPopup) { 2 | 3 | $scope.login = function () { 4 | $ionicPopup.prompt({ 5 | title: 'Login', 6 | inputPlaceholder: 'Enter reservation code', 7 | okText: 'Login' 8 | }).then(function (code) { 9 | // Login with code 10 | localStorage.setItem('firstVisit', '1'); 11 | $location.url('/'); 12 | }); 13 | } 14 | 15 | }); 16 | -------------------------------------------------------------------------------- /www/views/weather/weather.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
Sunshine Resort Forecast
5 |
6 | {{day.dt | date:'EEEE'}}, {{day.weather[0].description}} 7 |

High: {{day.temp.max}}°F Low: {{day.temp.min}}°F

8 |
9 |
10 |
11 | 12 | -------------------------------------------------------------------------------- /www/views/weather/weather.js: -------------------------------------------------------------------------------- 1 | angular.module('App').controller('WeatherCtrl', function ($scope, $http, $ionicLoading) { 2 | 3 | $ionicLoading.show({ 4 | template: ' Loading forecast' 5 | }); 6 | 7 | // You need to get a key from Open Weather Map and put the key in API_KEY_HERE 8 | $http.get('http://api.openweathermap.org/data/2.5/forecast/daily?q=Key%20West,FL&cnt=7&units=imperial&APPID=API_KEY_HERE').success(function (data) { 9 | $ionicLoading.hide(); 10 | $scope.weather = data; 11 | }); 12 | 13 | }); 14 | --------------------------------------------------------------------------------