11 | {{chat.lastText}} 12 |
13 |{{chat.lastText}}
8 | 9 | 10 |Train ID: {{arrival.train_id}}
13 | 14 | 15 |No realtime data.
17 | 18 |
55 | * $scope.$on('$viewContentLoading',
56 | * function(event, viewConfig){
57 | * // Access to all the view config properties.
58 | * // and one special property 'targetView'
59 | * // viewConfig.targetView
60 | * });
61 | *
62 | */
63 | $rootScope.$broadcast('$viewContentLoading', options);
64 | }
65 | return result;
66 | }
67 | };
68 | }
69 | }
70 |
71 | angular.module('ui.router.state').provider('$view', $ViewProvider);
72 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_spinner.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Spinners
3 | * --------------------------------------------------
4 | */
5 |
6 | .spinner {
7 | svg {
8 | width: $spinner-width;
9 | height: $spinner-height;
10 | }
11 |
12 | stroke: $spinner-default-stroke;
13 | fill: $spinner-default-fill;
14 |
15 | &.spinner-light {
16 | stroke: $spinner-light-stroke;
17 | fill: $spinner-light-fill;
18 | }
19 | &.spinner-stable {
20 | stroke: $spinner-stable-stroke;
21 | fill: $spinner-stable-fill;
22 | }
23 | &.spinner-positive {
24 | stroke: $spinner-positive-stroke;
25 | fill: $spinner-positive-fill;
26 | }
27 | &.spinner-calm {
28 | stroke: $spinner-calm-stroke;
29 | fill: $spinner-calm-fill;
30 | }
31 | &.spinner-balanced {
32 | stroke: $spinner-balanced-stroke;
33 | fill: $spinner-balanced-fill;
34 | }
35 | &.spinner-assertive {
36 | stroke: $spinner-assertive-stroke;
37 | fill: $spinner-assertive-fill;
38 | }
39 | &.spinner-energized {
40 | stroke: $spinner-energized-stroke;
41 | fill: $spinner-energized-fill;
42 | }
43 | &.spinner-royal {
44 | stroke: $spinner-royal-stroke;
45 | fill: $spinner-royal-fill;
46 | }
47 | &.spinner-dark {
48 | stroke: $spinner-dark-stroke;
49 | fill: $spinner-dark-fill;
50 | }
51 | }
52 |
53 | .spinner-android {
54 | stroke: #4b8bf4;
55 | }
56 |
57 | .spinner-ios,
58 | .spinner-ios-small {
59 | stroke: #69717d;
60 | }
61 |
62 | .spinner-spiral {
63 | .stop1 {
64 | stop-color: $spinner-light-fill;
65 | stop-opacity: 0;
66 | }
67 |
68 | &.spinner-light {
69 | .stop1 {
70 | stop-color: $spinner-default-fill;
71 | }
72 | .stop2 {
73 | stop-color: $spinner-light-fill;
74 | }
75 | }
76 | &.spinner-stable .stop2 {
77 | stop-color: $spinner-stable-fill;
78 | }
79 | &.spinner-positive .stop2 {
80 | stop-color: $spinner-positive-fill;
81 | }
82 | &.spinner-calm .stop2 {
83 | stop-color: $spinner-calm-fill;
84 | }
85 | &.spinner-balanced .stop2 {
86 | stop-color: $spinner-balanced-fill;
87 | }
88 | &.spinner-assertive .stop2 {
89 | stop-color: $spinner-assertive-fill;
90 | }
91 | &.spinner-energized .stop2 {
92 | stop-color: $spinner-energized-fill;
93 | }
94 | &.spinner-royal .stop2 {
95 | stop-color: $spinner-royal-fill;
96 | }
97 | &.spinner-dark .stop2 {
98 | stop-color: $spinner-dark-fill;
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_popup.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Popups
4 | * --------------------------------------------------
5 | */
6 |
7 | .popup-container {
8 | position: absolute;
9 | top: 0;
10 | left: 0;
11 | bottom: 0;
12 | right: 0;
13 | background: rgba(0,0,0,0);
14 |
15 | @include display-flex();
16 | @include justify-content(center);
17 | @include align-items(center);
18 |
19 | z-index: $z-index-popup;
20 |
21 | // Start hidden
22 | visibility: hidden;
23 | &.popup-showing {
24 | visibility: visible;
25 | }
26 |
27 | &.popup-hidden .popup {
28 | @include animation-name(scaleOut);
29 | @include animation-duration($popup-leave-animation-duration);
30 | @include animation-timing-function(ease-in-out);
31 | @include animation-fill-mode(both);
32 | }
33 |
34 | &.active .popup {
35 | @include animation-name(superScaleIn);
36 | @include animation-duration($popup-enter-animation-duration);
37 | @include animation-timing-function(ease-in-out);
38 | @include animation-fill-mode(both);
39 | }
40 |
41 | .popup {
42 | width: $popup-width;
43 | max-width: 100%;
44 | max-height: 90%;
45 |
46 | border-radius: $popup-border-radius;
47 | background-color: $popup-background-color;
48 |
49 | @include display-flex();
50 | @include flex-direction(column);
51 | }
52 |
53 | input,
54 | textarea {
55 | width: 100%;
56 | }
57 | }
58 |
59 | .popup-head {
60 | padding: 15px 10px;
61 | border-bottom: 1px solid #eee;
62 | text-align: center;
63 | }
64 | .popup-title {
65 | margin: 0;
66 | padding: 0;
67 | font-size: 15px;
68 | }
69 | .popup-sub-title {
70 | margin: 5px 0 0 0;
71 | padding: 0;
72 | font-weight: normal;
73 | font-size: 11px;
74 | }
75 | .popup-body {
76 | padding: 10px;
77 | overflow: auto;
78 | }
79 |
80 | .popup-buttons {
81 | @include display-flex();
82 | @include flex-direction(row);
83 | padding: 10px;
84 | min-height: $popup-button-min-height + 20;
85 |
86 | .button {
87 | @include flex(1);
88 | display: block;
89 | min-height: $popup-button-min-height;
90 | border-radius: $popup-button-border-radius;
91 | line-height: $popup-button-line-height;
92 |
93 | margin-right: 5px;
94 | &:last-child {
95 | margin-right: 0px;
96 | }
97 | }
98 | }
99 |
100 | .popup-open {
101 | pointer-events: none;
102 |
103 | &.modal-open .modal {
104 | pointer-events: none;
105 | }
106 |
107 | .popup-backdrop, .popup {
108 | pointer-events: auto;
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_modal.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Modals
4 | * --------------------------------------------------
5 | * Modals are independent windows that slide in from off-screen.
6 | */
7 |
8 | .modal-backdrop,
9 | .modal-backdrop-bg {
10 | position: fixed;
11 | top: 0;
12 | left: 0;
13 | z-index: $z-index-modal;
14 | width: 100%;
15 | height: 100%;
16 | }
17 |
18 | .modal-backdrop-bg {
19 | pointer-events: none;
20 | }
21 |
22 | .modal {
23 | display: block;
24 | position: absolute;
25 | top: 0;
26 | z-index: $z-index-modal;
27 | overflow: hidden;
28 | min-height: 100%;
29 | width: 100%;
30 | background-color: $modal-bg-color;
31 | }
32 |
33 | @media (min-width: $modal-inset-mode-break-point) {
34 | // inset mode is when the modal doesn't fill the entire
35 | // display but instead is centered within a large display
36 | .modal {
37 | top: $modal-inset-mode-top;
38 | right: $modal-inset-mode-right;
39 | bottom: $modal-inset-mode-bottom;
40 | left: $modal-inset-mode-left;
41 | min-height: $modal-inset-mode-min-height;
42 | width: (100% - $modal-inset-mode-left - $modal-inset-mode-right);
43 | }
44 |
45 | .modal.ng-leave-active {
46 | bottom: 0;
47 | }
48 |
49 | // remove ios header padding from inset header
50 | .platform-ios.platform-cordova .modal-wrapper .modal {
51 | .bar-header:not(.bar-subheader) {
52 | height: $bar-height;
53 | > * {
54 | margin-top: 0;
55 | }
56 | }
57 | .tabs-top > .tabs,
58 | .tabs.tabs-top {
59 | top: $bar-height;
60 | }
61 | .has-header,
62 | .bar-subheader {
63 | top: $bar-height;
64 | }
65 | .has-subheader {
66 | top: $bar-height + $bar-subheader-height;
67 | }
68 | .has-header.has-tabs-top {
69 | top: $bar-height + $tabs-height;
70 | }
71 | .has-header.has-subheader.has-tabs-top {
72 | top: $bar-height + $bar-subheader-height + $tabs-height;
73 | }
74 | }
75 |
76 | .modal-backdrop-bg {
77 | @include transition(opacity 300ms ease-in-out);
78 | background-color: $modal-backdrop-bg-active;
79 | opacity: 0;
80 | }
81 |
82 | .active .modal-backdrop-bg {
83 | opacity: 0.5;
84 | }
85 | }
86 |
87 | // disable clicks on all but the modal
88 | .modal-open {
89 | pointer-events: none;
90 |
91 | .modal,
92 | .modal-backdrop {
93 | pointer-events: auto;
94 | }
95 | // prevent clicks on modal when loading overlay is active though
96 | &.loading-active {
97 | .modal,
98 | .modal-backdrop {
99 | pointer-events: none;
100 | }
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_list.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Lists
4 | * --------------------------------------------------
5 | */
6 |
7 | .list {
8 | position: relative;
9 | padding-top: $item-border-width;
10 | padding-bottom: $item-border-width;
11 | padding-left: 0; // reset padding because ul and ol
12 | margin-bottom: 20px;
13 | }
14 | .list:last-child {
15 | margin-bottom: 0px;
16 | &.card{
17 | margin-bottom:40px;
18 | }
19 | }
20 |
21 |
22 | /**
23 | * List Header
24 | * --------------------------------------------------
25 | */
26 |
27 | .list-header {
28 | margin-top: $list-header-margin-top;
29 | padding: $list-header-padding;
30 | background-color: $list-header-bg;
31 | color: $list-header-color;
32 | font-weight: bold;
33 | }
34 |
35 | // when its a card make sure it doesn't duplicate top and bottom borders
36 | .card.list .list-item {
37 | padding-right: 1px;
38 | padding-left: 1px;
39 | }
40 |
41 |
42 | /**
43 | * Cards and Inset Lists
44 | * --------------------------------------------------
45 | * A card and list-inset are close to the same thing, except a card as a box shadow.
46 | */
47 |
48 | .card,
49 | .list-inset {
50 | overflow: hidden;
51 | margin: ($content-padding * 2) $content-padding;
52 | border-radius: $card-border-radius;
53 | background-color: $card-body-bg;
54 | }
55 |
56 | .card {
57 | padding-top: $item-border-width;
58 | padding-bottom: $item-border-width;
59 | box-shadow: $card-box-shadow;
60 |
61 | .item {
62 | border-left: 0;
63 | border-right: 0;
64 | }
65 | .item:first-child {
66 | border-top: 0;
67 | }
68 | .item:last-child {
69 | border-bottom: 0;
70 | }
71 | }
72 |
73 | .padding {
74 | .card, .list-inset {
75 | margin-left: 0;
76 | margin-right: 0;
77 | }
78 | }
79 |
80 | .card .item,
81 | .list-inset .item,
82 | .padding > .list .item
83 | {
84 | &:first-child {
85 | border-top-left-radius: $card-border-radius;
86 | border-top-right-radius: $card-border-radius;
87 |
88 | .item-content {
89 | border-top-left-radius: $card-border-radius;
90 | border-top-right-radius: $card-border-radius;
91 | }
92 | }
93 | &:last-child {
94 | border-bottom-right-radius: $card-border-radius;
95 | border-bottom-left-radius: $card-border-radius;
96 |
97 | .item-content {
98 | border-bottom-right-radius: $card-border-radius;
99 | border-bottom-left-radius: $card-border-radius;
100 | }
101 | }
102 | }
103 |
104 | .card .item:last-child,
105 | .list-inset .item:last-child {
106 | margin-bottom: $item-border-width * -1;
107 | }
108 |
109 | .card .item,
110 | .list-inset .item,
111 | .padding > .list .item,
112 | .padding-horizontal > .list .item {
113 | margin-right: 0;
114 | margin-left: 0;
115 |
116 | &.item-input input {
117 | padding-right: 44px;
118 | }
119 | }
120 | .padding-left > .list .item {
121 | margin-left: 0;
122 | }
123 | .padding-right > .list .item {
124 | margin-right: 0;
125 | }
126 |
--------------------------------------------------------------------------------
/hooks/after_prepare/010_add_platform_class.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | // Add Platform Class
4 | // v1.0
5 | // Automatically adds the platform class to the body tag
6 | // after the `prepare` command. By placing the platform CSS classes
7 | // directly in the HTML built for the platform, it speeds up
8 | // rendering the correct layout/style for the specific platform
9 | // instead of waiting for the JS to figure out the correct classes.
10 |
11 | var fs = require('fs');
12 | var path = require('path');
13 |
14 | var rootdir = process.argv[2];
15 |
16 | function addPlatformBodyTag(indexPath, platform) {
17 | // add the platform class to the body tag
18 | try {
19 | var platformClass = 'platform-' + platform;
20 | var cordovaClass = 'platform-cordova platform-webview';
21 |
22 | var html = fs.readFileSync(indexPath, 'utf8');
23 |
24 | var bodyTag = findBodyTag(html);
25 | if(!bodyTag) return; // no opening body tag, something's wrong
26 |
27 | if(bodyTag.indexOf(platformClass) > -1) return; // already added
28 |
29 | var newBodyTag = bodyTag;
30 |
31 | var classAttr = findClassAttr(bodyTag);
32 | if(classAttr) {
33 | // body tag has existing class attribute, add the classname
34 | var endingQuote = classAttr.substring(classAttr.length-1);
35 | var newClassAttr = classAttr.substring(0, classAttr.length-1);
36 | newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote;
37 | newBodyTag = bodyTag.replace(classAttr, newClassAttr);
38 |
39 | } else {
40 | // add class attribute to the body tag
41 | newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">');
42 | }
43 |
44 | html = html.replace(bodyTag, newBodyTag);
45 |
46 | fs.writeFileSync(indexPath, html, 'utf8');
47 |
48 | process.stdout.write('add to body class: ' + platformClass + '\n');
49 | } catch(e) {
50 | process.stdout.write(e);
51 | }
52 | }
53 |
54 | function findBodyTag(html) {
55 | // get the body tag
56 | try{
57 | return html.match(/])(.*?)>/gi)[0];
58 | }catch(e){}
59 | }
60 |
61 | function findClassAttr(bodyTag) {
62 | // get the body tag's class attribute
63 | try{
64 | return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0];
65 | }catch(e){}
66 | }
67 |
68 | if (rootdir) {
69 |
70 | // go through each of the platform directories that have been prepared
71 | var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []);
72 |
73 | for(var x=0; xgrunt >= 0.4.x. Make sure to upgrade your environment and read the
53 | [Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4).
54 |
55 | Dependencies for building from source and running tests:
56 |
57 | * [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli`
58 | * Then, install the development dependencies by running `$ npm install` from the project directory
59 |
60 | There are a number of targets in the gruntfile that are used to generating different builds:
61 |
62 | * `grunt`: Perform a normal build, runs jshint and karma tests
63 | * `grunt build`: Perform a normal build
64 | * `grunt dist`: Perform a clean build and generate documentation
65 | * `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes.
66 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_range.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Range
4 | * --------------------------------------------------
5 | */
6 |
7 | .range input{
8 | display: inline-block;
9 | overflow: hidden;
10 | margin-top: 5px;
11 | margin-bottom: 5px;
12 | padding-right: 2px;
13 | padding-left: 1px;
14 | width: auto;
15 | height: $range-slider-height + 15;
16 | outline: none;
17 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, $range-default-track-bg), color-stop(100%, $range-default-track-bg));
18 | background: linear-gradient(to right, $range-default-track-bg 0%, $range-default-track-bg 100%);
19 | background-position: center;
20 | background-size: 99% $range-track-height;
21 | background-repeat: no-repeat;
22 | -webkit-appearance: none;
23 |
24 | &::-moz-focus-outer {
25 | /* hide the focus outline in Firefox */
26 | border: 0;
27 | }
28 |
29 | &::-webkit-slider-thumb {
30 | position: relative;
31 | width: $range-slider-width;
32 | height: $range-slider-height;
33 | border-radius: $range-slider-border-radius;
34 | background-color: $toggle-handle-off-bg-color;
35 | box-shadow: $range-slider-box-shadow;
36 | cursor: pointer;
37 | -webkit-appearance: none;
38 | border: 0;
39 | }
40 |
41 | &::-webkit-slider-thumb:before{
42 | /* what creates the colorful line on the left side of the slider */
43 | position: absolute;
44 | top: ($range-slider-height / 2) - ($range-track-height / 2);
45 | left: -2001px;
46 | width: 2000px;
47 | height: $range-track-height;
48 | background: $dark;
49 | content: ' ';
50 | }
51 |
52 | &::-webkit-slider-thumb:after {
53 | /* create a larger (but hidden) hit area */
54 | position: absolute;
55 | top: -15px;
56 | left: -15px;
57 | padding: 30px;
58 | content: ' ';
59 | //background: red;
60 | //opacity: .5;
61 | }
62 | &::-ms-fill-lower{
63 | height: $range-track-height;
64 | background:$dark;
65 | }
66 | /*
67 | &::-ms-track{
68 | background: transparent;
69 | border-color: transparent;
70 | border-width: 11px 0 16px;
71 | color:transparent;
72 | margin-top:20px;
73 | }
74 | &::-ms-thumb {
75 | width: $range-slider-width;
76 | height: $range-slider-height;
77 | border-radius: $range-slider-border-radius;
78 | background-color: $toggle-handle-off-bg-color;
79 | border-color:$toggle-handle-off-bg-color;
80 | box-shadow: $range-slider-box-shadow;
81 | margin-left:1px;
82 | margin-right:1px;
83 | outline:none;
84 | }
85 | &::-ms-fill-upper {
86 | height: $range-track-height;
87 | background:$range-default-track-bg;
88 | }
89 | */
90 | }
91 |
92 | .range {
93 | @include display-flex();
94 | @include align-items(center);
95 | padding: 2px 11px;
96 |
97 | &.range-light {
98 | input { @include range-style($range-light-track-bg); }
99 | }
100 | &.range-stable {
101 | input { @include range-style($range-stable-track-bg); }
102 | }
103 | &.range-positive {
104 | input { @include range-style($range-positive-track-bg); }
105 | }
106 | &.range-calm {
107 | input { @include range-style($range-calm-track-bg); }
108 | }
109 | &.range-balanced {
110 | input { @include range-style($range-balanced-track-bg); }
111 | }
112 | &.range-assertive {
113 | input { @include range-style($range-assertive-track-bg); }
114 | }
115 | &.range-energized {
116 | input { @include range-style($range-energized-track-bg); }
117 | }
118 | &.range-royal {
119 | input { @include range-style($range-royal-track-bg); }
120 | }
121 | &.range-dark {
122 | input { @include range-style($range-dark-track-bg); }
123 | }
124 | }
125 |
126 | .range .icon {
127 | @include flex(0);
128 | display: block;
129 | min-width: $range-icon-size;
130 | text-align: center;
131 | font-size: $range-icon-size;
132 | }
133 |
134 | .range input {
135 | @include flex(1);
136 | display: block;
137 | margin-right: 10px;
138 | margin-left: 10px;
139 | }
140 |
141 | .range-label {
142 | @include flex(0, 0, auto);
143 | display: block;
144 | white-space: nowrap;
145 | }
146 |
147 | .range-label:first-child {
148 | padding-left: 5px;
149 | }
150 | .range input + .range-label {
151 | padding-right: 5px;
152 | padding-left: 0;
153 | }
154 |
155 | // WP range height must be auto
156 | .platform-windowsphone{
157 | .range input{
158 | height:auto;
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/www/templates/tab-dash.html:
--------------------------------------------------------------------------------
1 | 11 | It could be outside of operating hours, or it could be 12 | broken. 13 | If this persists, you could try 14 | bugging Jake here. 15 |
16 |21 | {{error.message}} 22 |23 |
24 | Trying again shortly. 25 | 26 | Sometimes the MARTA realtime API does a 27 | broken. 28 | 29 | 30 | If this persists and you're doing a sad, you could try 31 | bugging Jake here. 32 | 33 |
34 |Problems connecting. Trying again shortly.
40 |