"
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.3.6",
33 | "angular-animate": "1.3.6",
34 | "angular-sanitize": "1.3.6",
35 | "angular-ui-router": "0.2.13"
36 | },
37 | "_release": "1.0.0-rc.0",
38 | "_resolution": {
39 | "type": "version",
40 | "tag": "v1.0.0-rc.0",
41 | "commit": "1144bb0fa11bdd65d69da8e4a96df14534b678ec"
42 | },
43 | "_source": "git://github.com/driftyco/ionic-bower.git",
44 | "_target": "1.0.0-rc.0",
45 | "_originalSource": "driftyco/ionic-bower"
46 | }
--------------------------------------------------------------------------------
/www/lib/exif-js/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "exif-js",
3 | "version": "1.0.7",
4 | "description": "A JavaScript library for reading EXIF meta data from JPEG image files.",
5 | "main": "exif.js",
6 | "directories": {
7 | "example": "example"
8 | },
9 | "scripts": {
10 | "test": "echo \"Error: no test specified\" && exit 1"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "git://github.com/webthusiast/exif-js"
15 | },
16 | "homepage": "https://github.com/webthusiast/exif-js",
17 | "bugs": {
18 | "url": "https://github.com/jseidelin/exif-js/issues"
19 | },
20 | "keywords": [
21 | "exif",
22 | "binaryajax",
23 | "nihilogic",
24 | "browserify",
25 | "commonjs"
26 | ],
27 | "author": {
28 | "name": "Jacob Seidelin",
29 | "email": "jseidelin@nihilogic.dk",
30 | "url": "http://blog.nihilogic.dk/"
31 | },
32 | "maintainers": [
33 | {
34 | "name": "Roald de Vries",
35 | "email": "roald@webthusiast.nl",
36 | "url": "http://webthusiast.nl/"
37 | }
38 | ],
39 | "license": "MIT",
40 | "readme": "#Exif.js\n\nA JavaScript library for reading EXIF meta data from JPEG image files.",
41 | "readmeFilename": "README.md",
42 | "_id": "exif-js@1.0.7",
43 | "_from": "exif-js@"
44 | }
45 |
--------------------------------------------------------------------------------
/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/_animations.scss:
--------------------------------------------------------------------------------
1 |
2 | // Slide up from the bottom, used for modals
3 | // -------------------------------
4 |
5 | .slide-in-up {
6 | @include translate3d(0, 100%, 0);
7 | }
8 | .slide-in-up.ng-enter,
9 | .slide-in-up > .ng-enter {
10 | @include transition(all cubic-bezier(.1, .7, .1, 1) 400ms);
11 | }
12 | .slide-in-up.ng-enter-active,
13 | .slide-in-up > .ng-enter-active {
14 | @include translate3d(0, 0, 0);
15 | }
16 |
17 | .slide-in-up.ng-leave,
18 | .slide-in-up > .ng-leave {
19 | @include transition(all ease-in-out 250ms);
20 | }
21 |
22 |
23 | // Scale Out
24 | // Scale from hero (1 in this case) to zero
25 | // -------------------------------
26 |
27 | @-webkit-keyframes scaleOut {
28 | from { -webkit-transform: scale(1); opacity: 1; }
29 | to { -webkit-transform: scale(0.8); opacity: 0; }
30 | }
31 | @keyframes scaleOut {
32 | from { transform: scale(1); opacity: 1; }
33 | to { transform: scale(0.8); opacity: 0; }
34 | }
35 |
36 |
37 | // Super Scale In
38 | // Scale from super (1.x) to duper (1 in this case)
39 | // -------------------------------
40 |
41 | @-webkit-keyframes superScaleIn {
42 | from { -webkit-transform: scale(1.2); opacity: 0; }
43 | to { -webkit-transform: scale(1); opacity: 1 }
44 | }
45 | @keyframes superScaleIn {
46 | from { transform: scale(1.2); opacity: 0; }
47 | to { transform: scale(1); opacity: 1; }
48 | }
49 |
--------------------------------------------------------------------------------
/www/lib/ionic/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/exif-js/example/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Upload a local file to read Exif data.
9 |
10 |
11 |
12 |
13 | Click the images to read Exif data. The first image tests reading single tags, while the other two simply show all available data.
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_spinner.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Spinners
3 | * --------------------------------------------------
4 | */
5 |
6 | .spinner {
7 | svg {
8 | width: $spinner-width;
9 | height: $spinner-height;
10 | }
11 |
12 | stroke: $spinner-default-stroke;
13 | fill: $spinner-default-fill;
14 |
15 | &.spinner-light {
16 | stroke: $spinner-light-stroke;
17 | fill: $spinner-light-fill;
18 | }
19 | &.spinner-stable {
20 | stroke: $spinner-stable-stroke;
21 | fill: $spinner-stable-fill;
22 | }
23 | &.spinner-positive {
24 | stroke: $spinner-positive-stroke;
25 | fill: $spinner-positive-fill;
26 | }
27 | &.spinner-calm {
28 | stroke: $spinner-calm-stroke;
29 | fill: $spinner-calm-fill;
30 | }
31 | &.spinner-balanced {
32 | stroke: $spinner-balanced-stroke;
33 | fill: $spinner-balanced-fill;
34 | }
35 | &.spinner-assertive {
36 | stroke: $spinner-assertive-stroke;
37 | fill: $spinner-assertive-fill;
38 | }
39 | &.spinner-energized {
40 | stroke: $spinner-energized-stroke;
41 | fill: $spinner-energized-fill;
42 | }
43 | &.spinner-royal {
44 | stroke: $spinner-royal-stroke;
45 | fill: $spinner-royal-fill;
46 | }
47 | &.spinner-dark {
48 | stroke: $spinner-dark-stroke;
49 | fill: $spinner-dark-fill;
50 | }
51 | }
52 |
53 | .spinner-android {
54 | stroke: #4b8bf4;
55 | }
56 |
57 | .spinner-ios,
58 | .spinner-ios-small {
59 | stroke: #69717d;
60 | }
61 |
62 | .spinner-spiral {
63 | .stop1 {
64 | stop-color: $spinner-light-fill;
65 | stop-opacity: 0;
66 | }
67 |
68 | &.spinner-light {
69 | .stop1 {
70 | stop-color: $spinner-default-fill;
71 | }
72 | .stop2 {
73 | stop-color: $spinner-light-fill;
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/viewScroll.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @ngdoc object
3 | * @name ui.router.state.$uiViewScrollProvider
4 | *
5 | * @description
6 | * Provider that returns the {@link ui.router.state.$uiViewScroll} service function.
7 | */
8 | function $ViewScrollProvider() {
9 |
10 | var useAnchorScroll = false;
11 |
12 | /**
13 | * @ngdoc function
14 | * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll
15 | * @methodOf ui.router.state.$uiViewScrollProvider
16 | *
17 | * @description
18 | * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for
19 | * scrolling based on the url anchor.
20 | */
21 | this.useAnchorScroll = function () {
22 | useAnchorScroll = true;
23 | };
24 |
25 | /**
26 | * @ngdoc object
27 | * @name ui.router.state.$uiViewScroll
28 | *
29 | * @requires $anchorScroll
30 | * @requires $timeout
31 | *
32 | * @description
33 | * When called with a jqLite element, it scrolls the element into view (after a
34 | * `$timeout` so the DOM has time to refresh).
35 | *
36 | * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,
37 | * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.
38 | */
39 | this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {
40 | if (useAnchorScroll) {
41 | return $anchorScroll;
42 | }
43 |
44 | return function ($element) {
45 | $timeout(function () {
46 | $element[0].scrollIntoView();
47 | }, 0, false);
48 | };
49 | }];
50 | }
51 |
52 | angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);
53 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_badge.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Badges
4 | * --------------------------------------------------
5 | */
6 |
7 | .badge {
8 | @include badge-style($badge-default-bg, $badge-default-text);
9 | z-index: $z-index-badge;
10 | display: inline-block;
11 | padding: 3px 8px;
12 | min-width: 10px;
13 | border-radius: $badge-border-radius;
14 | vertical-align: baseline;
15 | text-align: center;
16 | white-space: nowrap;
17 | font-weight: $badge-font-weight;
18 | font-size: $badge-font-size;
19 | line-height: $badge-line-height;
20 |
21 | &:empty {
22 | display: none;
23 | }
24 | }
25 |
26 | //Be sure to override specificity of rule that 'badge color matches tab color by default'
27 | .tabs .tab-item .badge,
28 | .badge {
29 | &.badge-light {
30 | @include badge-style($badge-light-bg, $badge-light-text);
31 | }
32 | &.badge-stable {
33 | @include badge-style($badge-stable-bg, $badge-stable-text);
34 | }
35 | &.badge-positive {
36 | @include badge-style($badge-positive-bg, $badge-positive-text);
37 | }
38 | &.badge-calm {
39 | @include badge-style($badge-calm-bg, $badge-calm-text);
40 | }
41 | &.badge-assertive {
42 | @include badge-style($badge-assertive-bg, $badge-assertive-text);
43 | }
44 | &.badge-balanced {
45 | @include badge-style($badge-balanced-bg, $badge-balanced-text);
46 | }
47 | &.badge-energized {
48 | @include badge-style($badge-energized-bg, $badge-energized-text);
49 | }
50 | &.badge-royal {
51 | @include badge-style($badge-royal-bg, $badge-royal-text);
52 | }
53 | &.badge-dark {
54 | @include badge-style($badge-dark-bg, $badge-dark-text);
55 | }
56 | }
57 |
58 | // Quick fix for labels/badges in buttons
59 | .button .badge {
60 | position: relative;
61 | top: -1px;
62 | }
63 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_platform.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Platform
4 | * --------------------------------------------------
5 | * Platform specific tweaks
6 | */
7 |
8 | .platform-ios.platform-cordova {
9 | // iOS has a status bar which sits on top of the header.
10 | // Bump down everything to make room for it. However, if
11 | // if its in Cordova, and set to fullscreen, then disregard the bump.
12 | &:not(.fullscreen) {
13 | .bar-header:not(.bar-subheader) {
14 | height: $bar-height + $ios-statusbar-height;
15 |
16 | &.item-input-inset .item-input-wrapper {
17 | margin-top: 19px !important;
18 | }
19 |
20 | > * {
21 | margin-top: $ios-statusbar-height;
22 | }
23 | }
24 | .tabs-top > .tabs,
25 | .tabs.tabs-top {
26 | top: $bar-height + $ios-statusbar-height;
27 | }
28 |
29 | .has-header,
30 | .bar-subheader {
31 | top: $bar-height + $ios-statusbar-height;
32 | }
33 | .has-subheader {
34 | top: $bar-height + $bar-subheader-height + $ios-statusbar-height;
35 | }
36 | .has-header.has-tabs-top {
37 | top: $bar-height + $tabs-height + $ios-statusbar-height;
38 | }
39 | .has-header.has-subheader.has-tabs-top {
40 | top: $bar-height + $bar-subheader-height + $tabs-height + $ios-statusbar-height;
41 | }
42 | }
43 | &.status-bar-hide {
44 | // Cordova doesn't adjust the body height correctly, this makes up for it
45 | margin-bottom: 20px;
46 | }
47 | }
48 |
49 | @media (orientation:landscape) {
50 | .platform-ios.platform-browser.platform-ipad {
51 | position: fixed; // required for iPad 7 Safari
52 | }
53 | }
54 |
55 | .platform-c:not(.enable-transitions) * {
56 | // disable transitions on grade-c devices (Android 2)
57 | -webkit-transition: none !important;
58 | transition: none !important;
59 | }
60 |
--------------------------------------------------------------------------------
/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 | // must spin entire element for android 4.3 and below
42 | @extend .#{$ionicons-prefix}spin;
43 | }
44 |
45 | .#{$ionicons-prefix}loading-a {
46 | -webkit-animation-timing-function: steps(8, start);
47 | -moz-animation-timing-function: steps(8, start);
48 | animation-timing-function: steps(8, start);
49 | }
50 |
51 | .#{$ionicons-prefix}loading-a:before {
52 | @extend .#{$ionicons-prefix}load-a:before;
53 | }
54 |
55 | .#{$ionicons-prefix}loading-b:before {
56 | @extend .#{$ionicons-prefix}load-b:before;
57 | }
58 |
59 | .#{$ionicons-prefix}loading-c:before {
60 | @extend .#{$ionicons-prefix}load-c:before;
61 | }
62 |
63 | .#{$ionicons-prefix}loading-d:before {
64 | @extend .#{$ionicons-prefix}load-d:before;
65 | }
66 |
67 | .#{$ionicons-prefix}looping:before {
68 | @extend .#{$ionicons-prefix}loop:before;
69 | }
70 |
71 | .#{$ionicons-prefix}refreshing:before {
72 | @extend .#{$ionicons-prefix}refresh:before;
73 | }
74 |
75 | .#{$ionicons-prefix}ios7-reloading:before {
76 | @extend .#{$ionicons-prefix}ios7-reload:before;
77 | }
78 |
--------------------------------------------------------------------------------
/www/lib/angular/README.md:
--------------------------------------------------------------------------------
1 | # packaged angular
2 |
3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the
4 | [main AngularJS repo](https://github.com/angular/angular.js).
5 | Please file issues and pull requests against that repo.
6 |
7 | ## Install
8 |
9 | You can install this package either with `npm` or with `bower`.
10 |
11 | ### npm
12 |
13 | ```shell
14 | npm install angular
15 | ```
16 |
17 | Then add a `
21 | ```
22 |
23 | Note that this package is not in CommonJS format, so doing `require('angular')` will return `undefined`.
24 | If you're using [Browserify](https://github.com/substack/node-browserify), you can use
25 | [exposify](https://github.com/thlorenz/exposify) to have `require('angular')` return the `angular`
26 | global.
27 |
28 | ### bower
29 |
30 | ```shell
31 | bower install angular
32 | ```
33 |
34 | Then add a `
38 | ```
39 |
40 | ## Documentation
41 |
42 | Documentation is available on the
43 | [AngularJS docs site](http://docs.angularjs.org/).
44 |
45 | ## License
46 |
47 | The MIT License
48 |
49 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
50 |
51 | Permission is hereby granted, free of charge, to any person obtaining a copy
52 | of this software and associated documentation files (the "Software"), to deal
53 | in the Software without restriction, including without limitation the rights
54 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
55 | copies of the Software, and to permit persons to whom the Software is
56 | furnished to do so, subject to the following conditions:
57 |
58 | The above copyright notice and this permission notice shall be included in
59 | all copies or substantial portions of the Software.
60 |
61 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
62 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
63 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
64 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
65 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
66 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
67 | THE SOFTWARE.
68 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/view.js:
--------------------------------------------------------------------------------
1 |
2 | $ViewProvider.$inject = [];
3 | function $ViewProvider() {
4 |
5 | this.$get = $get;
6 | /**
7 | * @ngdoc object
8 | * @name ui.router.state.$view
9 | *
10 | * @requires ui.router.util.$templateFactory
11 | * @requires $rootScope
12 | *
13 | * @description
14 | *
15 | */
16 | $get.$inject = ['$rootScope', '$templateFactory'];
17 | function $get( $rootScope, $templateFactory) {
18 | return {
19 | // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })
20 | /**
21 | * @ngdoc function
22 | * @name ui.router.state.$view#load
23 | * @methodOf ui.router.state.$view
24 | *
25 | * @description
26 | *
27 | * @param {string} name name
28 | * @param {object} options option object.
29 | */
30 | load: function load(name, options) {
31 | var result, defaults = {
32 | template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}
33 | };
34 | options = extend(defaults, options);
35 |
36 | if (options.view) {
37 | result = $templateFactory.fromConfig(options.view, options.params, options.locals);
38 | }
39 | if (result && options.notify) {
40 | /**
41 | * @ngdoc event
42 | * @name ui.router.state.$state#$viewContentLoading
43 | * @eventOf ui.router.state.$view
44 | * @eventType broadcast on root scope
45 | * @description
46 | *
47 | * Fired once the view **begins loading**, *before* the DOM is rendered.
48 | *
49 | * @param {Object} event Event object.
50 | * @param {Object} viewConfig The view config properties (template, controller, etc).
51 | *
52 | * @example
53 | *
54 | *
55 | * $scope.$on('$viewContentLoading',
56 | * function(event, viewConfig){
57 | * // Access to all the view config properties.
58 | * // and one special property 'targetView'
59 | * // viewConfig.targetView
60 | * });
61 | *
62 | */
63 | $rootScope.$broadcast('$viewContentLoading', options);
64 | }
65 | return result;
66 | }
67 | };
68 | }
69 | }
70 |
71 | angular.module('ui.router.state').provider('$view', $ViewProvider);
72 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_modal.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Modals
4 | * --------------------------------------------------
5 | * Modals are independent windows that slide in from off-screen.
6 | */
7 |
8 | .modal-backdrop {
9 | position: fixed;
10 | top: 0;
11 | left: 0;
12 | z-index: $z-index-modal;
13 | width: 100%;
14 | height: 100%;
15 | }
16 |
17 | .modal {
18 | display: block;
19 | position: absolute;
20 | top: 0;
21 | z-index: $z-index-modal;
22 | overflow: hidden;
23 | min-height: 100%;
24 | width: 100%;
25 | background-color: $modal-bg-color;
26 | }
27 |
28 | @media (min-width: $modal-inset-mode-break-point) {
29 | // inset mode is when the modal doesn't fill the entire
30 | // display but instead is centered within a large display
31 | .modal {
32 | top: $modal-inset-mode-top;
33 | right: $modal-inset-mode-right;
34 | bottom: $modal-inset-mode-bottom;
35 | left: $modal-inset-mode-left;
36 | overflow: visible;
37 | min-height: $modal-inset-mode-min-height;
38 | width: (100% - $modal-inset-mode-left - $modal-inset-mode-right);
39 | }
40 |
41 | .modal.ng-leave-active {
42 | bottom: 0;
43 | }
44 |
45 | // remove ios header padding from inset header
46 | .platform-ios.platform-cordova .modal-wrapper .modal{
47 | .bar-header:not(.bar-subheader) {
48 | height: $bar-height;
49 | > * {
50 | margin-top: 0;
51 | }
52 | }
53 | .tabs-top > .tabs,
54 | .tabs.tabs-top {
55 | top: $bar-height;
56 | }
57 | .has-header,
58 | .bar-subheader {
59 | top: $bar-height;
60 | }
61 | .has-subheader {
62 | top: $bar-height + $bar-subheader-height;
63 | }
64 | .has-tabs-top {
65 | top: $bar-height + $tabs-height;
66 | }
67 | .has-header.has-subheader.has-tabs-top {
68 | top: $bar-height + $bar-subheader-height + $tabs-height;
69 | }
70 | }
71 |
72 | .modal-backdrop {
73 | @include transition(background-color 300ms ease-in-out);
74 | background-color: $modal-backdrop-bg-inactive;
75 |
76 | &.active {
77 | background-color: $modal-backdrop-bg-active;
78 | }
79 | }
80 | }
81 |
82 | // disable clicks on all but the modal
83 | .modal-open {
84 | pointer-events: none;
85 |
86 | .modal,
87 | .modal-backdrop {
88 | pointer-events: auto;
89 | }
90 | // prevent clicks on modal when loading overlay is active though
91 | &.loading-active {
92 | .modal,
93 | .modal-backdrop {
94 | pointer-events: none;
95 | }
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/www/lib/angular-animate/README.md:
--------------------------------------------------------------------------------
1 | # packaged angular-animate
2 |
3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the
4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate).
5 | Please file issues and pull requests against that repo.
6 |
7 | ## Install
8 |
9 | You can install this package either with `npm` or with `bower`.
10 |
11 | ### npm
12 |
13 | ```shell
14 | npm install angular-animate
15 | ```
16 |
17 | Add a `
21 | ```
22 |
23 | Then add `ngAnimate` as a dependency for your app:
24 |
25 | ```javascript
26 | angular.module('myApp', ['ngAnimate']);
27 | ```
28 |
29 | Note that this package is not in CommonJS format, so doing `require('angular-animate')` will
30 | return `undefined`.
31 |
32 | ### bower
33 |
34 | ```shell
35 | bower install angular-animate
36 | ```
37 |
38 | Then add a `
42 | ```
43 |
44 | Then add `ngAnimate` as a dependency for your app:
45 |
46 | ```javascript
47 | angular.module('myApp', ['ngAnimate']);
48 | ```
49 |
50 | ## Documentation
51 |
52 | Documentation is available on the
53 | [AngularJS docs site](http://docs.angularjs.org/api/ngAnimate).
54 |
55 | ## License
56 |
57 | The MIT License
58 |
59 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
60 |
61 | Permission is hereby granted, free of charge, to any person obtaining a copy
62 | of this software and associated documentation files (the "Software"), to deal
63 | in the Software without restriction, including without limitation the rights
64 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
65 | copies of the Software, and to permit persons to whom the Software is
66 | furnished to do so, subject to the following conditions:
67 |
68 | The above copyright notice and this permission notice shall be included in
69 | all copies or substantial portions of the Software.
70 |
71 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
72 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
73 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
74 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
75 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
76 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
77 | THE SOFTWARE.
78 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/README.md:
--------------------------------------------------------------------------------
1 | # packaged angular-sanitize
2 |
3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the
4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize).
5 | Please file issues and pull requests against that repo.
6 |
7 | ## Install
8 |
9 | You can install this package either with `npm` or with `bower`.
10 |
11 | ### npm
12 |
13 | ```shell
14 | npm install angular-sanitize
15 | ```
16 |
17 | Add a `
21 | ```
22 |
23 | Then add `ngSanitize` as a dependency for your app:
24 |
25 | ```javascript
26 | angular.module('myApp', ['ngSanitize']);
27 | ```
28 |
29 | Note that this package is not in CommonJS format, so doing `require('angular-sanitize')` will
30 | return `undefined`.
31 |
32 | ### bower
33 |
34 | ```shell
35 | bower install angular-sanitize
36 | ```
37 |
38 | Add a `
42 | ```
43 |
44 | Then add `ngSanitize` as a dependency for your app:
45 |
46 | ```javascript
47 | angular.module('myApp', ['ngSanitize']);
48 | ```
49 |
50 | ## Documentation
51 |
52 | Documentation is available on the
53 | [AngularJS docs site](http://docs.angularjs.org/api/ngSanitize).
54 |
55 | ## License
56 |
57 | The MIT License
58 |
59 | Copyright (c) 2010-2012 Google, Inc. http://angularjs.org
60 |
61 | Permission is hereby granted, free of charge, to any person obtaining a copy
62 | of this software and associated documentation files (the "Software"), to deal
63 | in the Software without restriction, including without limitation the rights
64 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
65 | copies of the Software, and to permit persons to whom the Software is
66 | furnished to do so, subject to the following conditions:
67 |
68 | The above copyright notice and this permission notice shall be included in
69 | all copies or substantial portions of the Software.
70 |
71 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
72 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
73 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
74 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
75 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
76 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
77 | THE SOFTWARE.
78 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_popup.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Popups
4 | * --------------------------------------------------
5 | */
6 |
7 | .popup-container {
8 | position: absolute;
9 | top: 0;
10 | left: 0;
11 | bottom: 0;
12 | right: 0;
13 | background: rgba(0,0,0,0);
14 |
15 | @include display-flex();
16 | @include justify-content(center);
17 | @include align-items(center);
18 |
19 | z-index: $z-index-popup;
20 |
21 | // Start hidden
22 | visibility: hidden;
23 | &.popup-showing {
24 | visibility: visible;
25 | }
26 |
27 | &.popup-hidden .popup {
28 | @include animation-name(scaleOut);
29 | @include animation-duration($popup-leave-animation-duration);
30 | @include animation-timing-function(ease-in-out);
31 | @include animation-fill-mode(both);
32 | }
33 |
34 | &.active .popup {
35 | @include animation-name(superScaleIn);
36 | @include animation-duration($popup-enter-animation-duration);
37 | @include animation-timing-function(ease-in-out);
38 | @include animation-fill-mode(both);
39 | }
40 |
41 | .popup {
42 | width: $popup-width;
43 | max-width: 100%;
44 | max-height: 90%;
45 |
46 | border-radius: $popup-border-radius;
47 | background-color: $popup-background-color;
48 |
49 | @include display-flex();
50 | @include flex-direction(column);
51 | }
52 |
53 | input,
54 | textarea {
55 | width: 100%;
56 | }
57 | }
58 |
59 | .popup-head {
60 | padding: 15px 10px;
61 | border-bottom: 1px solid #eee;
62 | text-align: center;
63 | }
64 | .popup-title {
65 | margin: 0;
66 | padding: 0;
67 | font-size: 15px;
68 | }
69 | .popup-sub-title {
70 | margin: 5px 0 0 0;
71 | padding: 0;
72 | font-weight: normal;
73 | font-size: 11px;
74 | }
75 | .popup-body {
76 | padding: 10px;
77 | overflow: scroll;
78 | }
79 |
80 | .popup-buttons {
81 | @include display-flex();
82 | @include flex-direction(row);
83 | padding: 10px;
84 | min-height: $popup-button-min-height + 20;
85 |
86 | .button {
87 | @include flex(1);
88 | display: block;
89 | min-height: $popup-button-min-height;
90 | border-radius: $popup-button-border-radius;
91 | line-height: $popup-button-line-height;
92 |
93 | margin-right: 5px;
94 | &:last-child {
95 | margin-right: 0px;
96 | }
97 | }
98 | }
99 |
100 | .popup-open {
101 | pointer-events: none;
102 |
103 | &.modal-open .modal {
104 | pointer-events: none;
105 | }
106 |
107 | .popup-backdrop, .popup {
108 | pointer-events: auto;
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/www/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Ask Alfred
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 | Ask Alfred
33 |
34 |
35 |
36 |
37 |
{{ message.text }}
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
{{message.time}}
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | Send
55 |
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_list.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Lists
4 | * --------------------------------------------------
5 | */
6 |
7 | .list {
8 | position: relative;
9 | padding-top: $item-border-width;
10 | padding-bottom: $item-border-width;
11 | padding-left: 0; // reset padding because ul and ol
12 | margin-bottom: 20px;
13 | }
14 | .list:last-child {
15 | margin-bottom: 0px;
16 | &.card{
17 | margin-bottom:40px;
18 | }
19 | }
20 |
21 |
22 | /**
23 | * List Header
24 | * --------------------------------------------------
25 | */
26 |
27 | .list-header {
28 | margin-top: $list-header-margin-top;
29 | padding: $list-header-padding;
30 | background-color: $list-header-bg;
31 | color: $list-header-color;
32 | font-weight: bold;
33 | }
34 |
35 | // when its a card make sure it doesn't duplicate top and bottom borders
36 | .card.list .list-item {
37 | padding-right: 1px;
38 | padding-left: 1px;
39 | }
40 |
41 |
42 | /**
43 | * Cards and Inset Lists
44 | * --------------------------------------------------
45 | * A card and list-inset are close to the same thing, except a card as a box shadow.
46 | */
47 |
48 | .card,
49 | .list-inset {
50 | overflow: hidden;
51 | margin: ($content-padding * 2) $content-padding;
52 | border-radius: $card-border-radius;
53 | background-color: $card-body-bg;
54 | }
55 |
56 | .card {
57 | padding-top: $item-border-width;
58 | padding-bottom: $item-border-width;
59 | box-shadow: $card-box-shadow;
60 |
61 | .item {
62 | border-left: 0;
63 | border-right: 0;
64 | }
65 | .item:first-child {
66 | border-top: 0;
67 | }
68 | .item:last-child {
69 | border-bottom: 0;
70 | }
71 | }
72 |
73 | .padding {
74 | .card, .list-inset {
75 | margin-left: 0;
76 | margin-right: 0;
77 | }
78 | }
79 |
80 | .card .item,
81 | .list-inset .item,
82 | .padding > .list .item
83 | {
84 | &:first-child {
85 | border-top-left-radius: $card-border-radius;
86 | border-top-right-radius: $card-border-radius;
87 |
88 | .item-content {
89 | border-top-left-radius: $card-border-radius;
90 | border-top-right-radius: $card-border-radius;
91 | }
92 | }
93 | &:last-child {
94 | border-bottom-right-radius: $card-border-radius;
95 | border-bottom-left-radius: $card-border-radius;
96 |
97 | .item-content {
98 | border-bottom-right-radius: $card-border-radius;
99 | border-bottom-left-radius: $card-border-radius;
100 | }
101 | }
102 | }
103 |
104 | .card .item:last-child,
105 | .list-inset .item:last-child {
106 | margin-bottom: $item-border-width * -1;
107 | }
108 |
109 | .card .item,
110 | .list-inset .item,
111 | .padding > .list .item,
112 | .padding-horizontal > .list .item {
113 | margin-right: 0;
114 | margin-left: 0;
115 |
116 | &.item-input input {
117 | padding-right: 44px;
118 | }
119 | }
120 | .padding-left > .list .item {
121 | margin-left: 0;
122 | }
123 | .padding-right > .list .item {
124 | margin-right: 0;
125 | }
126 |
--------------------------------------------------------------------------------
/hooks/after_prepare/010_add_platform_class.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | // Add Platform Class
4 | // v1.0
5 | // Automatically adds the platform class to the body tag
6 | // after the `prepare` command. By placing the platform CSS classes
7 | // directly in the HTML built for the platform, it speeds up
8 | // rendering the correct layout/style for the specific platform
9 | // instead of waiting for the JS to figure out the correct classes.
10 |
11 | var fs = require('fs');
12 | var path = require('path');
13 |
14 | var rootdir = process.argv[2];
15 |
16 | function addPlatformBodyTag(indexPath, platform) {
17 | // add the platform class to the body tag
18 | try {
19 | var platformClass = 'platform-' + platform;
20 | var cordovaClass = 'platform-cordova platform-webview';
21 |
22 | var html = fs.readFileSync(indexPath, 'utf8');
23 |
24 | var bodyTag = findBodyTag(html);
25 | if(!bodyTag) return; // no opening body tag, something's wrong
26 |
27 | if(bodyTag.indexOf(platformClass) > -1) return; // already added
28 |
29 | var newBodyTag = bodyTag;
30 |
31 | var classAttr = findClassAttr(bodyTag);
32 | if(classAttr) {
33 | // body tag has existing class attribute, add the classname
34 | var endingQuote = classAttr.substring(classAttr.length-1);
35 | var newClassAttr = classAttr.substring(0, classAttr.length-1);
36 | newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote;
37 | newBodyTag = bodyTag.replace(classAttr, newClassAttr);
38 |
39 | } else {
40 | // add class attribute to the body tag
41 | newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">');
42 | }
43 |
44 | html = html.replace(bodyTag, newBodyTag);
45 |
46 | fs.writeFileSync(indexPath, html, 'utf8');
47 |
48 | process.stdout.write('add to body class: ' + platformClass + '\n');
49 | } catch(e) {
50 | process.stdout.write(e);
51 | }
52 | }
53 |
54 | function findBodyTag(html) {
55 | // get the body tag
56 | try{
57 | return html.match(/])(.*?)>/gi)[0];
58 | }catch(e){}
59 | }
60 |
61 | function findClassAttr(bodyTag) {
62 | // get the body tag's class attribute
63 | try{
64 | return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0];
65 | }catch(e){}
66 | }
67 |
68 | if (rootdir) {
69 |
70 | // go through each of the platform directories that have been prepared
71 | var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []);
72 |
73 | for(var x=0; x .scroll{
83 | &.overscroll{
84 | position:fixed;
85 | }
86 | -webkit-overflow-scrolling:touch;
87 | width:100%;
88 | }
89 |
90 | @-webkit-keyframes refresh-spin {
91 | 0% { -webkit-transform: translate3d(0,0,0) rotate(0); }
92 | 100% { -webkit-transform: translate3d(0,0,0) rotate(180deg); }
93 | }
94 |
95 | @keyframes refresh-spin {
96 | 0% { transform: translate3d(0,0,0) rotate(0); }
97 | 100% { transform: translate3d(0,0,0) rotate(180deg); }
98 | }
99 |
100 | @-webkit-keyframes refresh-spin-back {
101 | 0% { -webkit-transform: translate3d(0,0,0) rotate(180deg); }
102 | 100% { -webkit-transform: translate3d(0,0,0) rotate(0); }
103 | }
104 |
105 | @keyframes refresh-spin-back {
106 | 0% { transform: translate3d(0,0,0) rotate(180deg); }
107 | 100% { transform: translate3d(0,0,0) rotate(0); }
108 | }
109 |
--------------------------------------------------------------------------------
/hooks/README.md:
--------------------------------------------------------------------------------
1 |
21 | # Cordova Hooks
22 |
23 | This directory may contain scripts used to customize cordova commands. This
24 | directory used to exist at `.cordova/hooks`, but has now been moved to the
25 | project root. Any scripts you add to these directories will be executed before
26 | and after the commands corresponding to the directory name. Useful for
27 | integrating your own build systems or integrating with version control systems.
28 |
29 | __Remember__: Make your scripts executable.
30 |
31 | ## Hook Directories
32 | The following subdirectories will be used for hooks:
33 |
34 | after_build/
35 | after_compile/
36 | after_docs/
37 | after_emulate/
38 | after_platform_add/
39 | after_platform_rm/
40 | after_platform_ls/
41 | after_plugin_add/
42 | after_plugin_ls/
43 | after_plugin_rm/
44 | after_plugin_search/
45 | after_prepare/
46 | after_run/
47 | after_serve/
48 | before_build/
49 | before_compile/
50 | before_docs/
51 | before_emulate/
52 | before_platform_add/
53 | before_platform_rm/
54 | before_platform_ls/
55 | before_plugin_add/
56 | before_plugin_ls/
57 | before_plugin_rm/
58 | before_plugin_search/
59 | before_prepare/
60 | before_run/
61 | before_serve/
62 | pre_package/ <-- Windows 8 and Windows Phone only.
63 |
64 | ## Script Interface
65 |
66 | All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables:
67 |
68 | * CORDOVA_VERSION - The version of the Cordova-CLI.
69 | * CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios).
70 | * CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer)
71 | * CORDOVA_HOOK - Path to the hook that is being executed.
72 | * CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate)
73 |
74 | If a script returns a non-zero exit code, then the parent cordova command will be aborted.
75 |
76 |
77 | ## Writing hooks
78 |
79 | We highly recommend writting your hooks using Node.js so that they are
80 | cross-platform. Some good examples are shown here:
81 |
82 | [http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/)
83 |
84 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_select.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Select
4 | * --------------------------------------------------
5 | */
6 |
7 | .item-select {
8 | position: relative;
9 |
10 | select {
11 | @include appearance(none);
12 | position: absolute;
13 | top: 0;
14 | 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/_range.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Range
4 | * --------------------------------------------------
5 | */
6 |
7 | .range input{
8 | display: inline-block;
9 | overflow: hidden;
10 | margin-top: 5px;
11 | margin-bottom: 5px;
12 | padding-right: 2px;
13 | padding-left: 1px;
14 | width: auto;
15 | height: $range-slider-height + 15;
16 | outline: none;
17 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, $range-default-track-bg), color-stop(100%, $range-default-track-bg));
18 | background: linear-gradient(to right, $range-default-track-bg 0%, $range-default-track-bg 100%);
19 | background-position: center;
20 | background-size: 99% $range-track-height;
21 | background-repeat: no-repeat;
22 | -webkit-appearance: none;
23 |
24 | &::-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: $range-slider-box-shadow;
31 | cursor: pointer;
32 | -webkit-appearance: none;
33 | border: 0;
34 | }
35 |
36 | &::-webkit-slider-thumb:before {
37 | /* what creates the colorful line on the left side of the slider */
38 | position: absolute;
39 | top: ($range-slider-height / 2) - ($range-track-height / 2);
40 | left: -2001px;
41 | width: 2000px;
42 | height: $range-track-height;
43 | background: $dark;
44 | content: ' ';
45 | }
46 |
47 | &::-webkit-slider-thumb:after {
48 | /* create a larger (but hidden) hit area */
49 | position: absolute;
50 | top: -15px;
51 | left: -15px;
52 | padding: 30px;
53 | content: ' ';
54 | //background: red;
55 | //opacity: .5;
56 | }
57 |
58 | }
59 |
60 | .range {
61 | @include display-flex();
62 | @include align-items(center);
63 | padding: 2px 11px;
64 |
65 | &.range-light {
66 | input { @include range-style($range-light-track-bg); }
67 | }
68 | &.range-stable {
69 | input { @include range-style($range-stable-track-bg); }
70 | }
71 | &.range-positive {
72 | input { @include range-style($range-positive-track-bg); }
73 | }
74 | &.range-calm {
75 | input { @include range-style($range-calm-track-bg); }
76 | }
77 | &.range-balanced {
78 | input { @include range-style($range-balanced-track-bg); }
79 | }
80 | &.range-assertive {
81 | input { @include range-style($range-assertive-track-bg); }
82 | }
83 | &.range-energized {
84 | input { @include range-style($range-energized-track-bg); }
85 | }
86 | &.range-royal {
87 | input { @include range-style($range-royal-track-bg); }
88 | }
89 | &.range-dark {
90 | input { @include range-style($range-dark-track-bg); }
91 | }
92 | }
93 |
94 | .range .icon {
95 | @include flex(0);
96 | display: block;
97 | min-width: $range-icon-size;
98 | text-align: center;
99 | font-size: $range-icon-size;
100 | }
101 |
102 | .range input {
103 | @include flex(1);
104 | display: block;
105 | margin-right: 10px;
106 | margin-left: 10px;
107 | }
108 |
109 | .range-label {
110 | @include flex(0, 0, auto);
111 | display: block;
112 | white-space: nowrap;
113 | }
114 |
115 | .range-label:first-child {
116 | padding-left: 5px;
117 | }
118 | .range input + .range-label {
119 | padding-right: 5px;
120 | padding-left: 0;
121 | }
122 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_action-sheet.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Action Sheets
3 | * --------------------------------------------------
4 | */
5 |
6 | .action-sheet-backdrop {
7 | @include transition(background-color 150ms 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.4);
18 | }
19 | }
20 |
21 | .action-sheet-wrapper {
22 | @include translate3d(0, 100%, 0);
23 | @include transition(all cubic-bezier(.36, .66, .04, 1) 500ms);
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: $sheet-margin;
35 | margin-right: $sheet-margin;
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 | border-color: $sheet-options-border-color;
46 | background-color: transparent;
47 |
48 | color: $sheet-options-text-color;
49 | font-size: 21px;
50 |
51 | &:hover {
52 | color: $sheet-options-text-color;
53 | }
54 | &.destructive {
55 | color: #ff3b30;
56 | &:hover {
57 | color: #ff3b30;
58 | }
59 | }
60 | }
61 |
62 | .button.active, .button.activated {
63 | box-shadow: none;
64 | border-color: $sheet-options-border-color;
65 | color: $sheet-options-text-color;
66 | background: $sheet-options-bg-active-color;
67 | }
68 | }
69 |
70 | .action-sheet-has-icons .icon {
71 | position: absolute;
72 | left: 16px;
73 | }
74 |
75 | .action-sheet-title {
76 | padding: $sheet-margin * 2;
77 | color: #8f8f8f;
78 | text-align: center;
79 | font-size: 13px;
80 | }
81 |
82 | .action-sheet-group {
83 | margin-bottom: $sheet-margin;
84 | border-radius: $sheet-border-radius;
85 | background-color: #fff;
86 | overflow: hidden;
87 |
88 | .button {
89 | border-width: 1px 0px 0px 0px;
90 | }
91 | .button:first-child:last-child {
92 | border-width: 0;
93 | }
94 | }
95 |
96 | .action-sheet-options {
97 | background: $sheet-options-bg-color;
98 | }
99 |
100 | .action-sheet-cancel {
101 | .button {
102 | font-weight: 500;
103 | }
104 | }
105 |
106 | .action-sheet-open {
107 | pointer-events: none;
108 |
109 | &.modal-open .modal {
110 | pointer-events: none;
111 | }
112 |
113 | .action-sheet-backdrop {
114 | pointer-events: auto;
115 | }
116 | }
117 |
118 |
119 | .platform-android {
120 |
121 | .action-sheet-backdrop.active {
122 | background-color: rgba(0,0,0,0.2);
123 | }
124 |
125 | .action-sheet {
126 | margin: 0;
127 |
128 | .action-sheet-title,
129 | .button {
130 | text-align: left;
131 | border-color: transparent;
132 | font-size: 16px;
133 | color: inherit;
134 | }
135 |
136 | .action-sheet-title {
137 | font-size: 14px;
138 | padding: 16px;
139 | color: #666;
140 | }
141 |
142 | .button.active,
143 | .button.activated {
144 | background: #e8e8e8;
145 | }
146 | }
147 |
148 | .action-sheet-group {
149 | margin: 0;
150 | border-radius: 0;
151 | background-color: #fafafa;
152 | }
153 |
154 | .action-sheet-cancel {
155 | display: none;
156 | }
157 |
158 | .action-sheet-has-icons {
159 |
160 | .button {
161 | padding-left: 56px;
162 | }
163 |
164 | }
165 |
166 | }
167 |
--------------------------------------------------------------------------------
/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-no-padding {
22 | padding: 0;
23 |
24 | > .col {
25 | padding: 0;
26 | }
27 | }
28 |
29 | .row + .row {
30 | margin-top: ($grid-padding-width / 2) * -1;
31 | padding-top: 0;
32 | }
33 |
34 | .col {
35 | @include flex(1);
36 | display: block;
37 | padding: ($grid-padding-width / 2);
38 | width: 100%;
39 | }
40 |
41 |
42 | /* Vertically Align Columns */
43 | /* .row-* vertically aligns every .col in the .row */
44 | .row-top {
45 | @include align-items(flex-start);
46 | }
47 | .row-bottom {
48 | @include align-items(flex-end);
49 | }
50 | .row-center {
51 | @include align-items(center);
52 | }
53 | .row-stretch {
54 | @include align-items(stretch);
55 | }
56 | .row-baseline {
57 | @include align-items(baseline);
58 | }
59 |
60 | /* .col-* vertically aligns an individual .col */
61 | .col-top {
62 | @include align-self(flex-start);
63 | }
64 | .col-bottom {
65 | @include align-self(flex-end);
66 | }
67 | .col-center {
68 | @include align-self(center);
69 | }
70 |
71 | /* Column Offsets */
72 | .col-offset-10 {
73 | margin-left: 10%;
74 | }
75 | .col-offset-20 {
76 | margin-left: 20%;
77 | }
78 | .col-offset-25 {
79 | margin-left: 25%;
80 | }
81 | .col-offset-33, .col-offset-34 {
82 | margin-left: 33.3333%;
83 | }
84 | .col-offset-50 {
85 | margin-left: 50%;
86 | }
87 | .col-offset-66, .col-offset-67 {
88 | margin-left: 66.6666%;
89 | }
90 | .col-offset-75 {
91 | margin-left: 75%;
92 | }
93 | .col-offset-80 {
94 | margin-left: 80%;
95 | }
96 | .col-offset-90 {
97 | margin-left: 90%;
98 | }
99 |
100 |
101 | /* Explicit Column Percent Sizes */
102 | /* By default each grid column will evenly distribute */
103 | /* across the grid. However, you can specify individual */
104 | /* columns to take up a certain size of the available area */
105 | .col-10 {
106 | @include flex(0, 0, 10%);
107 | max-width: 10%;
108 | }
109 | .col-20 {
110 | @include flex(0, 0, 20%);
111 | max-width: 20%;
112 | }
113 | .col-25 {
114 | @include flex(0, 0, 25%);
115 | max-width: 25%;
116 | }
117 | .col-33, .col-34 {
118 | @include flex(0, 0, 33.3333%);
119 | max-width: 33.3333%;
120 | }
121 | .col-50 {
122 | @include flex(0, 0, 50%);
123 | max-width: 50%;
124 | }
125 | .col-66, .col-67 {
126 | @include flex(0, 0, 66.6666%);
127 | max-width: 66.6666%;
128 | }
129 | .col-75 {
130 | @include flex(0, 0, 75%);
131 | max-width: 75%;
132 | }
133 | .col-80 {
134 | @include flex(0, 0, 80%);
135 | max-width: 80%;
136 | }
137 | .col-90 {
138 | @include flex(0, 0, 90%);
139 | max-width: 90%;
140 | }
141 |
142 |
143 | /* Responsive Grid Classes */
144 | /* Adding a class of responsive-X to a row */
145 | /* will trigger the flex-direction to */
146 | /* change to column and add some margin */
147 | /* to any columns in the row for clearity */
148 |
149 | @include responsive-grid-break('.responsive-sm', $grid-responsive-sm-break);
150 | @include responsive-grid-break('.responsive-md', $grid-responsive-md-break);
151 | @include responsive-grid-break('.responsive-lg', $grid-responsive-lg-break);
152 |
--------------------------------------------------------------------------------
/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/_popover.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Popovers
4 | * --------------------------------------------------
5 | * Popovers are independent views which float over content
6 | */
7 |
8 | .popover-backdrop {
9 | position: fixed;
10 | top: 0;
11 | left: 0;
12 | z-index: $z-index-popover;
13 | width: 100%;
14 | height: 100%;
15 | background-color: $popover-backdrop-bg-inactive;
16 |
17 | &.active {
18 | background-color: $popover-backdrop-bg-active;
19 | }
20 | }
21 |
22 | .popover {
23 | position: absolute;
24 | top: 25%;
25 | left: 50%;
26 | z-index: $z-index-popover;
27 | display: block;
28 | margin-top: 12px;
29 | margin-left: -$popover-width / 2;
30 | height: $popover-height;
31 | width: $popover-width;
32 | background-color: $popover-bg-color;
33 | box-shadow: $popover-box-shadow;
34 | opacity: 0;
35 |
36 | .item:first-child {
37 | border-top: 0;
38 | }
39 |
40 | .item:last-child {
41 | border-bottom: 0;
42 | }
43 |
44 | &.popover-bottom {
45 | margin-top: -12px;
46 | }
47 | }
48 |
49 |
50 | // Set popover border-radius
51 | .popover,
52 | .popover .bar-header {
53 | border-radius: $popover-border-radius;
54 | }
55 | .popover .scroll-content {
56 | z-index: 1;
57 | margin: 2px 0;
58 | }
59 | .popover .bar-header {
60 | border-bottom-right-radius: 0;
61 | border-bottom-left-radius: 0;
62 | }
63 | .popover .has-header {
64 | border-top-right-radius: 0;
65 | border-top-left-radius: 0;
66 | }
67 | .popover-arrow {
68 | display: none;
69 | }
70 |
71 |
72 | // iOS Popover
73 | .platform-ios {
74 |
75 | .popover {
76 | box-shadow: $popover-box-shadow-ios;
77 | border-radius: $popover-border-radius-ios;
78 | }
79 | .popover .bar-header {
80 | @include border-top-radius($popover-border-radius-ios);
81 | }
82 | .popover .scroll-content {
83 | margin: 8px 0;
84 | border-radius: $popover-border-radius-ios;
85 | }
86 | .popover .scroll-content.has-header {
87 | margin-top: 0;
88 | }
89 | .popover-arrow {
90 | position: absolute;
91 | display: block;
92 | top: -17px;
93 | width: 30px;
94 | height: 19px;
95 | overflow: hidden;
96 |
97 | &:after {
98 | position: absolute;
99 | top: 12px;
100 | left: 5px;
101 | width: 20px;
102 | height: 20px;
103 | background-color: $popover-bg-color;
104 | border-radius: 3px;
105 | content: '';
106 | @include rotate(-45deg);
107 | }
108 | }
109 | .popover-bottom .popover-arrow {
110 | top: auto;
111 | bottom: -10px;
112 | &:after {
113 | top: -6px;
114 | }
115 | }
116 | }
117 |
118 |
119 | // Android Popover
120 | .platform-android {
121 |
122 | .popover {
123 | margin-top: -32px;
124 | background-color: $popover-bg-color-android;
125 | box-shadow: $popover-box-shadow-android;
126 |
127 | .item {
128 | border-color: $popover-bg-color-android;
129 | background-color: $popover-bg-color-android;
130 | color: #4d4d4d;
131 | }
132 | &.popover-bottom {
133 | margin-top: 32px;
134 | }
135 | }
136 |
137 | .popover-backdrop,
138 | .popover-backdrop.active {
139 | background-color: transparent;
140 | }
141 | }
142 |
143 |
144 | // disable clicks on all but the popover
145 | .popover-open {
146 | pointer-events: none;
147 |
148 | .popover,
149 | .popover-backdrop {
150 | pointer-events: auto;
151 | }
152 | // prevent clicks on popover when loading overlay is active though
153 | &.loading-active {
154 | .popover,
155 | .popover-backdrop {
156 | pointer-events: none;
157 | }
158 | }
159 | }
160 |
161 |
162 | // wider popover on larger viewports
163 | @media (min-width: $popover-large-break-point) {
164 | .popover {
165 | width: $popover-large-width;
166 | }
167 | }
168 |
--------------------------------------------------------------------------------
/scss/ionic.app.scss:
--------------------------------------------------------------------------------
1 | /*
2 | To customize the look and feel of Ionic, you can override the variables
3 | in ionic's _variables.scss file.
4 |
5 | For example, you might change some of the default colors:
6 |
7 | $light: #fff !default;
8 | $stable: #f8f8f8 !default;
9 | $positive: #387ef5 !default;
10 | $calm: #11c1f3 !default;
11 | $balanced: #33cd5f !default;
12 | $energized: #ffc900 !default;
13 | $assertive: #ef473a !default;
14 | $royal: #886aea !default;
15 | $dark: #444 !default;
16 | */
17 |
18 | $stable: #f8f8f8 !default;
19 |
20 | // The path for our ionicons font files, relative to the built CSS in www/css
21 | $ionicons-font-path: "../lib/ionic/fonts" !default;
22 |
23 | // Include all of Ionic
24 | @import "www/lib/ionic/scss/ionic";
25 |
26 |
27 |
28 | .scroll {
29 | padding: 10px 0 50px !important;
30 | }
31 | .messages {
32 | display: -webkit-box !important;
33 | display: -moz-box !important;
34 | display: -ms-flexbox !important;
35 | display: -webkit-flex !important;
36 | display: flex !important;
37 | -webkit-align-content: center !important;
38 | -ms-flex-line-pack: center !important;
39 | align-content: center !important;
40 | -webkit-box-align: center !important;
41 | -moz-box-align: center !important;
42 | -webkit-align-items: center !important;
43 | -ms-flex-align: center !important;
44 | align-items: center !important;
45 | margin-bottom: 20px !important;
46 | .message {
47 | -webkit-box-flex: 1 !important;
48 | -moz-box-flex: 1 !important;
49 | -webkit-flex: 1 1 auto !important;
50 | -ms-flex: 1 1 auto !important;
51 | flex: 1 1 auto !important;
52 | padding: 10px !important;
53 | -webkit-transition: all 250ms ease-in-out !important;
54 | transition: all 250ms ease-in-out !important;
55 | overflow: hidden !important;
56 | text-align: left !important;
57 | -webkit-transform: translate3d(0, 0, 0) !important;
58 | -moz-transform: translate3d(0, 0, 0) !important;
59 | transform: translate3d(0, 0, 0) !important;
60 | }
61 | }
62 | .time {
63 | -webkit-box-flex: 0 !important;
64 | -moz-box-flex: 0 !important;
65 | -webkit-flex: 0 1 auto !important;
66 | -ms-flex: 0 1 auto !important;
67 | flex: 0 1 auto !important;
68 | -webkit-align-self: auto !important;
69 | -ms-flex-item-align: auto !important;
70 | align-self: auto !important;
71 | width: 120px !important;
72 | text-align: center !important;
73 | padding: 0 0 0 0 !important;
74 | -webkit-transition: all 250ms ease-in-out !important;
75 | transition: all 250ms ease-in-out !important;
76 | -webkit-transform: translate3d(10px, 0, 0) !important;
77 | -moz-transform: translate3d(10px, 0, 0) !important;
78 | transform: translate3d(10px, 0, 0) !important;
79 | &.slide-right {
80 | -webkit-transform: translate3d(130px, 0, 0) !important;
81 | -moz-transform: translate3d(130px, 0, 0) !important;
82 | transform: translate3d(130px, 0, 0) !important;
83 | }
84 | }
85 | //This will change
86 | .messages.other {
87 | .message {
88 | -webkit-transform: translate3d(0, 0, 0) !important;
89 | -moz-transform: translate3d(0, 0, 0) !important;
90 | transform: translate3d(0, 0, 0) !important;
91 | text-align: right !important;
92 | }
93 | .message.slide-right {
94 | -webkit-transform: translate3d(120px, 0, 0) !important;
95 | -moz-transform: translate3d(120px, 0, 0) !important;
96 | transform: translate3d(120px, 0, 0) !important;
97 | }
98 | span {
99 | color: black !important;
100 | background-color: #C7C7CC !important;
101 | }
102 | }
103 | span {
104 | background: #007AFF !important;
105 | display: inline-block !important;
106 | color: white !important;
107 | padding: 10px !important;
108 | border-radius: 10px !important;
109 | text-align: left !important;
110 | max-width: 240px !important;
111 | }
112 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 |
2 | # Report an Issue
3 |
4 | Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure
5 | it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues)
6 | to see if someone's reported one similar to yours.
7 |
8 | If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code
9 | as possible: the more minimalist, the faster we can debug it).
10 |
11 | Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem,
12 | and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to
13 | that plunkr you created!
14 |
15 | **Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure
16 | is a bug, it's best to talk it out on
17 | [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This
18 | keeps development streamlined, and helps us focus on building great software.
19 |
20 |
21 | Issues only! |
22 | -------------|
23 | Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). |
24 |
25 | ####Purple Labels
26 | A purple label means that **you** need to take some further action.
27 | - : Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue.
28 | - : Please [create a plunkr](http://bit.ly/UIR-Plunk)
29 | - : We suspect your issue is really a help request, or could be answered by the community. Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router). If you determine that is an actual issue, please explain why.
30 |
31 | If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately.
32 |
33 | # Contribute
34 |
35 | **(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine.
36 |
37 | **(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed.
38 |
39 | **(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea.
40 |
41 | **(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules:
42 |
43 | - *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests
44 | - Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one
45 | - Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release.
46 | - Changes should always respect the coding style of the project
47 |
48 |
49 |
50 | # Developing
51 |
52 | UI-Router uses grunt >= 0.4.x. Make sure to upgrade your environment and read the
53 | [Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4).
54 |
55 | Dependencies for building from source and running tests:
56 |
57 | * [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli`
58 | * Then, install the development dependencies by running `$ npm install` from the project directory
59 |
60 | There are a number of targets in the gruntfile that are used to generating different builds:
61 |
62 | * `grunt`: Perform a normal build, runs jshint and karma tests
63 | * `grunt build`: Perform a normal build
64 | * `grunt dist`: Perform a clean build and generate documentation
65 | * `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes.
66 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/templateFactory.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @ngdoc object
3 | * @name ui.router.util.$templateFactory
4 | *
5 | * @requires $http
6 | * @requires $templateCache
7 | * @requires $injector
8 | *
9 | * @description
10 | * Service. Manages loading of templates.
11 | */
12 | $TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];
13 | function $TemplateFactory( $http, $templateCache, $injector) {
14 |
15 | /**
16 | * @ngdoc function
17 | * @name ui.router.util.$templateFactory#fromConfig
18 | * @methodOf ui.router.util.$templateFactory
19 | *
20 | * @description
21 | * Creates a template from a configuration object.
22 | *
23 | * @param {object} config Configuration object for which to load a template.
24 | * The following properties are search in the specified order, and the first one
25 | * that is defined is used to create the template:
26 | *
27 | * @param {string|object} config.template html string template or function to
28 | * load via {@link ui.router.util.$templateFactory#fromString fromString}.
29 | * @param {string|object} config.templateUrl url to load or a function returning
30 | * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}.
31 | * @param {Function} config.templateProvider function to invoke via
32 | * {@link ui.router.util.$templateFactory#fromProvider fromProvider}.
33 | * @param {object} params Parameters to pass to the template function.
34 | * @param {object} locals Locals to pass to `invoke` if the template is loaded
35 | * via a `templateProvider`. Defaults to `{ params: params }`.
36 | *
37 | * @return {string|object} The template html as a string, or a promise for
38 | * that string,or `null` if no template is configured.
39 | */
40 | this.fromConfig = function (config, params, locals) {
41 | return (
42 | isDefined(config.template) ? this.fromString(config.template, params) :
43 | isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :
44 | isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :
45 | null
46 | );
47 | };
48 |
49 | /**
50 | * @ngdoc function
51 | * @name ui.router.util.$templateFactory#fromString
52 | * @methodOf ui.router.util.$templateFactory
53 | *
54 | * @description
55 | * Creates a template from a string or a function returning a string.
56 | *
57 | * @param {string|object} template html template as a string or function that
58 | * returns an html template as a string.
59 | * @param {object} params Parameters to pass to the template function.
60 | *
61 | * @return {string|object} The template html as a string, or a promise for that
62 | * string.
63 | */
64 | this.fromString = function (template, params) {
65 | return isFunction(template) ? template(params) : template;
66 | };
67 |
68 | /**
69 | * @ngdoc function
70 | * @name ui.router.util.$templateFactory#fromUrl
71 | * @methodOf ui.router.util.$templateFactory
72 | *
73 | * @description
74 | * Loads a template from the a URL via `$http` and `$templateCache`.
75 | *
76 | * @param {string|Function} url url of the template to load, or a function
77 | * that returns a url.
78 | * @param {Object} params Parameters to pass to the url function.
79 | * @return {string|Promise.} The template html as a string, or a promise
80 | * for that string.
81 | */
82 | this.fromUrl = function (url, params) {
83 | if (isFunction(url)) url = url(params);
84 | if (url == null) return null;
85 | else return $http
86 | .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }})
87 | .then(function(response) { return response.data; });
88 | };
89 |
90 | /**
91 | * @ngdoc function
92 | * @name ui.router.util.$templateFactory#fromProvider
93 | * @methodOf ui.router.util.$templateFactory
94 | *
95 | * @description
96 | * Creates a template by invoking an injectable provider function.
97 | *
98 | * @param {Function} provider Function to invoke via `$injector.invoke`
99 | * @param {Object} params Parameters for the template.
100 | * @param {Object} locals Locals to pass to `invoke`. Defaults to
101 | * `{ params: params }`.
102 | * @return {string|Promise.} The template html as a string, or a promise
103 | * for that string.
104 | */
105 | this.fromProvider = function (provider, params, locals) {
106 | return $injector.invoke(provider, null, locals || { params: params });
107 | };
108 | }
109 |
110 | angular.module('ui.router.util').service('$templateFactory', $TemplateFactory);
111 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_transitions.scss:
--------------------------------------------------------------------------------
1 |
2 | // iOS View Transitions
3 | // -------------------------------
4 |
5 | $ios-transition-duration: 500ms !default;
6 | $ios-transition-timing-function: cubic-bezier(.36, .66, .04, 1) !default;
7 | $ios-transition-container-bg-color: #000 !default;
8 |
9 |
10 | [nav-view-transition="ios"] {
11 |
12 | [nav-view="entering"],
13 | [nav-view="leaving"] {
14 | @include transition-duration( $ios-transition-duration );
15 | @include transition-timing-function( $ios-transition-timing-function );
16 | -webkit-transition-property: opacity, -webkit-transform, box-shadow;
17 | transition-property: opacity, transform, box-shadow;
18 | }
19 |
20 | &[nav-view-direction="forward"],
21 | &[nav-view-direction="back"] {
22 | background-color: $ios-transition-container-bg-color;
23 | }
24 |
25 | [nav-view="active"],
26 | &[nav-view-direction="forward"] [nav-view="entering"],
27 | &[nav-view-direction="back"] [nav-view="leaving"] {
28 | z-index: $z-index-view-above;
29 | }
30 |
31 | &[nav-view-direction="back"] [nav-view="entering"],
32 | &[nav-view-direction="forward"] [nav-view="leaving"] {
33 | z-index: $z-index-view-below;
34 | }
35 |
36 | }
37 |
38 |
39 |
40 | // iOS Nav Bar Transitions
41 | // -------------------------------
42 |
43 | [nav-bar-transition="ios"] {
44 |
45 | .title,
46 | .buttons,
47 | .back-text {
48 | @include transition-duration( $ios-transition-duration );
49 | @include transition-timing-function( $ios-transition-timing-function );
50 | -webkit-transition-property: opacity, -webkit-transform;
51 | transition-property: opacity, transform;
52 | }
53 |
54 | [nav-bar="active"],
55 | [nav-bar="entering"] {
56 | z-index: $z-index-bar-above;
57 |
58 | .bar {
59 | background: transparent;
60 | }
61 | }
62 |
63 | [nav-bar="cached"] {
64 | display: block;
65 |
66 | .header-item {
67 | display: none;
68 | }
69 | }
70 |
71 | }
72 |
73 |
74 |
75 | // Android View Transitions
76 | // -------------------------------
77 |
78 | $android-transition-duration: 200ms !default;
79 | $android-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1) !default;
80 |
81 |
82 | [nav-view-transition="android"] {
83 |
84 | [nav-view="entering"],
85 | [nav-view="leaving"] {
86 | @include transition-duration( $android-transition-duration );
87 | @include transition-timing-function( $android-transition-timing-function );
88 | -webkit-transition-property: -webkit-transform;
89 | transition-property: transform;
90 | }
91 |
92 | [nav-view="active"],
93 | &[nav-view-direction="forward"] [nav-view="entering"],
94 | &[nav-view-direction="back"] [nav-view="leaving"] {
95 | z-index: $z-index-view-above;
96 | }
97 |
98 | &[nav-view-direction="back"] [nav-view="entering"],
99 | &[nav-view-direction="forward"] [nav-view="leaving"] {
100 | z-index: $z-index-view-below;
101 | }
102 |
103 | }
104 |
105 |
106 |
107 | // Android Nav Bar Transitions
108 | // -------------------------------
109 |
110 | [nav-bar-transition="android"] {
111 |
112 | .title,
113 | .buttons {
114 | @include transition-duration( $android-transition-duration );
115 | @include transition-timing-function( $android-transition-timing-function );
116 | -webkit-transition-property: opacity;
117 | transition-property: opacity;
118 | }
119 |
120 | [nav-bar="active"],
121 | [nav-bar="entering"] {
122 | z-index: $z-index-bar-above;
123 |
124 | .bar {
125 | background: transparent;
126 | }
127 | }
128 |
129 | [nav-bar="cached"] {
130 | display: block;
131 |
132 | .header-item {
133 | display: none;
134 | }
135 | }
136 |
137 | }
138 |
139 |
140 |
141 | // Nav Swipe
142 | // -------------------------------
143 |
144 | [nav-swipe="fast"] {
145 | [nav-view],
146 | .title,
147 | .buttons,
148 | .back-text {
149 | @include transition-duration(50ms);
150 | @include transition-timing-function(linear);
151 | }
152 | }
153 |
154 | [nav-swipe="slow"] {
155 | [nav-view],
156 | .title,
157 | .buttons,
158 | .back-text {
159 | @include transition-duration(160ms);
160 | @include transition-timing-function(linear);
161 | }
162 | }
163 |
164 |
165 |
166 | // Transition Settings
167 | // -------------------------------
168 |
169 | [nav-view="cached"],
170 | [nav-bar="cached"] {
171 | display: none;
172 | }
173 |
174 | [nav-view="stage"] {
175 | opacity: 0;
176 | @include transition-duration( 0 );
177 | }
178 |
179 | [nav-bar="stage"] {
180 | .title,
181 | .buttons,
182 | .back-text {
183 | position: absolute;
184 | opacity: 0;
185 | @include transition-duration(0s);
186 | }
187 | }
188 |
189 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/api/angular-ui-router.d.ts:
--------------------------------------------------------------------------------
1 | // Type definitions for Angular JS 1.1.5+ (ui.router module)
2 | // Project: https://github.com/angular-ui/ui-router
3 | // Definitions by: Michel Salib
4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped
5 |
6 | declare module ng.ui {
7 |
8 | interface IState {
9 | name?: string;
10 | template?: string;
11 | templateUrl?: any; // string || () => string
12 | templateProvider?: any; // () => string || IPromise
13 | controller?: any;
14 | controllerAs?: string;
15 | controllerProvider?: any;
16 | resolve?: {};
17 | url?: string;
18 | params?: any;
19 | views?: {};
20 | abstract?: boolean;
21 | onEnter?: (...args: any[]) => void;
22 | onExit?: (...args: any[]) => void;
23 | data?: any;
24 | reloadOnSearch?: boolean;
25 | }
26 |
27 | interface ITypedState extends IState {
28 | data?: T;
29 | }
30 |
31 | interface IStateProvider extends IServiceProvider {
32 | state(name: string, config: IState): IStateProvider;
33 | state(config: IState): IStateProvider;
34 | decorator(name?: string, decorator?: (state: IState, parent: Function) => any): any;
35 | }
36 |
37 | interface IUrlMatcher {
38 | concat(pattern: string): IUrlMatcher;
39 | exec(path: string, searchParams: {}): {};
40 | parameters(): string[];
41 | format(values: {}): string;
42 | }
43 |
44 | interface IUrlMatcherFactory {
45 | compile(pattern: string): IUrlMatcher;
46 | isMatcher(o: any): boolean;
47 | }
48 |
49 | interface IUrlRouterProvider extends IServiceProvider {
50 | when(whenPath: RegExp, handler: Function): IUrlRouterProvider;
51 | when(whenPath: RegExp, handler: any[]): IUrlRouterProvider;
52 | when(whenPath: RegExp, toPath: string): IUrlRouterProvider;
53 | when(whenPath: IUrlMatcher, hanlder: Function): IUrlRouterProvider;
54 | when(whenPath: IUrlMatcher, handler: any[]): IUrlRouterProvider;
55 | when(whenPath: IUrlMatcher, toPath: string): IUrlRouterProvider;
56 | when(whenPath: string, handler: Function): IUrlRouterProvider;
57 | when(whenPath: string, handler: any[]): IUrlRouterProvider;
58 | when(whenPath: string, toPath: string): IUrlRouterProvider;
59 | otherwise(handler: Function): IUrlRouterProvider;
60 | otherwise(handler: any[]): IUrlRouterProvider;
61 | otherwise(path: string): IUrlRouterProvider;
62 | rule(handler: Function): IUrlRouterProvider;
63 | rule(handler: any[]): IUrlRouterProvider;
64 | }
65 |
66 | interface IStateOptions {
67 | location?: any;
68 | inherit?: boolean;
69 | relative?: IState;
70 | notify?: boolean;
71 | reload?: boolean;
72 | }
73 |
74 | interface IHrefOptions {
75 | lossy?: boolean;
76 | inherit?: boolean;
77 | relative?: IState;
78 | absolute?: boolean;
79 | }
80 |
81 | interface IStateService {
82 | go(to: string, params?: {}, options?: IStateOptions): IPromise;
83 | transitionTo(state: string, params?: {}, updateLocation?: boolean): void;
84 | transitionTo(state: string, params?: {}, options?: IStateOptions): void;
85 | includes(state: string, params?: {}): boolean;
86 | is(state:string, params?: {}): boolean;
87 | is(state: IState, params?: {}): boolean;
88 | href(state: IState, params?: {}, options?: IHrefOptions): string;
89 | href(state: string, params?: {}, options?: IHrefOptions): string;
90 | get(state: string): IState;
91 | get(): IState[];
92 | current: IState;
93 | params: any;
94 | reload(): void;
95 | }
96 |
97 | interface IStateParamsService {
98 | [key: string]: any;
99 | }
100 |
101 | interface IStateParams {
102 | [key: string]: any;
103 | }
104 |
105 | interface IUrlRouterService {
106 | /*
107 | * Triggers an update; the same update that happens when the address bar
108 | * url changes, aka $locationChangeSuccess.
109 | *
110 | * This method is useful when you need to use preventDefault() on the
111 | * $locationChangeSuccess event, perform some custom logic (route protection,
112 | * auth, config, redirection, etc) and then finally proceed with the transition
113 | * by calling $urlRouter.sync().
114 | *
115 | */
116 | sync(): void;
117 | }
118 |
119 | interface IUiViewScrollProvider {
120 | /*
121 | * Reverts back to using the core $anchorScroll service for scrolling
122 | * based on the url anchor.
123 | */
124 | useAnchorScroll(): void;
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_checkbox.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Checkbox
4 | * --------------------------------------------------
5 | */
6 |
7 | .checkbox {
8 | // set the color defaults
9 | @include checkbox-style($checkbox-off-border-default, $checkbox-on-bg-default, $checkbox-on-border-default);
10 |
11 | position: relative;
12 | display: inline-block;
13 | padding: ($checkbox-height / 4) ($checkbox-width / 4);
14 | cursor: pointer;
15 | }
16 | .checkbox-light {
17 | @include checkbox-style($checkbox-off-border-light, $checkbox-on-bg-light, $checkbox-off-border-light);
18 | }
19 | .checkbox-stable {
20 | @include checkbox-style($checkbox-off-border-stable, $checkbox-on-bg-stable, $checkbox-off-border-stable);
21 | }
22 | .checkbox-positive {
23 | @include checkbox-style($checkbox-off-border-positive, $checkbox-on-bg-positive, $checkbox-off-border-positive);
24 | }
25 | .checkbox-calm {
26 | @include checkbox-style($checkbox-off-border-calm, $checkbox-on-bg-calm, $checkbox-off-border-calm);
27 | }
28 | .checkbox-assertive {
29 | @include checkbox-style($checkbox-off-border-assertive, $checkbox-on-bg-assertive, $checkbox-off-border-assertive);
30 | }
31 | .checkbox-balanced {
32 | @include checkbox-style($checkbox-off-border-balanced, $checkbox-on-bg-balanced, $checkbox-off-border-balanced);
33 | }
34 | .checkbox-energized{
35 | @include checkbox-style($checkbox-off-border-energized, $checkbox-on-bg-energized, $checkbox-off-border-energized);
36 | }
37 | .checkbox-royal {
38 | @include checkbox-style($checkbox-off-border-royal, $checkbox-on-bg-royal, $checkbox-off-border-royal);
39 | }
40 | .checkbox-dark {
41 | @include checkbox-style($checkbox-off-border-dark, $checkbox-on-bg-dark, $checkbox-off-border-dark);
42 | }
43 |
44 | .checkbox input:disabled:before,
45 | .checkbox input:disabled + .checkbox-icon:before {
46 | border-color: $checkbox-off-border-light;
47 | }
48 |
49 | .checkbox input:disabled:checked:before,
50 | .checkbox input:disabled:checked + .checkbox-icon:before {
51 | background: $checkbox-on-bg-light;
52 | }
53 |
54 |
55 | .checkbox.checkbox-input-hidden input {
56 | display: none !important;
57 | }
58 |
59 | .checkbox input,
60 | .checkbox-icon {
61 | position: relative;
62 | width: $checkbox-width;
63 | height: $checkbox-height;
64 | display: block;
65 | border: 0;
66 | background: transparent;
67 | cursor: pointer;
68 | -webkit-appearance: none;
69 |
70 | &:before {
71 | // what the checkbox looks like when its not checked
72 | display: table;
73 | width: 100%;
74 | height: 100%;
75 | border-width: $checkbox-border-width;
76 | border-style: solid;
77 | border-radius: $checkbox-border-radius;
78 | background: $checkbox-off-bg-color;
79 | content: ' ';
80 | @include transition(background-color 20ms ease-in-out);
81 | }
82 | }
83 |
84 | .checkbox input:checked:before,
85 | input:checked + .checkbox-icon:before {
86 | border-width: $checkbox-border-width + 1;
87 | }
88 |
89 | // the checkmark within the box
90 | .checkbox input:after,
91 | .checkbox-icon:after {
92 | @include transition(opacity .05s ease-in-out);
93 | @include rotate(-45deg);
94 | position: absolute;
95 | top: 33%;
96 | left: 25%;
97 | display: table;
98 | width: ($checkbox-width / 2);
99 | height: ($checkbox-width / 4) - 1;
100 | border: $checkbox-check-width solid $checkbox-check-color;
101 | border-top: 0;
102 | border-right: 0;
103 | content: ' ';
104 | opacity: 0;
105 | }
106 |
107 | .platform-android .checkbox-platform input:before,
108 | .platform-android .checkbox-platform .checkbox-icon:before,
109 | .checkbox-square input:before,
110 | .checkbox-square .checkbox-icon:before {
111 | border-radius: 2px;
112 | width: 72%;
113 | height: 72%;
114 | margin-top: 14%;
115 | margin-left: 14%;
116 | border-width: 2px;
117 | }
118 |
119 | .platform-android .checkbox-platform input:after,
120 | .platform-android .checkbox-platform .checkbox-icon:after,
121 | .checkbox-square input:after,
122 | .checkbox-square .checkbox-icon:after {
123 | border-width: 2px;
124 | top: 19%;
125 | left: 25%;
126 | width: ($checkbox-width / 2) - 1;
127 | height: 7px;
128 | }
129 |
130 | .grade-c .checkbox input:after,
131 | .grade-c .checkbox-icon:after {
132 | @include rotate(0);
133 | top: 3px;
134 | left: 4px;
135 | border: none;
136 | color: $checkbox-check-color;
137 | content: '\2713';
138 | font-weight: bold;
139 | font-size: 20px;
140 | }
141 |
142 | // what the checkmark looks like when its checked
143 | .checkbox input:checked:after,
144 | input:checked + .checkbox-icon:after {
145 | opacity: 1;
146 | }
147 |
148 | // make sure item content have enough padding on left to fit the checkbox
149 | .item-checkbox {
150 | padding-left: ($item-padding * 2) + $checkbox-width;
151 |
152 | &.active {
153 | box-shadow: none;
154 | }
155 | }
156 |
157 | // position the checkbox to the left within an item
158 | .item-checkbox .checkbox {
159 | position: absolute;
160 | top: 50%;
161 | right: $item-padding / 2;
162 | left: $item-padding / 2;
163 | z-index: $z-index-item-checkbox;
164 | margin-top: (($checkbox-height + ($checkbox-height / 2)) / 2) * -1;
165 | }
166 |
167 |
168 | .item-checkbox.item-checkbox-right {
169 | padding-right: ($item-padding * 2) + $checkbox-width;
170 | padding-left: $item-padding;
171 | }
172 |
173 | .item-checkbox-right .checkbox input,
174 | .item-checkbox-right .checkbox-icon {
175 | float: right;
176 | }
177 |
--------------------------------------------------------------------------------
/www/js/app.js:
--------------------------------------------------------------------------------
1 | hack = {};
2 |
3 | hack.bindFileUpload = function() {
4 | var fileInput = document.querySelectorAll('.file-input')[0];
5 | fileInput.addEventListener("change", function(e) {
6 | EXIF.getData(e.target.files[0], function() {
7 | var upload = EXIF.getAllTags(this);
8 | if(upload.Make){
9 | alert(upload.Make);
10 | }
11 | if(upload.Model){
12 | alert(upload.Model);
13 | }
14 | });
15 | });
16 | };
17 |
18 | function guid() {
19 | function s4() {
20 | return Math.floor((1 + Math.random()) * 0x10000)
21 | .toString(16)
22 | .substring(1);
23 | }
24 | return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
25 | s4() + '-' + s4() + s4() + s4();
26 | }
27 |
28 |
29 | function afterAngular(){
30 | hack.user = {
31 | 'userID': guid(),
32 | 'facebook': '',
33 | 'twitter': ''
34 | };
35 |
36 | if (localStorage.getItem("user") === null) {
37 | localStorage.setItem('user', JSON.stringify(hack.user));
38 | } else {
39 | hack.user = localStorage.getItem('user');
40 | }
41 | }
42 |
43 | document.addEventListener("DOMContentLoaded", function(event) {
44 | window.setTimeout(afterAngular, 2000);
45 | });
46 |
47 |
48 | angular.module('ionicApp', ['ionic'])
49 |
50 | // All this does is allow the message
51 | // to be sent when you tap return
52 | .directive('input', function($timeout) {
53 | return {
54 | restrict: 'E',
55 | scope: {
56 | 'returnClose': '=',
57 | 'onReturn': '&',
58 | 'onFocus': '&',
59 | 'onBlur': '&'
60 | },
61 | link: function(scope, element, attr) {
62 | element.bind('focus', function(e) {
63 | if (scope.onFocus) {
64 | $timeout(function() {
65 | scope.onFocus();
66 | });
67 | }
68 | });
69 | element.bind('blur', function(e) {
70 | if (scope.onBlur) {
71 | $timeout(function() {
72 | scope.onBlur();
73 | });
74 | }
75 | });
76 | element.bind('keydown', function(e) {
77 | if (e.which == 13) {
78 | if (scope.returnClose) element[0].blur();
79 | if (scope.onReturn) {
80 | $timeout(function() {
81 | scope.onReturn();
82 | });
83 | }
84 | }
85 | });
86 | }
87 | }
88 | })
89 |
90 |
91 | .controller('Messages', function($scope, $timeout, $ionicScrollDelegate, $http, $window) {
92 |
93 | $scope.hideTime = true;
94 |
95 | var alternate,
96 | isIOS = ionic.Platform.isWebView() && ionic.Platform.isIOS();
97 |
98 | $scope.botID = '54321';
99 | $scope.userID = '12345';
100 |
101 |
102 | $scope.newLocalDate = function(){
103 | var d = new Date();
104 | d = d.toLocaleTimeString().replace(/:\d+ /, ' ');
105 | return d;
106 | };
107 |
108 | $scope.sendMessage = function() {
109 |
110 | $scope.messages.push({
111 | userId: $scope.userID,
112 | text: $scope.data.message,
113 | type: 'upload',
114 | time: $scope.newLocalDate()
115 | });
116 |
117 | $http({
118 | url: "/messages",
119 | method: "POST",
120 | data: {
121 | "text": $scope.data.message,
122 | "userId": hack.user.userID
123 | }
124 | }).success(function(data, status, headers, config) {
125 | $scope.data = data;
126 | // {
127 | // 'text': "Hi I'm alfred",
128 | // 'type': 'message'
129 | // }
130 | // {
131 | // 'text': "Please upload a photo",
132 | // 'type': 'upload'
133 | // }
134 | // {
135 | // 'text': "I created a cover for you it's 10 a week",
136 | // 'type': 'cover'
137 | // }
138 | // {
139 | // 'text': "You're already covered for that!",
140 | // 'type': 'alreadyCovered'
141 | // }
142 | // {
143 | // 'text': "Sorry, I can't quote for that",
144 | // 'type': 'cannotQuote'
145 | // }
146 |
147 |
148 | $scope.messages.push({
149 | userId: $scope.botID,
150 | text: data.text,
151 | type: data.type,
152 | time: $scope.newLocalDate()
153 | });
154 |
155 | }).error(function(data, status, headers, config) {
156 | $scope.status = status;
157 | });
158 |
159 | alternate = !alternate;
160 |
161 | delete $scope.data.message;
162 | $ionicScrollDelegate.scrollBottom(true);
163 |
164 | };
165 |
166 |
167 | $scope.inputUp = function() {
168 | if (isIOS) $scope.data.keyboardHeight = 216;
169 | $timeout(function() {
170 | $ionicScrollDelegate.scrollBottom(true);
171 | }, 300);
172 |
173 | };
174 |
175 | $scope.inputDown = function() {
176 | if (isIOS) $scope.data.keyboardHeight = 0;
177 | $ionicScrollDelegate.resize();
178 | };
179 |
180 | $scope.closeKeyboard = function() {
181 | // cordova.plugins.Keyboard.close();
182 | };
183 |
184 |
185 | $scope.data = {};
186 | $scope.myId = '12345';
187 | $scope.messages = [];
188 |
189 | });
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/angular-sanitize.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.3.6
3 | (c) 2010-2014 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(n,h,p){'use strict';function E(a){var d=[];s(d,h.noop).chars(a);return d.join("")}function g(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,k,f=[],m=a,l;for(f.last=function(){return f[f.length-1]};a;){l="";k=!0;if(f.last()&&x[f.last()])a=a.replace(new RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");d.chars&&d.chars(r(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),k=!1);else if(y.test(a)){if(b=a.match(y))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(z))a=a.substring(b[0].length),b[0].replace(z,e),k=!1}else K.test(a)&&((b=a.match(A))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(A,c)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),d.chars&&d.chars(r(l)))}if(a==m)throw L("badparse",a);m=a}e()}function r(a){if(!a)return"";var d=M.exec(a);a=d[1];var c=d[3];if(d=d[2])q.innerHTML=
9 | d.replace(//g,">")}function s(a,d){var c=!1,e=h.bind(a,a.push);return{start:function(a,k,f){a=h.lowercase(a);!c&&x[a]&&(c=a);c||!0!==C[a]||(e("<"),e(a),h.forEach(k,function(c,f){var k=
10 | h.lowercase(f),g="img"===a&&"src"===k||"background"===k;!0!==P[k]||!0===D[k]&&!d(c,g)||(e(" "),e(f),e('="'),e(B(c)),e('"'))}),e(f?"/>":">"))},end:function(a){a=h.lowercase(a);c||!0!==C[a]||(e(""),e(a),e(">"));a==c&&(c=!1)},chars:function(a){c||e(B(a))}}}var L=h.$$minErr("$sanitize"),A=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,z=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^,
11 | J=/^<\//,H=/\x3c!--(.*?)--\x3e/g,y=/]*?)>/i,I=/"\u201d\u2019]/,c=/^mailto:/;return function(e,b){function k(a){a&&g.push(E(a))}
15 | function f(a,c){g.push("');k(c);g.push(" ")}if(!e)return e;for(var m,l=e,g=[],n,p;m=l.match(d);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),f(n,m[0].replace(c,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular);
16 | //# sourceMappingURL=angular-sanitize.min.js.map
17 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_toggle.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Toggle
4 | * --------------------------------------------------
5 | */
6 |
7 | .item-toggle {
8 | pointer-events: none;
9 | }
10 |
11 | .toggle {
12 | // set the color defaults
13 | @include toggle-style($toggle-on-default-border, $toggle-on-default-bg);
14 |
15 | position: relative;
16 | display: inline-block;
17 | pointer-events: auto;
18 | margin: -$toggle-hit-area-expansion;
19 | padding: $toggle-hit-area-expansion;
20 |
21 | &.dragging {
22 | .handle {
23 | background-color: $toggle-handle-dragging-bg-color !important;
24 | }
25 | }
26 |
27 | }
28 |
29 | .toggle {
30 | &.toggle-light {
31 | @include toggle-style($toggle-on-light-border, $toggle-on-light-bg);
32 | }
33 | &.toggle-stable {
34 | @include toggle-style($toggle-on-stable-border, $toggle-on-stable-bg);
35 | }
36 | &.toggle-positive {
37 | @include toggle-style($toggle-on-positive-border, $toggle-on-positive-bg);
38 | }
39 | &.toggle-calm {
40 | @include toggle-style($toggle-on-calm-border, $toggle-on-calm-bg);
41 | }
42 | &.toggle-assertive {
43 | @include toggle-style($toggle-on-assertive-border, $toggle-on-assertive-bg);
44 | }
45 | &.toggle-balanced {
46 | @include toggle-style($toggle-on-balanced-border, $toggle-on-balanced-bg);
47 | }
48 | &.toggle-energized {
49 | @include toggle-style($toggle-on-energized-border, $toggle-on-energized-bg);
50 | }
51 | &.toggle-royal {
52 | @include toggle-style($toggle-on-royal-border, $toggle-on-royal-bg);
53 | }
54 | &.toggle-dark {
55 | @include toggle-style($toggle-on-dark-border, $toggle-on-dark-bg);
56 | }
57 | }
58 |
59 | .toggle input {
60 | // hide the actual input checkbox
61 | display: none;
62 | }
63 |
64 | /* the track appearance when the toggle is "off" */
65 | .toggle .track {
66 | @include transition-timing-function(ease-in-out);
67 | @include transition-duration($toggle-transition-duration);
68 | @include transition-property((background-color, border));
69 |
70 | display: inline-block;
71 | box-sizing: border-box;
72 | width: $toggle-width;
73 | height: $toggle-height;
74 | border: solid $toggle-border-width $toggle-off-border-color;
75 | border-radius: $toggle-border-radius;
76 | background-color: $toggle-off-bg-color;
77 | content: ' ';
78 | cursor: pointer;
79 | pointer-events: none;
80 | }
81 |
82 | /* Fix to avoid background color bleeding */
83 | /* (occured on (at least) Android 4.2, Asus MeMO Pad HD7 ME173X) */
84 | .platform-android4_2 .toggle .track {
85 | -webkit-background-clip: padding-box;
86 | }
87 |
88 | /* the handle (circle) thats inside the toggle's track area */
89 | /* also the handle's appearance when it is "off" */
90 | .toggle .handle {
91 | @include transition($toggle-transition-duration cubic-bezier(0, 1.1, 1, 1.1));
92 | @include transition-property((background-color, transform));
93 | position: absolute;
94 | display: block;
95 | width: $toggle-handle-width;
96 | height: $toggle-handle-height;
97 | border-radius: $toggle-handle-radius;
98 | background-color: $toggle-handle-off-bg-color;
99 | top: $toggle-border-width + $toggle-hit-area-expansion;
100 | left: $toggle-border-width + $toggle-hit-area-expansion;
101 | box-shadow: 0 2px 7px rgba(0,0,0,.35), 0 1px 1px rgba(0,0,0,.15);
102 |
103 | &:before {
104 | // used to create a larger (but hidden) hit area to slide the handle
105 | position: absolute;
106 | top: -4px;
107 | left: ( ($toggle-handle-width / 2) * -1) - 8;
108 | padding: ($toggle-handle-height / 2) + 5 ($toggle-handle-width + 7);
109 | content: " ";
110 | }
111 | }
112 |
113 | .toggle input:checked + .track .handle {
114 | // the handle when the toggle is "on"
115 | @include translate3d($toggle-width - $toggle-handle-width - ($toggle-border-width * 2), 0, 0);
116 | background-color: $toggle-handle-on-bg-color;
117 | }
118 |
119 | .item-toggle.active {
120 | box-shadow: none;
121 | }
122 |
123 | .item-toggle,
124 | .item-toggle.item-complex .item-content {
125 | // make sure list item content have enough padding on right to fit the toggle
126 | padding-right: ($item-padding * 3) + $toggle-width;
127 | }
128 |
129 | .item-toggle.item-complex {
130 | padding-right: 0;
131 | }
132 |
133 | .item-toggle .toggle {
134 | // position the toggle to the right within a list item
135 | position: absolute;
136 | top: ($item-padding / 2) + 2;
137 | right: $item-padding;
138 | z-index: $z-index-item-toggle;
139 | }
140 |
141 | .toggle input:disabled + .track {
142 | opacity: .6;
143 | }
144 |
145 | .toggle-small {
146 |
147 | .track {
148 | border: 0;
149 | width: 34px;
150 | height: 15px;
151 | background: #9e9e9e;
152 | }
153 | input:checked + .track {
154 | background: rgba(0,150,137,.5);
155 | }
156 | .handle {
157 | top: 2px;
158 | left: 4px;
159 | width: 21px;
160 | height: 21px;
161 | box-shadow: 0 2px 5px rgba(0,0,0,.25);
162 | }
163 | input:checked + .track .handle {
164 | @include translate3d(16px, 0, 0);
165 | background: rgb(0,150,137);
166 | }
167 | &.item-toggle .toggle {
168 | top: 19px;
169 | }
170 |
171 | .toggle-light {
172 | @include toggle-small-style($toggle-on-light-bg);
173 | }
174 | .toggle-stable {
175 | @include toggle-small-style($toggle-on-stable-bg);
176 | }
177 | .toggle-positive {
178 | @include toggle-small-style($toggle-on-positive-bg);
179 | }
180 | .toggle-calm {
181 | @include toggle-small-style($toggle-on-calm-bg);
182 | }
183 | .toggle-assertive {
184 | @include toggle-small-style($toggle-on-assertive-bg);
185 | }
186 | .toggle-balanced {
187 | @include toggle-small-style($toggle-on-balanced-bg);
188 | }
189 | .toggle-energized {
190 | @include toggle-small-style($toggle-on-energized-bg);
191 | }
192 | .toggle-royal {
193 | @include toggle-small-style($toggle-on-royal-bg);
194 | }
195 | .toggle-dark {
196 | @include toggle-small-style($toggle-on-dark-bg);
197 | }
198 | }
199 |
--------------------------------------------------------------------------------
/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 | right: 0;
69 | bottom: 0;
70 | left: 0;
71 | opacity: 0;
72 | z-index: $z-index-click-block;
73 | @include translate3d(0, 0, 0);
74 | overflow: hidden;
75 | }
76 | .click-block-hide {
77 | @include translate3d(-9999px, 0, 0);
78 | }
79 |
80 | .no-resize {
81 | resize: none;
82 | }
83 |
84 | .block {
85 | display: block;
86 | clear: both;
87 | &:after {
88 | display: block;
89 | visibility: hidden;
90 | clear: both;
91 | height: 0;
92 | content: ".";
93 | }
94 | }
95 |
96 | .full-image {
97 | width: 100%;
98 | }
99 |
100 | .clearfix {
101 | *zoom: 1;
102 | &:before,
103 | &:after {
104 | display: table;
105 | content: "";
106 | // Fixes Opera/contenteditable bug:
107 | // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
108 | line-height: 0;
109 | }
110 | &:after {
111 | clear: both;
112 | }
113 | }
114 |
115 | /**
116 | * Content Padding
117 | * --------------------------------------------------
118 | */
119 |
120 | .padding {
121 | padding: $content-padding;
122 | }
123 |
124 | .padding-top,
125 | .padding-vertical {
126 | padding-top: $content-padding;
127 | }
128 |
129 | .padding-right,
130 | .padding-horizontal {
131 | padding-right: $content-padding;
132 | }
133 |
134 | .padding-bottom,
135 | .padding-vertical {
136 | padding-bottom: $content-padding;
137 | }
138 |
139 | .padding-left,
140 | .padding-horizontal {
141 | padding-left: $content-padding;
142 | }
143 |
144 |
145 | /**
146 | * Scrollable iFrames
147 | * --------------------------------------------------
148 | */
149 |
150 | .iframe-wrapper {
151 | position: fixed;
152 | -webkit-overflow-scrolling: touch;
153 | overflow: scroll;
154 |
155 | iframe {
156 | height: 100%;
157 | width: 100%;
158 | }
159 | }
160 |
161 |
162 | /**
163 | * Rounded
164 | * --------------------------------------------------
165 | */
166 |
167 | .rounded {
168 | border-radius: $border-radius-base;
169 | }
170 |
171 |
172 | /**
173 | * Utility Colors
174 | * --------------------------------------------------
175 | * Utility colors are added to help set a naming convention. You'll
176 | * notice we purposely do not use words like "red" or "blue", but
177 | * instead have colors which represent an emotion or generic theme.
178 | */
179 |
180 | .light, a.light {
181 | color: $light;
182 | }
183 | .light-bg {
184 | background-color: $light;
185 | }
186 | .light-border {
187 | border-color: $button-light-border;
188 | }
189 |
190 | .stable, a.stable {
191 | color: $stable;
192 | }
193 | .stable-bg {
194 | background-color: $stable;
195 | }
196 | .stable-border {
197 | border-color: $button-stable-border;
198 | }
199 |
200 | .positive, a.positive {
201 | color: $positive;
202 | }
203 | .positive-bg {
204 | background-color: $positive;
205 | }
206 | .positive-border {
207 | border-color: $button-positive-border;
208 | }
209 |
210 | .calm, a.calm {
211 | color: $calm;
212 | }
213 | .calm-bg {
214 | background-color: $calm;
215 | }
216 | .calm-border {
217 | border-color: $button-calm-border;
218 | }
219 |
220 | .assertive, a.assertive {
221 | color: $assertive;
222 | }
223 | .assertive-bg {
224 | background-color: $assertive;
225 | }
226 | .assertive-border {
227 | border-color: $button-assertive-border;
228 | }
229 |
230 | .balanced, a.balanced {
231 | color: $balanced;
232 | }
233 | .balanced-bg {
234 | background-color: $balanced;
235 | }
236 | .balanced-border {
237 | border-color: $button-balanced-border;
238 | }
239 |
240 | .energized, a.energized {
241 | color: $energized;
242 | }
243 | .energized-bg {
244 | background-color: $energized;
245 | }
246 | .energized-border {
247 | border-color: $button-energized-border;
248 | }
249 |
250 | .royal, a.royal {
251 | color: $royal;
252 | }
253 | .royal-bg {
254 | background-color: $royal;
255 | }
256 | .royal-border {
257 | border-color: $button-royal-border;
258 | }
259 |
260 | .dark, a.dark {
261 | color: $dark;
262 | }
263 | .dark-bg {
264 | background-color: $dark;
265 | }
266 | .dark-border {
267 | border-color: $button-dark-border;
268 | }
269 |
270 | [collection-repeat] {
271 | /* Position is set by transforms */
272 | left: 0 !important;
273 | top: 0 !important;
274 | position: absolute !important;
275 | z-index: 1;
276 | }
277 | .collection-repeat-container {
278 | position: relative;
279 | }
280 | .collection-repeat-after-container {
281 | z-index: 0;
282 | display: block;
283 |
284 | /* when scrolling horizontally, make sure the after container doesn't take up 100% width */
285 | &.horizontal {
286 | display: inline-block;
287 | }
288 | }
289 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_scaffolding.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Scaffolding
4 | * --------------------------------------------------
5 | */
6 |
7 | *,
8 | *:before,
9 | *:after {
10 | @include box-sizing(border-box);
11 | }
12 |
13 | html {
14 | overflow: hidden;
15 | -ms-touch-action: pan-y;
16 | touch-action: pan-y;
17 | }
18 |
19 | body,
20 | .ionic-body {
21 | @include touch-callout(none);
22 | @include font-smoothing(antialiased);
23 | @include text-size-adjust(none);
24 | @include tap-highlight-transparent();
25 | @include user-select(none);
26 |
27 | top: 0;
28 | right: 0;
29 | bottom: 0;
30 | left: 0;
31 | overflow: hidden;
32 |
33 | margin: 0;
34 | padding: 0;
35 |
36 | color: $base-color;
37 | word-wrap: break-word;
38 | font-size: $font-size-base;
39 | font-family: $font-family-base;
40 | line-height: $line-height-computed;
41 | text-rendering: optimizeLegibility;
42 | -webkit-backface-visibility: hidden;
43 | -webkit-user-drag: none;
44 | -ms-content-zooming: none;
45 | }
46 |
47 | body.grade-b,
48 | body.grade-c {
49 | // disable optimizeLegibility for low end devices
50 | text-rendering: auto;
51 | }
52 |
53 | .content {
54 | // used for content areas not using the content directive
55 | position: relative;
56 | }
57 |
58 | .scroll-content {
59 | position: absolute;
60 | top: 0;
61 | right: 0;
62 | bottom: 0;
63 | left: 0;
64 | overflow: hidden;
65 |
66 | // Hide the top border if any
67 | margin-top: -1px;
68 |
69 | // Prevents any distortion of lines
70 | padding-top:1px;
71 |
72 | width: auto;
73 | height: auto;
74 | }
75 |
76 | .scroll-content-false,
77 | .menu .scroll-content.scroll-content-false{
78 | z-index: $z-index-scroll-content-false;
79 | }
80 |
81 | .scroll-view {
82 | position: relative;
83 | display: block;
84 | overflow: hidden;
85 |
86 | // Hide the top border if any
87 | margin-top: -1px;
88 | }
89 |
90 | /**
91 | * Scroll is the scroll view component available for complex and custom
92 | * scroll view functionality.
93 | */
94 | .scroll {
95 | @include user-select(none);
96 | @include touch-callout(none);
97 | @include text-size-adjust(none);
98 | @include transform-origin(left, top);
99 | }
100 |
101 | // Scroll bar styles
102 | .scroll-bar {
103 | position: absolute;
104 | z-index: $z-index-scroll-bar;
105 | }
106 | // hide the scroll-bar during animations
107 | .ng-animate .scroll-bar {
108 | visibility: hidden;
109 | }
110 | .scroll-bar-h {
111 | right: 2px;
112 | bottom: 3px;
113 | left: 2px;
114 | height: 3px;
115 |
116 | .scroll-bar-indicator {
117 | height: 100%;
118 | }
119 | }
120 |
121 | .scroll-bar-v {
122 | top: 2px;
123 | right: 3px;
124 | bottom: 2px;
125 | width: 3px;
126 |
127 | .scroll-bar-indicator {
128 | width: 100%;
129 | }
130 | }
131 | .scroll-bar-indicator {
132 | position: absolute;
133 | border-radius: 4px;
134 | background: rgba(0,0,0,0.3);
135 | opacity: 1;
136 | @include transition(opacity .3s linear);
137 |
138 | &.scroll-bar-fade-out {
139 | opacity: 0;
140 | }
141 | }
142 | .platform-android .scroll-bar-indicator {
143 | // android doesn't have rounded ends on scrollbar
144 | border-radius: 0;
145 | }
146 | .grade-b .scroll-bar-indicator,
147 | .grade-c .scroll-bar-indicator {
148 | // disable rgba background and border radius for low end devices
149 | background: #aaa;
150 |
151 | &.scroll-bar-fade-out {
152 | @include transition(none);
153 | }
154 | }
155 |
156 | ion-infinite-scroll {
157 | height: 60px;
158 | width: 100%;
159 | display: block;
160 |
161 | @include display-flex();
162 | @include flex-direction(row);
163 | @include justify-content(center);
164 | @include align-items(center);
165 |
166 | .icon {
167 | color: #666666;
168 | font-size: 30px;
169 | color: $scroll-refresh-icon-color;
170 | }
171 | .icon:before,
172 | .spinner{
173 | -webkit-transform: translate3d(0,0,0);
174 | transform: translate3d(0,0,0);
175 | }
176 | &:not(.active){
177 | .spinner,
178 | .icon:before{
179 | -webkit-transform: translate3d(-1000px,0,0);
180 | transform: translate3d(-1000px,0,0);
181 | }
182 | }
183 | }
184 |
185 | .overflow-scroll {
186 | overflow-x: hidden;
187 | overflow-y: scroll;
188 | -webkit-overflow-scrolling: touch;
189 | top: 0;
190 | right: 0;
191 | bottom: 0;
192 | left: 0;
193 | position: absolute;
194 |
195 | .scroll {
196 | position: static;
197 | height: 100%;
198 | -webkit-transform: translate3d(0, 0, 0); // fix iOS bug where relative children of scroller disapear while scrolling. see: http://stackoverflow.com/questions/9807620/ipad-safari-scrolling-causes-html-elements-to-disappear-and-reappear-with-a-dela
199 | }
200 | }
201 |
202 |
203 | // Pad top/bottom of content so it doesn't hide behind .bar-title and .bar-tab.
204 | // Note: For these to work, content must come after both bars in the markup
205 | /* If you change these, change platform.scss as well */
206 | .has-header {
207 | top: $bar-height;
208 | }
209 | // Force no header
210 | .no-header {
211 | top: 0;
212 | }
213 |
214 | .has-subheader {
215 | top: $bar-height + $bar-subheader-height;
216 | }
217 | .has-tabs-top {
218 | top: $bar-height + $tabs-height;
219 | }
220 | .has-header.has-subheader.has-tabs-top {
221 | top: $bar-height + $bar-subheader-height + $tabs-height;
222 | }
223 |
224 | .has-footer {
225 | bottom: $bar-footer-height;
226 | }
227 | .has-subfooter {
228 | bottom: $bar-footer-height + $bar-subfooter-height;
229 | }
230 |
231 | .has-tabs,
232 | .bar-footer.has-tabs {
233 | bottom: $tabs-height;
234 | &.pane{
235 | bottom: $tabs-height;
236 | height:auto;
237 | }
238 | }
239 |
240 | .has-footer.has-tabs {
241 | bottom: $tabs-height + $bar-footer-height;
242 | }
243 |
244 | // A full screen section with a solid background
245 | .pane {
246 | @include translate3d(0,0,0);
247 | @include transition-duration(0);
248 | z-index: $z-index-pane;
249 | }
250 | .view {
251 | z-index: $z-index-view;
252 | }
253 | .pane,
254 | .view {
255 | position: absolute;
256 | top: 0;
257 | right: 0;
258 | bottom: 0;
259 | left: 0;
260 | width: 100%;
261 | height: 100%;
262 | background-color: $base-background-color;
263 | overflow: hidden;
264 | }
265 | .view-container {
266 | position: absolute;
267 | display: block;
268 | width: 100%;
269 | height: 100%;
270 | }
271 |
--------------------------------------------------------------------------------
/app/engine.js:
--------------------------------------------------------------------------------
1 | var paths = [];
2 |
3 | var getPathForUser = function(userId){
4 | return paths[userId];
5 | }
6 |
7 | var setPathForUser = function(userId, path){
8 | paths[userId] = path;
9 | console.log(paths);
10 | }
11 |
12 | var handleCar = function(matchedText, wholeText){
13 | return "Your car insurance for Reg Number " + matchedText + " will add £80 per month";
14 | }
15 |
16 | var handleHouse = function(matchedText, wholeText){
17 | return "Are you looking for house insurence for postcode: " + matchedText + "?";
18 | }
19 |
20 | var handleBike = function(matchedText, wholeText){
21 | return "Your bike insurance will add £25";
22 | }
23 |
24 | var handlePet = function(matchedText, wholeText){
25 | return "Pet insurance will add a monthly fee of " + matchedText + "£25";
26 | };
27 |
28 | var handleGadget = function(matchedText, wholeText){
29 | return "Gadget insurance for your " + matchedText + " is £2.99 per month";
30 | };
31 |
32 | var handleBody = function(matchedText, wholeText){
33 | return "Body parts insurance for your " + matchedText + " is £150,000.00";
34 | };
35 |
36 | var handleHelp = function(matchedText, fullText){
37 | return "Although we do not insure " + fullText.replace('@plsinsure', '').trim() + " at the moment - we hope to bring you this cover soon";
38 | };
39 |
40 | var handleCity = function(matchedText, fullText){
41 | return "You want to insure " + matchedText + " - if you need to ask you can't afford it.";
42 | }
43 |
44 | var matchers = [
45 | {regex:/(\w{2,2}\d{2,2}(?:| )\w{3,3})/i, action: handleCar},
46 | {regex:/(\w{2,2}\d{1,2}(?:| )\d{1,1}\w{2,2})/i, action: handleHouse},
47 | {regex:/(house|home|contents|building)/i, action: handleHouse},
48 | {regex:/(cat|dog|fish|snake|gerbil|rat|reptile)/i, action: handlePet},
49 | {regex:/(iPad|iPhone|camera|canon|nikon|samsung)/i, action: handleGadget},
50 | {regex:/(legs|fingers|head|lips|eyes|nose|teeth)/i, action: handleBody},
51 | {regex:/(london|paris|new york|los angeles|berlin|tokyo)/i, action: handleCity},
52 | {regex:/(bike|bicycle|marin|boardman|brompton|specialized|dawes|raleigh)/i, action: handleBike},
53 | {regex:/(.+)/i, action: handleHelp}
54 | ]
55 |
56 | var nicksResponse = function(chat, path, userId){
57 | var bot = '';
58 |
59 | if(path !== '') {
60 | if(path === 'gadget'){
61 | if(/^y|yes|okay|sure$/i.test(chat)){ bot = "Cool, you bought gadget insurance at: 4.99/month. What next?"; path = '';}
62 | else if(/^no|negative|nope|nah$/i.test(chat)){ bot = "Oh okay, just let me know what type of insurance you're after when you're ready..."; path = '';}
63 | else { bot = "I didn't understand that...did you want gadget insurance? Please say yes or no...";}
64 | }
65 | if(path === 'home'){
66 | if(/\d+/i.test(chat)){ bot = "Thanks, looks like you're all set, fetching a quote..."; path = '';}
67 | else if(/^no|negative|nope|nah$/i.test(chat)){ bot = "Oh okay...sad times!...Just let me know what type of insurance you're after when you're ready..."; path = '';}
68 | else { bot = "I didn't understand that...did you want home insurance? Please say yes or no...";}
69 | }
70 | if(path === 'bike'){
71 | if(/^y|yes|okay$/i.test(chat)){ bot = "Cool, you bought bike insurance at: 9.99/month. What next?"; path = '';}
72 | else if(/^no|negative|nope|nah$/i.test(chat)){ bot = "Cool, your premium will remain the same"; path = ''}
73 | else { bot = "I didn't understand that...did you want bike insurance? Please say yes or no...";}
74 | }
75 | if(path === 'pet'){
76 | if(/^y|yes|okay$/i.test(chat)){ bot = "Cool, you bought pet insurance at: 6.99/month. What next?"; path = '';}
77 | else if(/^no|negative|nope|nah$/i.test(chat)){ bot = "Cool, your premium will remain the same"; path = ''}
78 | else { bot = "I didn't understand that...did you want pet insurance? Please say yes or no...";}
79 | }
80 | else if(path === 'facebook'){
81 | if(/^y|yes|okay$/i.test(chat)){ document.location = 'https://facebook.com'; path = '';}
82 | else if(/^no|negative|nope|nah$/i.test(chat)){ bot = "No worries, let's do it the traditional way :)"; path = ''}
83 | else { bot = "I didn't understand that...did you want to connect to facebook? Please say yes or no...";}
84 | }
85 | // else {
86 | // bot = "Hmm...I've gotten confused...let's start again...";
87 | // path = '';
88 | // }
89 | } else {
90 | if(/hi|hello|alfred/i.test(chat)){ bot = "Enough with the pleasantries...let's get down to business! What insurance are you after?"; }
91 | if(/phone|mobile|gadget|iPad|Android/i.test(chat)){ bot = "Okay, our gadget insurance starts at 4.99/month, want to add it to your bill?"; path = 'gadget'; }
92 | if(/bike|bicycle|marin|boardman|brompton|specialized|dawes|raleigh/i.test(chat)){ bot = "Okay, our bike insurance starts at 9.99/month, want to add it to your bill?"; path = 'bike' }
93 | if(/(cat|dog|fish|snake|gerbil|rat|reptile)/i.test(chat)){ bot = "Okay, our pet insurance starts at 6.99/month, want to add it to your bill?"; path = 'pet' }
94 | if(/home/i.test(chat)){ bot = "Okay, here's a quick way to get home insurance: http://www.alfredhomeinsurance.com, or tell me the size of your home in square feet."; path='home'; }
95 | if(/car|boat|^pi$|^pl$|professional indemnity|professional liability/i.test(chat)){ bot = "I'm afraid we only offer: home, gadget, and bike insurance at the moment."; }
96 | if(/\d+/i.test(chat)){ bot += "Fancy numbers! Are you an actuary or something?"; }
97 | if(/facebook/i.test(chat)){ bot = "Connect to facebook to fast track past some questions?"; path = 'facebook'}
98 | }
99 |
100 | if(bot === ""){
101 | bot = "Whaa?!? Is that insurance speak?";
102 | }
103 |
104 | setPathForUser(userId, path);
105 | var responseFromBot = { text: bot, type: 'message'};
106 | if(path === 'gadget'){
107 | responseFromBot = { text: bot, type: 'upload'};
108 | }
109 |
110 | return responseFromBot;
111 | }
112 |
113 | var process = function(data){
114 | var userId = data.userId;
115 | console.log(data.userId);
116 | var text = data.text;
117 |
118 | if (!getPathForUser(userId)){
119 | setPathForUser(userId, '');
120 | }
121 | return nicksResponse(text, getPathForUser(userId), userId);
122 | // var matcherCount = matchers.length;
123 | // for (var i = 0; i < matcherCount; i++)
124 | // {
125 | // var matcher = matchers[i];
126 | // var matches = text.match(matcher.regex);
127 | // if (matches)
128 | // {
129 | // return matcher.action(matches[0], text)
130 | // }
131 | // }
132 | }
133 |
134 | var engine = {
135 | process: process
136 | }
137 |
138 | module.exports = engine;
139 |
140 |
--------------------------------------------------------------------------------
/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, 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 | display: table;
114 | padding: 7px 10px 7px 0px;
115 | max-width: 200px;
116 | width: 35%;
117 | color: $input-label-color;
118 | font-size: 16px;
119 | }
120 |
121 | .placeholder-icon {
122 | color: #aaa;
123 | &:first-child {
124 | padding-right: 6px;
125 | }
126 | &:last-child {
127 | padding-left: 6px;
128 | }
129 | }
130 |
131 | .item-stacked-label {
132 | display: block;
133 | background-color: transparent;
134 | box-shadow: none;
135 |
136 | .input-label, .icon {
137 | display: inline-block;
138 | padding: 4px 0 0 0px;
139 | vertical-align: middle;
140 | }
141 | }
142 |
143 | .item-stacked-label input,
144 | .item-stacked-label textarea {
145 | @include border-radius(2px);
146 | padding: 4px 8px 3px 0;
147 | border: none;
148 | background-color: $input-bg;
149 | }
150 | .item-stacked-label input {
151 | overflow: hidden;
152 | height: $line-height-computed + $font-size-base + 12px;
153 | }
154 |
155 | .item-floating-label {
156 | display: block;
157 | background-color: transparent;
158 | box-shadow: none;
159 |
160 | .input-label {
161 | position: relative;
162 | padding: 5px 0 0 0;
163 | opacity: 0;
164 | top: 10px;
165 | @include transition(opacity .15s ease-in, top .2s linear);
166 |
167 | &.has-input {
168 | opacity: 1;
169 | top: 0;
170 | @include transition(opacity .15s ease-in, top .2s linear);
171 | }
172 | }
173 | }
174 |
175 |
176 | // Form Controls
177 | // -------------------------------
178 |
179 | // Shared size and type resets
180 | textarea,
181 | input[type="text"],
182 | input[type="password"],
183 | input[type="datetime"],
184 | input[type="datetime-local"],
185 | input[type="date"],
186 | input[type="month"],
187 | input[type="time"],
188 | input[type="week"],
189 | input[type="number"],
190 | input[type="email"],
191 | input[type="url"],
192 | input[type="search"],
193 | input[type="tel"],
194 | input[type="color"] {
195 | display: block;
196 | padding-top: 2px;
197 | padding-left: 0;
198 | height: $line-height-computed + $font-size-base;
199 | color: $input-color;
200 | vertical-align: middle;
201 | font-size: $font-size-base;
202 | line-height: $font-size-base + 2;
203 | }
204 |
205 | .platform-ios,
206 | .platform-android {
207 | input[type="datetime-local"],
208 | input[type="date"],
209 | input[type="month"],
210 | input[type="time"],
211 | input[type="week"] {
212 | padding-top: 8px;
213 | }
214 | }
215 |
216 | .item-input {
217 | input,
218 | textarea {
219 | width: 100%;
220 | }
221 | }
222 |
223 | textarea {
224 | padding-left: 0;
225 | @include placeholder($input-color-placeholder, -3px);
226 | }
227 |
228 | // Reset height since textareas have rows
229 | textarea {
230 | height: auto;
231 | }
232 |
233 | // Everything else
234 | textarea,
235 | input[type="text"],
236 | input[type="password"],
237 | input[type="datetime"],
238 | input[type="datetime-local"],
239 | input[type="date"],
240 | input[type="month"],
241 | input[type="time"],
242 | input[type="week"],
243 | input[type="number"],
244 | input[type="email"],
245 | input[type="url"],
246 | input[type="search"],
247 | input[type="tel"],
248 | input[type="color"] {
249 | border: 0;
250 | }
251 |
252 | // Position radios and checkboxes better
253 | input[type="radio"],
254 | input[type="checkbox"] {
255 | margin: 0;
256 | line-height: normal;
257 | }
258 |
259 | // Reset width of input images, buttons, radios, checkboxes
260 | .item-input {
261 | input[type="file"],
262 | input[type="image"],
263 | input[type="submit"],
264 | input[type="reset"],
265 | input[type="button"],
266 | input[type="radio"],
267 | input[type="checkbox"] {
268 | width: auto; // Override of generic input selector
269 | }
270 | }
271 |
272 | // Set the height of file to match text inputs
273 | input[type="file"] {
274 | line-height: $input-height-base;
275 | }
276 |
277 | // Text input classes to hide text caret during scroll
278 | .previous-input-focus,
279 | .cloned-text-input + input,
280 | .cloned-text-input + textarea {
281 | position: absolute !important;
282 | left: -9999px;
283 | width: 200px;
284 | }
285 |
286 |
287 | // Placeholder
288 | // -------------------------------
289 | input,
290 | textarea {
291 | @include placeholder();
292 | }
293 |
294 |
295 | // DISABLED STATE
296 | // -------------------------------
297 |
298 | // Disabled and read-only inputs
299 | input[disabled],
300 | select[disabled],
301 | textarea[disabled],
302 | input[readonly]:not(.cloned-text-input),
303 | textarea[readonly]:not(.cloned-text-input),
304 | select[readonly] {
305 | background-color: $input-bg-disabled;
306 | cursor: not-allowed;
307 | }
308 | // Explicitly reset the colors here
309 | input[type="radio"][disabled],
310 | input[type="checkbox"][disabled],
311 | input[type="radio"][readonly],
312 | input[type="checkbox"][readonly] {
313 | background-color: transparent;
314 | }
315 |
--------------------------------------------------------------------------------
/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/_reset.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Resets
4 | * --------------------------------------------------
5 | * Adapted from normalize.css and some reset.css. We don't care even one
6 | * bit about old IE, so we don't need any hacks for that in here.
7 | *
8 | * There are probably other things we could remove here, as well.
9 | *
10 | * normalize.css v2.1.2 | MIT License | git.io/normalize
11 |
12 | * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
13 | * http://cssreset.com
14 | */
15 |
16 | html, body, div, span, applet, object, iframe,
17 | h1, h2, h3, h4, h5, h6, p, blockquote, pre,
18 | a, abbr, acronym, address, big, cite, code,
19 | del, dfn, em, img, ins, kbd, q, s, samp,
20 | small, strike, strong, sub, sup, tt, var,
21 | b, i, u, center,
22 | dl, dt, dd, ol, ul, li,
23 | fieldset, form, label, legend,
24 | table, caption, tbody, tfoot, thead, tr, th, td,
25 | article, aside, canvas, details, embed, fieldset,
26 | figure, figcaption, footer, header, hgroup,
27 | menu, nav, output, ruby, section, summary,
28 | time, mark, audio, video {
29 | margin: 0;
30 | padding: 0;
31 | border: 0;
32 | vertical-align: baseline;
33 | font: inherit;
34 | font-size: 100%;
35 | }
36 |
37 | ol, ul {
38 | list-style: none;
39 | }
40 | blockquote, q {
41 | quotes: none;
42 | }
43 | blockquote:before, blockquote:after,
44 | q:before, q:after {
45 | content: '';
46 | content: none;
47 | }
48 |
49 | /**
50 | * Prevent modern browsers from displaying `audio` without controls.
51 | * Remove excess height in iOS 5 devices.
52 | */
53 |
54 | audio:not([controls]) {
55 | display: none;
56 | height: 0;
57 | }
58 |
59 | /**
60 | * Hide the `template` element in IE, Safari, and Firefox < 22.
61 | */
62 |
63 | [hidden],
64 | template {
65 | display: none;
66 | }
67 |
68 | script {
69 | display: none !important;
70 | }
71 |
72 | /* ==========================================================================
73 | Base
74 | ========================================================================== */
75 |
76 | /**
77 | * 1. Set default font family to sans-serif.
78 | * 2. Prevent iOS text size adjust after orientation change, without disabling
79 | * user zoom.
80 | */
81 |
82 | html {
83 | @include user-select(none);
84 | font-family: sans-serif; /* 1 */
85 | -webkit-text-size-adjust: 100%;
86 | -ms-text-size-adjust: 100%; /* 2 */
87 | -webkit-text-size-adjust: 100%; /* 2 */
88 | }
89 |
90 | /**
91 | * Remove default margin.
92 | */
93 |
94 | body {
95 | margin: 0;
96 | line-height: 1;
97 | }
98 |
99 |
100 | /**
101 | * Remove default outlines.
102 | */
103 | a,
104 | button,
105 | :focus,
106 | a:focus,
107 | button:focus,
108 | a:active,
109 | a:hover {
110 | outline: 0;
111 | }
112 |
113 | /* *
114 | * Remove tap highlight color
115 | */
116 |
117 | a {
118 | -webkit-user-drag: none;
119 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
120 | -webkit-tap-highlight-color: transparent;
121 |
122 | &[href]:hover {
123 | cursor: pointer;
124 | }
125 | }
126 |
127 | /* ==========================================================================
128 | Typography
129 | ========================================================================== */
130 |
131 |
132 | /**
133 | * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
134 | */
135 |
136 | b,
137 | strong {
138 | font-weight: bold;
139 | }
140 |
141 | /**
142 | * Address styling not present in Safari 5 and Chrome.
143 | */
144 |
145 | dfn {
146 | font-style: italic;
147 | }
148 |
149 | /**
150 | * Address differences between Firefox and other browsers.
151 | */
152 |
153 | hr {
154 | -moz-box-sizing: content-box;
155 | box-sizing: content-box;
156 | height: 0;
157 | }
158 |
159 |
160 | /**
161 | * Correct font family set oddly in Safari 5 and Chrome.
162 | */
163 |
164 | code,
165 | kbd,
166 | pre,
167 | samp {
168 | font-size: 1em;
169 | font-family: monospace, serif;
170 | }
171 |
172 | /**
173 | * Improve readability of pre-formatted text in all browsers.
174 | */
175 |
176 | pre {
177 | white-space: pre-wrap;
178 | }
179 |
180 | /**
181 | * Set consistent quote types.
182 | */
183 |
184 | q {
185 | quotes: "\201C" "\201D" "\2018" "\2019";
186 | }
187 |
188 | /**
189 | * Address inconsistent and variable font size in all browsers.
190 | */
191 |
192 | small {
193 | font-size: 80%;
194 | }
195 |
196 | /**
197 | * Prevent `sub` and `sup` affecting `line-height` in all browsers.
198 | */
199 |
200 | sub,
201 | sup {
202 | position: relative;
203 | vertical-align: baseline;
204 | font-size: 75%;
205 | line-height: 0;
206 | }
207 |
208 | sup {
209 | top: -0.5em;
210 | }
211 |
212 | sub {
213 | bottom: -0.25em;
214 | }
215 |
216 | /**
217 | * Define consistent border, margin, and padding.
218 | */
219 |
220 | fieldset {
221 | margin: 0 2px;
222 | padding: 0.35em 0.625em 0.75em;
223 | border: 1px solid #c0c0c0;
224 | }
225 |
226 | /**
227 | * 1. Correct `color` not being inherited in IE 8/9.
228 | * 2. Remove padding so people aren't caught out if they zero out fieldsets.
229 | */
230 |
231 | legend {
232 | padding: 0; /* 2 */
233 | border: 0; /* 1 */
234 | }
235 |
236 | /**
237 | * 1. Correct font family not being inherited in all browsers.
238 | * 2. Correct font size not being inherited in all browsers.
239 | * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
240 | * 4. Remove any default :focus styles
241 | * 5. Make sure webkit font smoothing is being inherited
242 | * 6. Remove default gradient in Android Firefox / FirefoxOS
243 | */
244 |
245 | button,
246 | input,
247 | select,
248 | textarea {
249 | margin: 0; /* 3 */
250 | font-size: 100%; /* 2 */
251 | font-family: inherit; /* 1 */
252 | outline-offset: 0; /* 4 */
253 | outline-style: none; /* 4 */
254 | outline-width: 0; /* 4 */
255 | -webkit-font-smoothing: inherit; /* 5 */
256 | background-image: none; /* 6 */
257 | }
258 |
259 | /**
260 | * Address Firefox 4+ setting `line-height` on `input` using `importnt` in
261 | * the UA stylesheet.
262 | */
263 |
264 | button,
265 | input {
266 | line-height: normal;
267 | }
268 |
269 | /**
270 | * Address inconsistent `text-transform` inheritance for `button` and `select`.
271 | * All other form control elements do not inherit `text-transform` values.
272 | * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
273 | * Correct `select` style inheritance in Firefox 4+ and Opera.
274 | */
275 |
276 | button,
277 | select {
278 | text-transform: none;
279 | }
280 |
281 | /**
282 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
283 | * and `video` controls.
284 | * 2. Correct inability to style clickable `input` types in iOS.
285 | * 3. Improve usability and consistency of cursor style between image-type
286 | * `input` and others.
287 | */
288 |
289 | button,
290 | html input[type="button"], /* 1 */
291 | input[type="reset"],
292 | input[type="submit"] {
293 | cursor: pointer; /* 3 */
294 | -webkit-appearance: button; /* 2 */
295 | }
296 |
297 | /**
298 | * Re-set default cursor for disabled elements.
299 | */
300 |
301 | button[disabled],
302 | html input[disabled] {
303 | cursor: default;
304 | }
305 |
306 | /**
307 | * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
308 | * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
309 | * (include `-moz` to future-proof).
310 | */
311 |
312 | input[type="search"] {
313 | -webkit-box-sizing: content-box; /* 2 */
314 | -moz-box-sizing: content-box;
315 | box-sizing: content-box;
316 | -webkit-appearance: textfield; /* 1 */
317 | }
318 |
319 | /**
320 | * Remove inner padding and search cancel button in Safari 5 and Chrome
321 | * on OS X.
322 | */
323 |
324 | input[type="search"]::-webkit-search-cancel-button,
325 | input[type="search"]::-webkit-search-decoration {
326 | -webkit-appearance: none;
327 | }
328 |
329 | /**
330 | * Remove inner padding and border in Firefox 4+.
331 | */
332 |
333 | button::-moz-focus-inner,
334 | input::-moz-focus-inner {
335 | padding: 0;
336 | border: 0;
337 | }
338 |
339 | /**
340 | * 1. Remove default vertical scrollbar in IE 8/9.
341 | * 2. Improve readability and alignment in all browsers.
342 | */
343 |
344 | textarea {
345 | overflow: auto; /* 1 */
346 | vertical-align: top; /* 2 */
347 | }
348 |
349 |
350 | img {
351 | -webkit-user-drag: none;
352 | }
353 |
354 | /* ==========================================================================
355 | Tables
356 | ========================================================================== */
357 |
358 | /**
359 | * Remove most spacing between table cells.
360 | */
361 |
362 | table {
363 | border-spacing: 0;
364 | border-collapse: collapse;
365 | }
366 |
--------------------------------------------------------------------------------
/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 objectKeys(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 indexOf(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) continue;
100 | parentParams = objectKeys(parents[i].params);
101 | if (!parentParams.length) continue;
102 |
103 | for (var j in parentParams) {
104 | if (indexOf(inheritList, parentParams[j]) >= 0) continue;
105 | inheritList.push(parentParams[j]);
106 | inherited[parentParams[j]] = currentParams[parentParams[j]];
107 | }
108 | }
109 | return extend({}, inherited, newParams);
110 | }
111 |
112 | /**
113 | * Performs a non-strict comparison of the subset of two objects, defined by a list of keys.
114 | *
115 | * @param {Object} a The first object.
116 | * @param {Object} b The second object.
117 | * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified,
118 | * it defaults to the list of keys in `a`.
119 | * @return {Boolean} Returns `true` if the keys match, otherwise `false`.
120 | */
121 | function equalForKeys(a, b, keys) {
122 | if (!keys) {
123 | keys = [];
124 | for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility
125 | }
126 |
127 | for (var i=0; i
274 | *
275 | *
276 | *
277 | *
278 | *
279 | *
280 | *
284 | *
285 | *
286 | *
287 | *
288 | *
289 | */
290 | angular.module('ui.router', ['ui.router.state']);
291 |
292 | angular.module('ui.router.compat', ['ui.router']);
293 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/README.md:
--------------------------------------------------------------------------------
1 | # AngularUI Router [](https://travis-ci.org/angular-ui/ui-router)
2 |
3 | #### The de-facto solution to flexible routing with nested views
4 | ---
5 | **[Download 0.2.11](http://angular-ui.github.io/ui-router/release/angular-ui-router.js)** (or **[Minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)**) **|**
6 | **[Guide](https://github.com/angular-ui/ui-router/wiki) |**
7 | **[API](http://angular-ui.github.io/ui-router/site) |**
8 | **[Sample](http://angular-ui.github.com/ui-router/sample/) ([Src](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) |**
9 | **[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) |**
10 | **[Resources](#resources) |**
11 | **[Report an Issue](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#report-an-issue) |**
12 | **[Contribute](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#contribute) |**
13 | **[Help!](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |**
14 | **[Discuss](https://groups.google.com/forum/#!categories/angular-ui/router)**
15 |
16 | ---
17 |
18 | AngularUI Router is a routing framework for [AngularJS](http://angularjs.org), which allows you to organize the
19 | parts of your interface into a [*state machine*](https://en.wikipedia.org/wiki/Finite-state_machine). Unlike the
20 | [`$route` service](http://docs.angularjs.org/api/ngRoute.$route) in the Angular ngRoute module, which is organized around URL
21 | routes, UI-Router is organized around [*states*](https://github.com/angular-ui/ui-router/wiki),
22 | which may optionally have routes, as well as other behavior, attached.
23 |
24 | States are bound to *named*, *nested* and *parallel views*, allowing you to powerfully manage your application's interface.
25 |
26 | Check out the sample app: http://angular-ui.github.io/ui-router/sample/
27 |
28 | -
29 | **Note:** *UI-Router is under active development. As such, while this library is well-tested, the API may change. Consider using it in production applications only if you're comfortable following a changelog and updating your usage accordingly.*
30 |
31 |
32 | ## Get Started
33 |
34 | **(1)** Get UI-Router in one of the following ways:
35 | - clone & [build](CONTRIBUTING.md#developing) this repository
36 | - [download the release](http://angular-ui.github.io/ui-router/release/angular-ui-router.js) (or [minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js))
37 | - via **[Bower](http://bower.io/)**: by running `$ bower install angular-ui-router` from your console
38 | - or via **[npm](https://www.npmjs.org/)**: by running `$ npm install angular-ui-router` from your console
39 | - or via **[Component](https://github.com/component/component)**: by running `$ component install angular-ui/ui-router` from your console
40 |
41 | **(2)** Include `angular-ui-router.js` (or `angular-ui-router.min.js`) in your `index.html`, after including Angular itself (For Component users: ignore this step)
42 |
43 | **(3)** Add `'ui.router'` to your main module's list of dependencies (For Component users: replace `'ui.router'` with `require('angular-ui-router')`)
44 |
45 | When you're done, your setup should look similar to the following:
46 |
47 | >
48 | ```html
49 |
50 |
51 |
52 |
53 |
54 |
59 | ...
60 |
61 |
62 | ...
63 |
64 |
65 | ```
66 |
67 | ### [Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview)
68 |
69 | The majority of UI-Router's power is in its ability to nest states & views.
70 |
71 | **(1)** First, follow the [setup](#get-started) instructions detailed above.
72 |
73 | **(2)** Then, add a [`ui-view` directive](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-view) to the ` ` of your app.
74 |
75 | >
76 | ```html
77 |
78 |
79 |
80 |
81 | State 1
82 | State 2
83 |
84 | ```
85 |
86 | **(3)** You'll notice we also added some links with [`ui-sref` directives](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-sref). In addition to managing state transitions, this directive auto-generates the `href` attribute of the ` ` element it's attached to, if the corresponding state has a URL. Next we'll add some templates. These will plug into the `ui-view` within `index.html`. Notice that they have their own `ui-view` as well! That is the key to nesting states and views.
87 |
88 | >
89 | ```html
90 |
91 | State 1
92 |
93 | Show List
94 |
95 | ```
96 | ```html
97 |
98 | State 2
99 |
100 | Show List
101 |
102 | ```
103 |
104 | **(4)** Next, we'll add some child templates. *These* will get plugged into the `ui-view` of their parent state templates.
105 |
106 | >
107 | ```html
108 |
109 | List of State 1 Items
110 |
113 | ```
114 |
115 | >
116 | ```html
117 |
118 | List of State 2 Things
119 |
122 | ```
123 |
124 | **(5)** Finally, we'll wire it all up with `$stateProvider`. Set up your states in the module config, as in the following:
125 |
126 |
127 | >
128 | ```javascript
129 | myApp.config(function($stateProvider, $urlRouterProvider) {
130 | //
131 | // For any unmatched url, redirect to /state1
132 | $urlRouterProvider.otherwise("/state1");
133 | //
134 | // Now set up the states
135 | $stateProvider
136 | .state('state1', {
137 | url: "/state1",
138 | templateUrl: "partials/state1.html"
139 | })
140 | .state('state1.list', {
141 | url: "/list",
142 | templateUrl: "partials/state1.list.html",
143 | controller: function($scope) {
144 | $scope.items = ["A", "List", "Of", "Items"];
145 | }
146 | })
147 | .state('state2', {
148 | url: "/state2",
149 | templateUrl: "partials/state2.html"
150 | })
151 | .state('state2.list', {
152 | url: "/list",
153 | templateUrl: "partials/state2.list.html",
154 | controller: function($scope) {
155 | $scope.things = ["A", "Set", "Of", "Things"];
156 | }
157 | });
158 | });
159 | ```
160 |
161 | **(6)** See this quick start example in action.
162 | >**[Go to Quick Start Plunker for Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview)**
163 |
164 | **(7)** This only scratches the surface
165 | >**[Dive Deeper!](https://github.com/angular-ui/ui-router/wiki)**
166 |
167 |
168 | ### [Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview)
169 |
170 | Another great feature is the ability to have multiple `ui-view`s view per template.
171 |
172 | **Pro Tip:** *While multiple parallel views are a powerful feature, you'll often be able to manage your
173 | interfaces more effectively by nesting your views, and pairing those views with nested states.*
174 |
175 | **(1)** Follow the [setup](#get-started) instructions detailed above.
176 |
177 | **(2)** Add one or more `ui-view` to your app, give them names.
178 | >
179 | ```html
180 |
181 |
182 |
183 |
184 |
185 | Route 1
186 | Route 2
187 |
188 | ```
189 |
190 | **(3)** Set up your states in the module config:
191 | >
192 | ```javascript
193 | myApp.config(function($stateProvider) {
194 | $stateProvider
195 | .state('index', {
196 | url: "",
197 | views: {
198 | "viewA": { template: "index.viewA" },
199 | "viewB": { template: "index.viewB" }
200 | }
201 | })
202 | .state('route1', {
203 | url: "/route1",
204 | views: {
205 | "viewA": { template: "route1.viewA" },
206 | "viewB": { template: "route1.viewB" }
207 | }
208 | })
209 | .state('route2', {
210 | url: "/route2",
211 | views: {
212 | "viewA": { template: "route2.viewA" },
213 | "viewB": { template: "route2.viewB" }
214 | }
215 | })
216 | });
217 | ```
218 |
219 | **(4)** See this quick start example in action.
220 | >**[Go to Quick Start Plunker for Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview)**
221 |
222 |
223 | ## Resources
224 |
225 | * [In-Depth Guide](https://github.com/angular-ui/ui-router/wiki)
226 | * [API Reference](http://angular-ui.github.io/ui-router/site)
227 | * [Sample App](http://angular-ui.github.com/ui-router/sample/) ([Source](https://github.com/angular-ui/ui-router/tree/gh-pages/sample))
228 | * [FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions)
229 | * [Slides comparing ngRoute to ui-router](http://slid.es/timkindberg/ui-router#/)
230 | * [UI-Router Extras / Addons](http://christopherthielen.github.io/ui-router-extras/#/home) (@christopherthielen)
231 |
232 | ### Videos
233 |
234 | * [Introduction Video](https://egghead.io/lessons/angularjs-introduction-ui-router) (egghead.io)
235 | * [Tim Kindberg on Angular UI-Router](https://www.youtube.com/watch?v=lBqiZSemrqg)
236 | * [Activating States](https://egghead.io/lessons/angularjs-ui-router-activating-states) (egghead.io)
237 | * [Learn Angular.js using UI-Router](http://youtu.be/QETUuZ27N0w) (LearnCode.academy)
238 |
239 |
240 |
241 | ## Reporting issues and Contributing
242 |
243 | Please read our [Contributor guidelines](CONTRIBUTING.md) before reporting an issue or creating a pull request.
244 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/angular-sanitize.min.js.map:
--------------------------------------------------------------------------------
1 | {
2 | "version":3,
3 | "file":"angular-sanitize.min.js",
4 | "lineCount":15,
5 | "mappings":"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",
6 | "sources":["angular-sanitize.js"],
7 | "names":["window","angular","undefined","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","makeMap","str","obj","items","split","i","length","htmlParser","html","handler","parseStartTag","tag","tagName","rest","unary","lowercase","blockElements","stack","last","inlineElements","parseEndTag","optionalEndTagElements","voidElements","push","attrs","replace","ATTR_REGEXP","match","name","doubleQuotedValue","singleQuotedValue","unquotedValue","decodeEntities","start","pos","end","index","text","stack.last","specialElements","RegExp","all","COMMENT_REGEXP","CDATA_REGEXP","indexOf","lastIndexOf","comment","substring","DOCTYPE_REGEXP","test","BEGING_END_TAGE_REGEXP","END_TAG_REGEXP","BEGIN_TAG_REGEXP","START_TAG_REGEXP","$sanitizeMinErr","value","parts","spaceRe","exec","spaceBefore","spaceAfter","content","hiddenPre","innerHTML","textContent","innerText","encodeEntities","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","uriValidator","ignore","out","bind","validElements","forEach","key","lkey","isImage","validAttrs","uriAttrs","$$minErr","optionalEndTagBlockElements","optionalEndTagInlineElements","extend","svgElements","htmlAttrs","svgAttrs","document","createElement","module","provider","$SanitizeProvider","$get","$$sanitizeUri","uri","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","target","addText","addLink","url","isDefined","raw","substr"]
8 | }
9 |
--------------------------------------------------------------------------------