├── IonicProjectStarter ├── .gitignore ├── IonicProjectStarter.xdk ├── LICENSE.md ├── README.md ├── icon.png ├── intelxdk.config.additions.xml ├── screenshot.png └── www │ ├── css │ ├── app.css │ ├── index │ │ ├── .ignore │ │ │ ├── defaults.less │ │ │ ├── index_main.less │ │ │ ├── ionic-group.less │ │ │ ├── ionic-header-footer-css.less │ │ │ ├── ionic_full_width.less │ │ │ ├── styles │ │ │ │ ├── d-margins -- margins.less │ │ │ │ ├── grid-pad -- padding.less │ │ │ │ ├── row-height-1 -- row_height.less │ │ │ │ └── row-height-2 -- row_height.less │ │ │ ├── uib_row_1.less │ │ │ └── uib_row_2.less │ │ ├── defaults.less │ │ ├── index_main.less │ │ ├── ionic-group.less │ │ ├── ionic-header-footer-css.less │ │ ├── ionic_full_width.less │ │ ├── styles │ │ │ ├── d-margins -- margins.less │ │ │ ├── grid-pad -- padding.less │ │ │ ├── row-height-1 -- row_height.less │ │ │ └── row-height-2 -- row_height.less │ │ ├── uib_row_1.less │ │ └── uib_row_2.less │ ├── index_main.less.css │ ├── views │ │ ├── .ignore │ │ │ ├── defaults.less │ │ │ └── views_main.less │ │ ├── defaults.less │ │ └── views_main.less │ └── views_main.less.css │ ├── images │ ├── Arrow.png │ ├── Checkmark.png │ ├── Exclaim.png │ ├── Strabburg.jpg │ └── X.png │ ├── index.html │ ├── ionic │ ├── css │ │ ├── ionic.css │ │ └── ionic.min.css │ ├── fonts │ │ ├── ionicons.eot │ │ ├── ionicons.svg │ │ ├── ionicons.ttf │ │ └── ionicons.woff │ ├── js │ │ ├── angular-ui │ │ │ ├── angular-ui-router.js │ │ │ └── angular-ui-router.min.js │ │ ├── angular │ │ │ ├── angular-animate.js │ │ │ ├── angular-animate.min.js │ │ │ ├── angular-resource.js │ │ │ ├── angular-resource.min.js │ │ │ ├── angular-sanitize.js │ │ │ ├── angular-sanitize.min.js │ │ │ ├── angular.js │ │ │ └── angular.min.js │ │ ├── ionic-angular.js │ │ ├── ionic-angular.min.js │ │ ├── ionic.bundle.js │ │ ├── ionic.bundle.min.js │ │ ├── ionic.js │ │ └── ionic.min.js │ └── version.json │ ├── js │ ├── app.js │ ├── controllers.js │ ├── index_init_services.js │ ├── init-app.js │ ├── services.js │ └── views_init_services.js │ ├── lib │ ├── jquery.min.js │ ├── ng-cordova-mocks.min.js │ └── ng-cordova.min.js │ ├── marginal │ └── marginal-position.js │ ├── views.html │ └── xdk │ ├── init-dev.js │ └── project-info.json ├── LICENSE └── README.md /IonicProjectStarter/.gitignore: -------------------------------------------------------------------------------- 1 | # ignore "excess" files and directories 2 | # in essence, ignore everything but *.xdk file and www and docs directories 3 | /* 4 | !/www 5 | !/docs 6 | !/config.xml 7 | !/README.md 8 | !/LICENSE.md 9 | !/intelxdk.config.additions.xml 10 | !/*.xdk 11 | !/.gitignore 12 | !/*.png -------------------------------------------------------------------------------- /IonicProjectStarter/IonicProjectStarter.xdk: -------------------------------------------------------------------------------- 1 | { 2 | "project": { 3 | "projectSettingsVersion": "3.0.0", 4 | "creationData": { 5 | "type": "App Designer", 6 | "projectTypeName": "com.intel.xdk.projecttype.jsapp", 7 | "src": "appDesigner", 8 | "projectGuid": "093974b2-eba3-4a42-94c0-d840844ca468", 9 | "lastModifiedDate": 1478875900233, 10 | "creationDate": 1441118193189 11 | }, 12 | "XDK-app-designer": "true", 13 | "sourceDirectory": "www", 14 | "startFile": "index.html", 15 | "projectFiles": { 16 | "xdk-publish-meta-data.json": { 17 | "settings": { 18 | "project": { 19 | "XDK-not-deployed": "True" 20 | } 21 | } 22 | } 23 | }, 24 | "projectDirectories": {}, 25 | "libraries": [], 26 | "serviceMethods": [], 27 | "cordovaPluginsDirectory": "plugins", 28 | "cordovaPlugins": [ 29 | { 30 | "id": "cordova-plugin-device", 31 | "version": "1.1.1", 32 | "selectedState": "Included", 33 | "data": {}, 34 | "paramvals": {}, 35 | "dependsOn": [], 36 | "dependedBy": [], 37 | "originType": "cordova.io", 38 | "origin": "org.apache.cordova.device", 39 | "permissions": {}, 40 | "name": "Device", 41 | "topLevel": true, 42 | "checksum": "927290ca", 43 | "gitref": "", 44 | "description": "Cordova Device Plugin" 45 | }, 46 | { 47 | "id": "cordova-plugin-splashscreen", 48 | "version": "2.1.0", 49 | "selectedState": "Included", 50 | "data": {}, 51 | "paramvals": {}, 52 | "dependsOn": [], 53 | "dependedBy": [], 54 | "originType": "cordova.io", 55 | "origin": "cordova-plugin-splashscreen", 56 | "permissions": {}, 57 | "name": "Splashscreen", 58 | "topLevel": true, 59 | "checksum": "170efb68", 60 | "gitref": "", 61 | "description": "Cordova Splashscreen Plugin" 62 | } 63 | ], 64 | "buildConfigurations": { 65 | "Android": { 66 | "platform_": "android", 67 | "runtime_": "Cordova 3.x", 68 | "name_": "Android", 69 | "preferences_": { 70 | "android-minSdkVersion": "10", 71 | "android-targetSdkVersion": "19", 72 | "android-installLocation": "auto" 73 | }, 74 | "isActive_": true, 75 | "certificateId_": "hE55lNePnU-SvetIkMp1xg2", 76 | "appName_": "IonicProjectStarter", 77 | "appID_": "xdk.intel.blank.ad.template", 78 | "appAccess_": { 79 | "mode": "legacy", 80 | "network": [ 81 | "*" 82 | ], 83 | "intents": [], 84 | "navigation": [] 85 | }, 86 | "icons_": [], 87 | "splashes_": [], 88 | "addlPermissions_": "", 89 | "excludedLibraries_": "", 90 | "iosProvs_": [], 91 | "cordovaCLIVersion_": "5.1.1", 92 | "appVersion_": "0.0.1", 93 | "appAuthor_": "Intel XDK", 94 | "appDescription_": "Template to develop a Cordova mobile web app using the App Designer UI editor.", 95 | "appVersionCode_": "1" 96 | }, 97 | "iOS": { 98 | "platform_": "ios", 99 | "runtime_": "Cordova 3.x", 100 | "name_": "iOS", 101 | "preferences_": { 102 | "ios-configuration": "adhoc", 103 | "deployment-target": "6" 104 | }, 105 | "isActive_": true, 106 | "certificateId_": "", 107 | "appName_": "IonicProjectStarter", 108 | "appID_": "xdk.intel.blank.ad.template", 109 | "appAccess_": { 110 | "mode": "whitelist", 111 | "network": [ 112 | "*" 113 | ], 114 | "intents": [], 115 | "navigation": [], 116 | "properties": {} 117 | }, 118 | "icons_": [], 119 | "splashes_": [], 120 | "addlPermissions_": "", 121 | "excludedLibraries_": "", 122 | "iosProvs_": [], 123 | "cordovaCLIVersion_": "5.1.1", 124 | "crosswalkVersion_": "11", 125 | "appVersion_": "0.0.1", 126 | "appAuthor_": "Intel XDK", 127 | "appDescription_": "Template to develop a Cordova mobile web app using the App Designer UI editor." 128 | }, 129 | "Windows8": { 130 | "platform_": "windows8", 131 | "runtime_": "Cordova 3.x", 132 | "name_": "Windows8", 133 | "preferences_": { 134 | "windows-publisher-display-name": "", 135 | "windows-publisher-id": "" 136 | }, 137 | "isActive_": true, 138 | "certificateId_": "", 139 | "appName_": "IonicProjectStarter", 140 | "appID_": "xdk.intel.blank.ad.template", 141 | "appAccess_": { 142 | "mode": "whitelist", 143 | "network": [ 144 | "*" 145 | ], 146 | "intents": [], 147 | "navigation": [], 148 | "properties": {} 149 | }, 150 | "icons_": [], 151 | "splashes_": [], 152 | "addlPermissions_": "", 153 | "excludedLibraries_": "", 154 | "iosProvs_": [], 155 | "cordovaCLIVersion_": "5.1.1", 156 | "crosswalkVersion_": "11", 157 | "appVersion_": "0.0.0.1", 158 | "appAuthor_": "Intel XDK", 159 | "appDescription_": "Template to develop a Cordova mobile web app using the App Designer UI editor." 160 | }, 161 | "WebApp": { 162 | "platform_": "webapp", 163 | "runtime_": "W3C", 164 | "name_": "WebApp", 165 | "preferences_": {}, 166 | "isActive_": false, 167 | "certificateId_": "", 168 | "appName_": "IonicProjectStarter", 169 | "appID_": "not.yet.specified", 170 | "appAccess_": { 171 | "mode": "legacy", 172 | "network": [ 173 | "*" 174 | ], 175 | "intents": [], 176 | "navigation": [] 177 | }, 178 | "icons_": [], 179 | "splashes_": [], 180 | "addlPermissions_": "", 181 | "excludedLibraries_": "", 182 | "appAuthor_": "Intel XDK", 183 | "appVersion_": "0.0.1" 184 | }, 185 | "Chrome": { 186 | "platform_": "chromeos", 187 | "runtime_": "W3C on Chrome OS", 188 | "name_": "Chrome", 189 | "preferences_": {}, 190 | "isActive_": false, 191 | "certificateId_": "", 192 | "appName_": "IonicProjectStarter", 193 | "appID_": "not.yet.specified", 194 | "appAccess_": { 195 | "mode": "legacy", 196 | "network": [ 197 | "*" 198 | ], 199 | "intents": [], 200 | "navigation": [] 201 | }, 202 | "icons_": [], 203 | "splashes_": [], 204 | "addlPermissions_": "", 205 | "excludedLibraries_": "", 206 | "appAuthor_": "Intel XDK", 207 | "appVersion_": "0.0.1" 208 | }, 209 | "Firefox": { 210 | "platform_": "firefoxos", 211 | "runtime_": "W3C on Firefox OS", 212 | "name_": "Firefox", 213 | "preferences_": {}, 214 | "isActive_": false, 215 | "certificateId_": "", 216 | "appName_": "IonicProjectStarter", 217 | "appID_": "not.yet.specified", 218 | "appAccess_": { 219 | "mode": "legacy", 220 | "network": [ 221 | "*" 222 | ], 223 | "intents": [], 224 | "navigation": [] 225 | }, 226 | "icons_": [], 227 | "splashes_": [], 228 | "addlPermissions_": "", 229 | "excludedLibraries_": "", 230 | "appAuthor_": "Intel XDK", 231 | "appVersion_": "0.0.1" 232 | }, 233 | "Facebook": { 234 | "platform_": "facebook", 235 | "runtime_": "W3C on Facebook", 236 | "name_": "Facebook", 237 | "preferences_": {}, 238 | "isActive_": false, 239 | "certificateId_": "", 240 | "appName_": "IonicProjectStarter", 241 | "appID_": "not.yet.specified", 242 | "appAccess_": { 243 | "mode": "legacy", 244 | "network": [ 245 | "*" 246 | ], 247 | "intents": [], 248 | "navigation": [] 249 | }, 250 | "icons_": [], 251 | "splashes_": [], 252 | "addlPermissions_": "", 253 | "excludedLibraries_": "", 254 | "appAuthor_": "Intel XDK", 255 | "appVersion_": "0.0.1" 256 | }, 257 | "WP81": { 258 | "platform_": "wp81", 259 | "runtime_": "Cordova 3.x", 260 | "name_": "WP81", 261 | "preferences_": {}, 262 | "isActive_": true, 263 | "certificateId_": "", 264 | "appName_": "IonicProjectStarter", 265 | "appID_": "not.yet.specified", 266 | "appAccess_": { 267 | "mode": "legacy", 268 | "network": [], 269 | "intents": [], 270 | "navigation": [] 271 | }, 272 | "icons_": [], 273 | "splashes_": [], 274 | "addlPermissions_": "", 275 | "excludedLibraries_": "", 276 | "appVersion_": "0.0.0.1", 277 | "cordovaCLIVersion_": "5.1.1" 278 | } 279 | }, 280 | "gameAssetDirectory": "asset", 281 | "gameMetadata": {}, 282 | "projectTags": [], 283 | "testDirectory": "test" 284 | } 285 | } -------------------------------------------------------------------------------- /IonicProjectStarter/LICENSE.md: -------------------------------------------------------------------------------- 1 | Intel® XDK Samples License Terms and Conditions 2 | =============================================== 3 | 4 | Copyright © 2012-2015, Intel Corporation. All rights reserved. 5 | 6 | This is a “BSD-3” license. 7 | 8 | Redistribution and use in source and binary forms, with or without modification, 9 | are permitted provided that the following conditions are met: 10 | 11 | - Redistributions of source code must retain the above copyright notice, this 12 | list of conditions and the following disclaimer. 13 | 14 | - Redistributions in binary form must reproduce the above copyright notice, 15 | this list of conditions and the following disclaimer in the documentation 16 | and/or other materials provided with the distribution. 17 | 18 | - Neither the name of Intel Corporation nor the names of its contributors may 19 | be used to endorse or promote products derived from this software without 20 | specific prior written permission. 21 | 22 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 23 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 24 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 26 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 29 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | -------------------------------------------------------------------------------- /IonicProjectStarter/README.md: -------------------------------------------------------------------------------- 1 | Blank HTML App Designer Template for Building Mobile Cordova Web Apps 2 | ===================================================================== 3 | 4 | Copyright © 2012-2015, Intel Corporation. All rights reserved. 5 | 6 | See [LICENSE.md]() for license terms and conditions. 7 | 8 | Use this template as a starting point for an Intel XDK App Designer project that 9 | will be distributed as a *mobile Cordova web app*. The file named `init-dev.js` 10 | included as part of this project contains init code that generates an 11 | `app.Ready` event; which is used as a way to normalize how App Designer starts 12 | its own code. This technique allows App Designer to use a standard init sequence 13 | regardless of the specific package type (a *packaged web app* or a *Cordova web 14 | app*). 15 | 16 | The `icon.png` and `screenshot.png` files are not required by your project. They 17 | are included for use by the Intel XDK template/demo panel and have no use within 18 | a real app. You can safely delete them from your project directory. 19 | 20 | You can build a *Cordova web app* from this template that can be submitted to a 21 | store using the "Cordova Hybrid Mobile App Platforms" build tiles (for 22 | Crosswalk, Android, iOS and Windows). The `intelxdk.config.additions.xml` file 23 | can be used to include options that control your *Cordova web app* builds. For 24 | example, you can enable remote debug of an Android or Crosswalk Cordova app with 25 | Chrome DevTools by adding the appropriate preferences to this file. 26 | 27 | The Intel XDK does not include a mechanism to convert your "Standard HTML5 + 28 | Cordova Project" into a "Standard HTML5 Project." The simplest way to convert a 29 | Cordova project into a Standard project is to create a new "Standard" project 30 | from the appropriate template and copy your files from this project into that 31 | new project. 32 | 33 | The `cordova.js` script is needed to provide your app with access to Cordova 34 | APIs. To add Cordova APIs to your application you must add the corresponding 35 | Cordova plugins. See the *Plugins* section on the **Projects** tab. 36 | 37 | **IMPORTANT:** the `intelxdk.js` and `xhr.js` script files are not automatically 38 | included in this template, as they have been in past versions. Those files are 39 | only needed for apps built using the legacy AppMobi build containers on the 40 | **Build** tab, which have been deprecated. We encourage you to use the Cordova 41 | containers for all new applications. These script files can be added by hand, if 42 | you require them, as follows: 43 | 44 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 | 46 | 47 | 48 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | 50 | The `xhr.js` file's purpose was to provide external domain access to your mobile 51 | web app. In a Cordova web app this is controlled via the *Domain Access 52 | Whitelist* in the *Build Settings* section of the **Projects** tab. For details 53 | regarding how to specify your domain whitelist see this Cordova doc page: 54 | 55 | -------------------------------------------------------------------------------- /IonicProjectStarter/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/icon.png -------------------------------------------------------------------------------- /IonicProjectStarter/intelxdk.config.additions.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /IonicProjectStarter/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/screenshot.png -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/app.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Please see the included README.md file for license terms and conditions. 3 | */ 4 | 5 | 6 | /* This file is completely optional and not required. */ 7 | /* Note the reference that includes it in the index.html file. */ 8 | 9 | 10 | /* Disable certain interactions on touch devices */ 11 | /* SOURCE: https://github.com/ftlabs/fastclick/blob/master/examples/input.html */ 12 | /* LICENSE: https://github.com/ftlabs/fastclick/blob/master/LICENSE */ 13 | body { 14 | -webkit-touch-callout: none ; 15 | -webkit-text-size-adjust: none ; -ms-text-size-adjust: none ; 16 | -webkit-user-select: none ; -moz-user-select: none ; -ms-user-select: none ; user-select: none ; 17 | -webkit-highlight: none ; 18 | -webkit-tap-highlight-color: rgba(0,0,0,0) ; 19 | -webkit-tap-highlight-color: transparent ; /* For some Androids */ 20 | } 21 | 22 | /* Recommended for Windows 8 Phone */ 23 | /* SOURCE: http://www.excellentwebworld.com/common-problems-solution-for-windows-phone-8-phonegap */ 24 | html { 25 | -ms-touch-action: pan-x ; 26 | } 27 | 28 | /* Recommended for Windows 8 Phone */ 29 | /* SOURCE: http://www.excellentwebworld.com/common-problems-solution-for-windows-phone-8-phonegap */ 30 | body { 31 | -ms-touch-action: pan-y ; 32 | -ms-content-zooming: none ; 33 | } 34 | 35 | /* allow copy-paste */ 36 | input, textarea { 37 | -webkit-user-select: text ; -moz-user-select: text ; -ms-user-select: text ; user-select: text ; 38 | } 39 | 40 | body { 41 | /* margin: 0.5rem ; */ 42 | background: white ; 43 | color: black ; 44 | } 45 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/defaults.less: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Warning: This CSS file has been auto-generated from a .less file. If you edit it your edits will be lost the next time LessCSS is run. 4 | 5 | It would be best to make a separate CSS file and place any overriding CSS in there. If you must access the original CSS, do so by editing the .less files. 6 | 7 | */ 8 | 9 | /* global settings */ 10 | *, *:after, *:before { 11 | -webkit-box-sizing: border-box; 12 | -moz-box-sizing: border-box; 13 | box-sizing: border-box; 14 | } 15 | 16 | body { 17 | margin: 0px; 18 | } 19 | 20 | /* grid */ 21 | .grid { width:100%; } 22 | .upage-content > .grid { max-width:@max_width; margin-left:auto; margin-right:auto; } 23 | 24 | /* gutter around whole design */ 25 | /* 26 | .upage-content > .grid-pad { 27 | padding: @gutter @gutter 0px @gutter; 28 | } 29 | */ 30 | 31 | /* column */ 32 | .urow:not(.cright) > .col { float:left; } 33 | .urow.cright > .col { float:right; } 34 | 35 | .col { position:relative; min-height:1px; } 36 | .content-area { position:relative; } 37 | 38 | /* row */ 39 | .urow { clear:both; position:relative; } 40 | form.urow { margin-bottom: 0px; } 41 | 42 | .widget { position:relative; } 43 | 44 | /* for widgets and the like 45 |
46 |
my width is set
47 |
my width is 100%, minus the set width of the narrow-control
48 |
49 | 50 | .w85 { width:85px; } 51 | */ 52 | .vertical-col > *, 53 | .vertical-col > .table-thing, .vertical-col > .afScrollPanel > .table-thing, 54 | .wrapping-col > .no_wrap.table-thing, .wrapping-col > .afScrollPanel > .no_wrap.table-thing { 55 | width:100%; 56 | } 57 | 58 | #afui .vertical-col > .afScrollPanel > .widget, 59 | #afui .vertical-col > .widget, 60 | .vertical-col > .widget { 61 | width: calc(100% ~'-' 10px); 62 | margin-left: 5px; 63 | } 64 | 65 | .col > .vertical-col > .widget { 66 | width: 100%; 67 | margin-left: 0; 68 | } 69 | 70 | .table-thing{ display:table; } 71 | .wide-control{ display:table-cell; width:100% } 72 | .narrow-control{ display:table-cell; } 73 | 74 | /* wrapping column */ 75 | .wrapping-col.right > *, .wrapping-col.right > .afScrollPanel > * { float: right; } /* margin: 0 5px; move margin to another class */ 76 | .wrapping-col.left > *, .wrapping-col.left > .afScrollPanel > * { float: left; } 77 | 78 | /* center and right alignment */ 79 | .vertical-col.center { text-align:center; } 80 | .vertical-col.right { text-align:right; } 81 | 82 | .vertical-col.right > *, 83 | .col > .vertical-col.right > .widget, 84 | .vertical-col.right > .afScrollPanel > * { 85 | margin-left:auto; 86 | } 87 | .vertical-col.center > *, 88 | .col > .vertical-col.center > .widget, 89 | .vertical-col.center > .afScrollPanel > * { 90 | margin-left:auto; 91 | margin-right:auto; 92 | } 93 | .wrapping-col:not(.horiz-area) > .no_wrap, 94 | .wrapping-col:not(.horiz-area) > .afScrollPanel > .no_wrap { 95 | float: none; 96 | clear :both; 97 | /* margin: 8px 0px; */ 98 | } 99 | 100 | .center-h-v-col > .widget { 101 | position: absolute !important; 102 | left: 50%; 103 | top: 50%; 104 | transform: translate(-50%, -50%); 105 | -webkit-transform:translate(-50%, -50%); 106 | margin-top: 0 !important; 107 | } 108 | 109 | /* shim */ 110 | .uib_shim{ clear:both; float:none !important; width:100%; position:relative; height:0px; line-height: 0px; font-size:0px; display:block; } 111 | 112 | /* content-box fix for box-sizing */ 113 | .content-box, .content-box:before, .content-box:after { 114 | -webkit-box-sizing: content-box; 115 | -moz-box-sizing: content-box; 116 | box-sizing: content-box; 117 | } 118 | 119 | /* page */ 120 | .hidden:not(.afPopup) { 121 | display: none; 122 | } 123 | 124 | .upage-content, .upage-outer {position:relative; } 125 | html, body { height: 100%; } 126 | body:not(#afui) { 127 | .upage, .upage-content { height: 100%; } 128 | .upage-outer { height: auto; } 129 | } 130 | 131 | /* position relative works fine. but fixed can be elected as well */ 132 | /* .upage-content, .upage-outer { position: fixed; height:100%; } */ 133 | 134 | .upage { overflow-x: hidden; } 135 | .upage-content { z-index:1; } 136 | #afui .upage { padding: 0; } 137 | 138 | /* sidebars and crossbars */ 139 | 140 | .uib_sidebar { 141 | position: fixed; 142 | height: 100%; 143 | top: 0px; 144 | } 145 | 146 | .uib_crossbar { 147 | position: fixed; 148 | width: 100%; 149 | left: 0px; 150 | } 151 | 152 | .leftbar, .rightbar { z-index:2; } 153 | .reveal.leftbar { left:0px; z-index:0; } 154 | .reveal.rightbar { right:0px; z-index:0;} 155 | .leftbar.oh, 156 | .rightbar.oh { z-index:3; } 157 | .reveal { z-index:0; visibility: hidden; } 158 | .topbar { z-index:3; } 159 | .topbar.reveal { top:0px; z-index:0; } 160 | .botbar { z-index:3; position:fixed; } 161 | .botbar.oh, 162 | .topbar.oh { z-index:4; } 163 | 164 | .sidebar-content { 165 | height: 100%; 166 | overflow-y: auto; 167 | position: relative; 168 | margin: 0; 169 | } 170 | 171 | .sidebar-thumb{ position:relative; margin:0; /* background-image:url('images/gripper.png'); */} 172 | 173 | //service method support 174 | .template { display:none !important; } 175 | 176 | //Absolute positioning 177 | .uib-absolute { position: absolute !important } 178 | 179 | //framework 7 content block inner block 180 | .content-block-inner { box-sizing: content-box; } 181 | 182 | //framework 7 multi-button header 183 | .navbar-inner .widget-container { display: inline-flex; } 184 | 185 | //framework 7 searchbar width override 186 | .searchbar { width: 100% !important; margin: 0 !important; } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/index_main.less: -------------------------------------------------------------------------------- 1 | 2 | @max_width: none; 3 | @gutter: 20px; 4 | 5 | @wp_1: 0px; 6 | @wp_2: 0px; 7 | @wp_3: 0px; 8 | 9 | @import "defaults.less"; 10 | @import "ionic-header-footer-css.less"; 11 | @import "ionic_full_width.less"; 12 | @import "styles/d-margins -- margins.less"; 13 | @import "uib_row_1.less"; 14 | @import "styles/grid-pad -- padding.less"; 15 | @import "styles/row-height-1 -- row_height.less"; 16 | @import "ionic-group.less"; 17 | @import "uib_row_2.less"; 18 | @import "styles/row-height-2 -- row_height.less"; 19 | @import "uib_row_1.less"; 20 | @import "uib_row_1.less"; 21 | @import "uib_row_2.less"; 22 | @import "uib_row_1.less"; 23 | @import "uib_row_2.less"; -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/ionic-group.less: -------------------------------------------------------------------------------- 1 | .list .d-margins, 2 | .button-bar .d-margins, 3 | .tabs .d-margins 4 | { 5 | margin: 0; 6 | } 7 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/ionic-header-footer-css.less: -------------------------------------------------------------------------------- 1 | .bar > .buttons .d-margins { margin: auto } 2 | .bar { z-index: 1; } 3 | .upage-outer.fixed-header-footer { position: static; } 4 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/ionic_full_width.less: -------------------------------------------------------------------------------- 1 | .vertical-col > ion-list.widget, 2 | .vertical-col > .widget.item-radio, 3 | .vertical-col > .widget.item-toggle, 4 | .vertical-col > .widget.list, 5 | .vertical-col > .widget.item-select, 6 | .vertical-col > .widget.item-checkbox, 7 | .vertical-col > .widget.button 8 | { 9 | margin-left: 0; 10 | display: inline-block; 11 | width: 100%; 12 | } 13 | .vertical-col > .widget.item.range, 14 | .vertical-col > .widget.button-bar, 15 | .vertical-col > .widget.tabs 16 | { 17 | margin-left: 0; 18 | width: 100%; 19 | } 20 | .vertical-col > .widget.item-input 21 | { 22 | margin-left: 0; 23 | display: inline-flex; 24 | width: 100%; 25 | } 26 | .vertical-col > .widget.item-input.item-floating-label, 27 | .vertical-col > .widget.item-input.item-stacked-label 28 | { 29 | margin-left: 0; 30 | display: inline-block; 31 | width: 100%; 32 | } 33 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/styles/d-margins -- margins.less: -------------------------------------------------------------------------------- 1 | @media all { 2 | .wrapping-col > .d-margins, 3 | .wrapping-col > .afScrollPanel > .d-margins { margin-left:6px; 4 | margin-right:6px; 5 | } 6 | 7 | .wrapping-col > .d-margins, 8 | .wrapping-col > .afScrollPanel > .d-margins { margin-left:6px; 9 | margin-right:6px; 10 | } 11 | 12 | .d-margins { margin-top:5px; 13 | margin-bottom:6px; 14 | } 15 | 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/styles/grid-pad -- padding.less: -------------------------------------------------------------------------------- 1 | @media all { 2 | .grid-pad { padding-top:10px; 3 | padding-bottom:10px; 4 | padding-left:20px; 5 | padding-right:20px; 6 | } 7 | 8 | } 9 | 10 | 11 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/styles/row-height-1 -- row_height.less: -------------------------------------------------------------------------------- 1 | @media all and (min-width : @wp_1){ .row-height-1 > .col > .content-area { min-height:100px; 2 | } 3 | 4 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/styles/row-height-2 -- row_height.less: -------------------------------------------------------------------------------- 1 | @media all and (min-width : @wp_1){ .row-height-2 > .col > .content-area { min-height:100px; 2 | } 3 | 4 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/uib_row_1.less: -------------------------------------------------------------------------------- 1 | @gutter_uib_row_1: 20px; 2 | 3 | .uib_row_1:not(.cright) > .col { padding-right:@gutter_uib_row_1; } 4 | 5 | .uib_row_1.cright > .col { padding-left:@gutter_uib_row_1; } 6 | 7 | @media all { 8 | .col-0_12-12 { width: auto; float: none !important; } 9 | .urow:not(.cright) > .col-0_12-12 { padding-right:0px !important; } 10 | .urow.cright > .col-0_12-12 { padding-left:0px !important; } 11 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/.ignore/uib_row_2.less: -------------------------------------------------------------------------------- 1 | @gutter_uib_row_2: 20px; 2 | 3 | .uib_row_2:not(.cright) > .col { padding-right:@gutter_uib_row_2; } 4 | 5 | .uib_row_2.cright > .col { padding-left:@gutter_uib_row_2; } 6 | 7 | @media all { 8 | .col-0_12-12 { width: auto; float: none !important; } 9 | .urow:not(.cright) > .col-0_12-12 { padding-right:0px !important; } 10 | .urow.cright > .col-0_12-12 { padding-left:0px !important; } 11 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/defaults.less: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Warning: This CSS file has been auto-generated from a .less file. If you edit it your edits will be lost the next time LessCSS is run. 4 | 5 | It would be best to make a separate CSS file and place any overriding CSS in there. If you must access the original CSS, do so by editing the .less files. 6 | 7 | */ 8 | 9 | /* global settings */ 10 | *, *:after, *:before { 11 | -webkit-box-sizing: border-box; 12 | -moz-box-sizing: border-box; 13 | box-sizing: border-box; 14 | } 15 | 16 | body { 17 | margin: 0px; 18 | } 19 | 20 | /* grid */ 21 | .grid { width:100%; } 22 | .upage-content > .grid { max-width:@max_width; margin-left:auto; margin-right:auto; } 23 | 24 | /* gutter around whole design */ 25 | /* 26 | .upage-content > .grid-pad { 27 | padding: @gutter @gutter 0px @gutter; 28 | } 29 | */ 30 | 31 | /* column */ 32 | .urow:not(.cright) > .col { float:left; } 33 | .urow.cright > .col { float:right; } 34 | 35 | .col { position:relative; min-height:1px; } 36 | .content-area { position:relative; } 37 | 38 | /* row */ 39 | .urow { clear:both; position:relative; } 40 | form.urow { margin-bottom: 0px; } 41 | 42 | .widget { position:relative; } 43 | 44 | /* for widgets and the like 45 |
46 |
my width is set
47 |
my width is 100%, minus the set width of the narrow-control
48 |
49 | 50 | .w85 { width:85px; } 51 | */ 52 | .vertical-col > *, 53 | .vertical-col > .table-thing, .vertical-col > .afScrollPanel > .table-thing, 54 | .wrapping-col > .no_wrap.table-thing, .wrapping-col > .afScrollPanel > .no_wrap.table-thing { 55 | width:100%; 56 | } 57 | 58 | #afui .vertical-col > .afScrollPanel > .widget, 59 | #afui .vertical-col > .widget, 60 | .vertical-col > .widget { 61 | width: calc(100% ~'-' 10px); 62 | margin-left: 5px; 63 | } 64 | 65 | .col > .vertical-col > .widget { 66 | width: 100%; 67 | margin-left: 0; 68 | } 69 | 70 | .table-thing{ display:table; } 71 | .wide-control{ display:table-cell; width:100% } 72 | .narrow-control{ display:table-cell; } 73 | 74 | /* wrapping column */ 75 | .wrapping-col.right > *, .wrapping-col.right > .afScrollPanel > * { float: right; } /* margin: 0 5px; move margin to another class */ 76 | .wrapping-col.left > *, .wrapping-col.left > .afScrollPanel > * { float: left; } 77 | 78 | /* center and right alignment */ 79 | .vertical-col.center { text-align:center; } 80 | .vertical-col.right { text-align:right; } 81 | 82 | .vertical-col.right > *, 83 | .col > .vertical-col.right > .widget, 84 | .vertical-col.right > .afScrollPanel > * { 85 | margin-left:auto; 86 | } 87 | .vertical-col.center > *, 88 | .col > .vertical-col.center > .widget, 89 | .vertical-col.center > .afScrollPanel > * { 90 | margin-left:auto; 91 | margin-right:auto; 92 | } 93 | .wrapping-col:not(.horiz-area) > .no_wrap, 94 | .wrapping-col:not(.horiz-area) > .afScrollPanel > .no_wrap { 95 | float: none; 96 | clear :both; 97 | /* margin: 8px 0px; */ 98 | } 99 | 100 | .center-h-v-col > .widget { 101 | position: absolute !important; 102 | left: 50%; 103 | top: 50%; 104 | transform: translate(-50%, -50%); 105 | -webkit-transform:translate(-50%, -50%); 106 | margin-top: 0 !important; 107 | } 108 | 109 | /* shim */ 110 | .uib_shim{ clear:both; float:none !important; width:100%; position:relative; height:0px; line-height: 0px; font-size:0px; display:block; } 111 | 112 | /* content-box fix for box-sizing */ 113 | .content-box, .content-box:before, .content-box:after { 114 | -webkit-box-sizing: content-box; 115 | -moz-box-sizing: content-box; 116 | box-sizing: content-box; 117 | } 118 | 119 | /* page */ 120 | .hidden:not(.afPopup) { 121 | display: none; 122 | } 123 | 124 | .upage-content, .upage-outer {position:relative; } 125 | html, body { height: 100%; } 126 | body:not(#afui) { 127 | .upage, .upage-content { height: 100%; } 128 | .upage-outer { height: auto; } 129 | } 130 | 131 | /* position relative works fine. but fixed can be elected as well */ 132 | /* .upage-content, .upage-outer { position: fixed; height:100%; } */ 133 | 134 | .upage { overflow-x: hidden; } 135 | .upage-content { z-index:1; } 136 | #afui .upage { padding: 0; } 137 | 138 | /* sidebars and crossbars */ 139 | 140 | .uib_sidebar { 141 | position: fixed; 142 | height: 100%; 143 | top: 0px; 144 | } 145 | 146 | .uib_crossbar { 147 | position: fixed; 148 | width: 100%; 149 | left: 0px; 150 | } 151 | 152 | .leftbar, .rightbar { z-index:2; } 153 | .reveal.leftbar { left:0px; z-index:0; } 154 | .reveal.rightbar { right:0px; z-index:0;} 155 | .leftbar.oh, 156 | .rightbar.oh { z-index:3; } 157 | .reveal { z-index:0; visibility: hidden; } 158 | .topbar { z-index:3; } 159 | .topbar.reveal { top:0px; z-index:0; } 160 | .botbar { z-index:3; position:fixed; } 161 | .botbar.oh, 162 | .topbar.oh { z-index:4; } 163 | 164 | .sidebar-content { 165 | height: 100%; 166 | overflow-y: auto; 167 | position: relative; 168 | margin: 0; 169 | } 170 | 171 | .sidebar-thumb{ position:relative; margin:0; /* background-image:url('images/gripper.png'); */} 172 | 173 | //service method support 174 | .template { display:none !important; } 175 | 176 | //Absolute positioning 177 | .uib-absolute { position: absolute !important } 178 | 179 | //framework 7 content block inner block 180 | .content-block-inner { box-sizing: content-box; } 181 | 182 | //framework 7 multi-button header 183 | .navbar-inner .widget-container { display: inline-flex; } 184 | 185 | //framework 7 searchbar width override 186 | .searchbar { width: 100% !important; margin: 0 !important; } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/index_main.less: -------------------------------------------------------------------------------- 1 | 2 | @max_width: none; 3 | @gutter: 20px; 4 | 5 | @wp_1: 0px; 6 | @wp_2: 0px; 7 | @wp_3: 0px; 8 | 9 | @import "defaults.less"; 10 | @import "ionic-header-footer-css.less"; 11 | @import "ionic_full_width.less"; 12 | @import "styles/d-margins -- margins.less"; 13 | @import "uib_row_1.less"; 14 | @import "styles/grid-pad -- padding.less"; 15 | @import "styles/row-height-1 -- row_height.less"; 16 | @import "ionic-group.less"; 17 | @import "uib_row_2.less"; 18 | @import "styles/row-height-2 -- row_height.less"; 19 | @import "uib_row_1.less"; 20 | @import "uib_row_1.less"; 21 | @import "uib_row_2.less"; 22 | @import "uib_row_1.less"; 23 | @import "uib_row_2.less"; -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/ionic-group.less: -------------------------------------------------------------------------------- 1 | .list .d-margins, 2 | .button-bar .d-margins, 3 | .tabs .d-margins 4 | { 5 | margin: 0; 6 | } 7 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/ionic-header-footer-css.less: -------------------------------------------------------------------------------- 1 | .bar > .buttons .d-margins { margin: auto } 2 | .bar { z-index: 1; } 3 | .upage-outer.fixed-header-footer { position: static; } 4 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/ionic_full_width.less: -------------------------------------------------------------------------------- 1 | .vertical-col > ion-list.widget, 2 | .vertical-col > .widget.item-radio, 3 | .vertical-col > .widget.item-toggle, 4 | .vertical-col > .widget.list, 5 | .vertical-col > .widget.item-select, 6 | .vertical-col > .widget.item-checkbox, 7 | .vertical-col > .widget.button 8 | { 9 | margin-left: 0; 10 | display: inline-block; 11 | width: 100%; 12 | } 13 | .vertical-col > .widget.item.range, 14 | .vertical-col > .widget.button-bar, 15 | .vertical-col > .widget.tabs 16 | { 17 | margin-left: 0; 18 | width: 100%; 19 | } 20 | .vertical-col > .widget.item-input 21 | { 22 | margin-left: 0; 23 | display: inline-flex; 24 | width: 100%; 25 | } 26 | .vertical-col > .widget.item-input.item-floating-label, 27 | .vertical-col > .widget.item-input.item-stacked-label 28 | { 29 | margin-left: 0; 30 | display: inline-block; 31 | width: 100%; 32 | } 33 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/styles/d-margins -- margins.less: -------------------------------------------------------------------------------- 1 | @media all { 2 | .wrapping-col > .d-margins, 3 | .wrapping-col > .afScrollPanel > .d-margins { margin-left:6px; 4 | margin-right:6px; 5 | } 6 | 7 | .wrapping-col > .d-margins, 8 | .wrapping-col > .afScrollPanel > .d-margins { margin-left:6px; 9 | margin-right:6px; 10 | } 11 | 12 | .d-margins { margin-top:5px; 13 | margin-bottom:6px; 14 | } 15 | 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/styles/grid-pad -- padding.less: -------------------------------------------------------------------------------- 1 | @media all { 2 | .grid-pad { padding-top:10px; 3 | padding-bottom:10px; 4 | padding-left:20px; 5 | padding-right:20px; 6 | } 7 | 8 | } 9 | 10 | 11 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/styles/row-height-1 -- row_height.less: -------------------------------------------------------------------------------- 1 | @media all and (min-width : @wp_1){ .row-height-1 > .col > .content-area { min-height:100px; 2 | } 3 | 4 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/styles/row-height-2 -- row_height.less: -------------------------------------------------------------------------------- 1 | @media all and (min-width : @wp_1){ .row-height-2 > .col > .content-area { min-height:100px; 2 | } 3 | 4 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/uib_row_1.less: -------------------------------------------------------------------------------- 1 | @gutter_uib_row_1: 20px; 2 | 3 | .uib_row_1:not(.cright) > .col { padding-right:@gutter_uib_row_1; } 4 | 5 | .uib_row_1.cright > .col { padding-left:@gutter_uib_row_1; } 6 | 7 | @media all { 8 | .col-0_12-12 { width: auto; float: none !important; } 9 | .urow:not(.cright) > .col-0_12-12 { padding-right:0px !important; } 10 | .urow.cright > .col-0_12-12 { padding-left:0px !important; } 11 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index/uib_row_2.less: -------------------------------------------------------------------------------- 1 | @gutter_uib_row_2: 20px; 2 | 3 | .uib_row_2:not(.cright) > .col { padding-right:@gutter_uib_row_2; } 4 | 5 | .uib_row_2.cright > .col { padding-left:@gutter_uib_row_2; } 6 | 7 | @media all { 8 | .col-0_12-12 { width: auto; float: none !important; } 9 | .urow:not(.cright) > .col-0_12-12 { padding-right:0px !important; } 10 | .urow.cright > .col-0_12-12 { padding-left:0px !important; } 11 | } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/index_main.less.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Warning: This CSS file has been auto-generated from a .less file. If you edit it your edits will be lost the next time LessCSS is run. 4 | 5 | It would be best to make a separate CSS file and place any overriding CSS in there. If you must access the original CSS, do so by editing the .less files. 6 | 7 | */ 8 | /* global settings */ 9 | *, 10 | *:after, 11 | *:before { 12 | -webkit-box-sizing: border-box; 13 | -moz-box-sizing: border-box; 14 | box-sizing: border-box; 15 | } 16 | body { 17 | margin: 0px; 18 | } 19 | /* grid */ 20 | .grid { 21 | width: 100%; 22 | } 23 | .upage-content > .grid { 24 | max-width: none; 25 | margin-left: auto; 26 | margin-right: auto; 27 | } 28 | /* gutter around whole design */ 29 | /* 30 | .upage-content > .grid-pad { 31 | padding: @gutter @gutter 0px @gutter; 32 | } 33 | */ 34 | /* column */ 35 | .urow:not(.cright) > .col { 36 | float: left; 37 | } 38 | .urow.cright > .col { 39 | float: right; 40 | } 41 | .col { 42 | position: relative; 43 | min-height: 1px; 44 | } 45 | .content-area { 46 | position: relative; 47 | } 48 | /* row */ 49 | .urow { 50 | clear: both; 51 | position: relative; 52 | } 53 | form.urow { 54 | margin-bottom: 0px; 55 | } 56 | .widget { 57 | position: relative; 58 | } 59 | /* for widgets and the like 60 |
61 |
my width is set
62 |
my width is 100%, minus the set width of the narrow-control
63 |
64 | 65 | .w85 { width:85px; } 66 | */ 67 | .vertical-col > *, 68 | .vertical-col > .table-thing, 69 | .vertical-col > .afScrollPanel > .table-thing, 70 | .wrapping-col > .no_wrap.table-thing, 71 | .wrapping-col > .afScrollPanel > .no_wrap.table-thing { 72 | width: 100%; 73 | } 74 | #afui .vertical-col > .afScrollPanel > .widget, 75 | #afui .vertical-col > .widget, 76 | .vertical-col > .widget { 77 | width: calc(100% - 10px); 78 | margin-left: 5px; 79 | } 80 | .col > .vertical-col > .widget { 81 | width: 100%; 82 | margin-left: 0; 83 | } 84 | .table-thing { 85 | display: table; 86 | } 87 | .wide-control { 88 | display: table-cell; 89 | width: 100%; 90 | } 91 | .narrow-control { 92 | display: table-cell; 93 | } 94 | /* wrapping column */ 95 | .wrapping-col.right > *, 96 | .wrapping-col.right > .afScrollPanel > * { 97 | float: right; 98 | } 99 | /* margin: 0 5px; move margin to another class */ 100 | .wrapping-col.left > *, 101 | .wrapping-col.left > .afScrollPanel > * { 102 | float: left; 103 | } 104 | /* center and right alignment */ 105 | .vertical-col.center { 106 | text-align: center; 107 | } 108 | .vertical-col.right { 109 | text-align: right; 110 | } 111 | .vertical-col.right > *, 112 | .col > .vertical-col.right > .widget, 113 | .vertical-col.right > .afScrollPanel > * { 114 | margin-left: auto; 115 | } 116 | .vertical-col.center > *, 117 | .col > .vertical-col.center > .widget, 118 | .vertical-col.center > .afScrollPanel > * { 119 | margin-left: auto; 120 | margin-right: auto; 121 | } 122 | .wrapping-col:not(.horiz-area) > .no_wrap, 123 | .wrapping-col:not(.horiz-area) > .afScrollPanel > .no_wrap { 124 | float: none; 125 | clear: both; 126 | /* margin: 8px 0px; */ 127 | 128 | } 129 | .center-h-v-col > .widget { 130 | position: absolute !important; 131 | left: 50%; 132 | top: 50%; 133 | transform: translate(-50%, -50%); 134 | -webkit-transform: translate(-50%, -50%); 135 | margin-top: 0 !important; 136 | } 137 | /* shim */ 138 | .uib_shim { 139 | clear: both; 140 | float: none !important; 141 | width: 100%; 142 | position: relative; 143 | height: 0px; 144 | line-height: 0px; 145 | font-size: 0px; 146 | display: block; 147 | } 148 | /* content-box fix for box-sizing */ 149 | .content-box, 150 | .content-box:before, 151 | .content-box:after { 152 | -webkit-box-sizing: content-box; 153 | -moz-box-sizing: content-box; 154 | box-sizing: content-box; 155 | } 156 | /* page */ 157 | .hidden:not(.afPopup) { 158 | display: none; 159 | } 160 | .upage-content, 161 | .upage-outer { 162 | position: relative; 163 | } 164 | html, 165 | body { 166 | height: 100%; 167 | } 168 | body:not(#afui) .upage, 169 | body:not(#afui) .upage-content { 170 | height: 100%; 171 | } 172 | body:not(#afui) .upage-outer { 173 | height: auto; 174 | } 175 | /* position relative works fine. but fixed can be elected as well */ 176 | /* .upage-content, .upage-outer { position: fixed; height:100%; } */ 177 | .upage { 178 | overflow-x: hidden; 179 | } 180 | .upage-content { 181 | z-index: 1; 182 | } 183 | #afui .upage { 184 | padding: 0; 185 | } 186 | /* sidebars and crossbars */ 187 | .uib_sidebar { 188 | position: fixed; 189 | height: 100%; 190 | top: 0px; 191 | } 192 | .uib_crossbar { 193 | position: fixed; 194 | width: 100%; 195 | left: 0px; 196 | } 197 | .leftbar, 198 | .rightbar { 199 | z-index: 2; 200 | } 201 | .reveal.leftbar { 202 | left: 0px; 203 | z-index: 0; 204 | } 205 | .reveal.rightbar { 206 | right: 0px; 207 | z-index: 0; 208 | } 209 | .leftbar.oh, 210 | .rightbar.oh { 211 | z-index: 3; 212 | } 213 | .reveal { 214 | z-index: 0; 215 | visibility: hidden; 216 | } 217 | .topbar { 218 | z-index: 3; 219 | } 220 | .topbar.reveal { 221 | top: 0px; 222 | z-index: 0; 223 | } 224 | .botbar { 225 | z-index: 3; 226 | position: fixed; 227 | } 228 | .botbar.oh, 229 | .topbar.oh { 230 | z-index: 4; 231 | } 232 | .sidebar-content { 233 | height: 100%; 234 | overflow-y: auto; 235 | position: relative; 236 | margin: 0; 237 | } 238 | .sidebar-thumb { 239 | position: relative; 240 | margin: 0; 241 | /* background-image:url('images/gripper.png'); */ 242 | } 243 | .template { 244 | display: none !important; 245 | } 246 | .uib-absolute { 247 | position: absolute !important; 248 | } 249 | .content-block-inner { 250 | box-sizing: content-box; 251 | } 252 | .navbar-inner .widget-container { 253 | display: inline-flex; 254 | } 255 | .searchbar { 256 | width: 100% !important; 257 | margin: 0 !important; 258 | } 259 | .bar > .buttons .d-margins { 260 | margin: auto; 261 | } 262 | .bar { 263 | z-index: 1; 264 | } 265 | .upage-outer.fixed-header-footer { 266 | position: static; 267 | } 268 | .vertical-col > ion-list.widget, 269 | .vertical-col > .widget.item-radio, 270 | .vertical-col > .widget.item-toggle, 271 | .vertical-col > .widget.list, 272 | .vertical-col > .widget.item-select, 273 | .vertical-col > .widget.item-checkbox, 274 | .vertical-col > .widget.button { 275 | margin-left: 0; 276 | display: inline-block; 277 | width: 100%; 278 | } 279 | .vertical-col > .widget.item.range, 280 | .vertical-col > .widget.button-bar, 281 | .vertical-col > .widget.tabs { 282 | margin-left: 0; 283 | width: 100%; 284 | } 285 | .vertical-col > .widget.item-input { 286 | margin-left: 0; 287 | display: inline-flex; 288 | width: 100%; 289 | } 290 | .vertical-col > .widget.item-input.item-floating-label, 291 | .vertical-col > .widget.item-input.item-stacked-label { 292 | margin-left: 0; 293 | display: inline-block; 294 | width: 100%; 295 | } 296 | @media all { 297 | .wrapping-col > .d-margins, 298 | .wrapping-col > .afScrollPanel > .d-margins { 299 | margin-left: 6px; 300 | margin-right: 6px; 301 | } 302 | .wrapping-col > .d-margins, 303 | .wrapping-col > .afScrollPanel > .d-margins { 304 | margin-left: 6px; 305 | margin-right: 6px; 306 | } 307 | .d-margins { 308 | margin-top: 5px; 309 | margin-bottom: 6px; 310 | } 311 | } 312 | .uib_row_1:not(.cright) > .col { 313 | padding-right: 20px; 314 | } 315 | .uib_row_1.cright > .col { 316 | padding-left: 20px; 317 | } 318 | @media all { 319 | .col-0_12-12 { 320 | width: auto; 321 | float: none !important; 322 | } 323 | .urow:not(.cright) > .col-0_12-12 { 324 | padding-right: 0px !important; 325 | } 326 | .urow.cright > .col-0_12-12 { 327 | padding-left: 0px !important; 328 | } 329 | } 330 | @media all { 331 | .grid-pad { 332 | padding-top: 10px; 333 | padding-bottom: 10px; 334 | padding-left: 20px; 335 | padding-right: 20px; 336 | } 337 | } 338 | @media all and (min-width: 0px) { 339 | .row-height-1 > .col > .content-area { 340 | min-height: 100px; 341 | } 342 | } 343 | .list .d-margins, 344 | .button-bar .d-margins, 345 | .tabs .d-margins { 346 | margin: 0; 347 | } 348 | .uib_row_2:not(.cright) > .col { 349 | padding-right: 20px; 350 | } 351 | .uib_row_2.cright > .col { 352 | padding-left: 20px; 353 | } 354 | @media all { 355 | .col-0_12-12 { 356 | width: auto; 357 | float: none !important; 358 | } 359 | .urow:not(.cright) > .col-0_12-12 { 360 | padding-right: 0px !important; 361 | } 362 | .urow.cright > .col-0_12-12 { 363 | padding-left: 0px !important; 364 | } 365 | } 366 | @media all and (min-width: 0px) { 367 | .row-height-2 > .col > .content-area { 368 | min-height: 100px; 369 | } 370 | } 371 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/views/.ignore/defaults.less: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Warning: This CSS file has been auto-generated from a .less file. If you edit it your edits will be lost the next time LessCSS is run. 4 | 5 | It would be best to make a separate CSS file and place any overriding CSS in there. If you must access the original CSS, do so by editing the .less files. 6 | 7 | */ 8 | 9 | /* global settings */ 10 | *, *:after, *:before { 11 | -webkit-box-sizing: border-box; 12 | -moz-box-sizing: border-box; 13 | box-sizing: border-box; 14 | } 15 | 16 | body { 17 | margin: 0px; 18 | } 19 | 20 | /* grid */ 21 | .grid { width:100%; } 22 | .upage-content > .grid { max-width:@max_width; margin-left:auto; margin-right:auto; } 23 | 24 | /* gutter around whole design */ 25 | /* 26 | .upage-content > .grid-pad { 27 | padding: @gutter @gutter 0px @gutter; 28 | } 29 | */ 30 | 31 | /* column */ 32 | .urow:not(.cright) > .col { float:left; } 33 | .urow.cright > .col { float:right; } 34 | 35 | .col { position:relative; min-height:1px; } 36 | .content-area { position:relative; } 37 | 38 | /* row */ 39 | .urow { clear:both; position:relative; } 40 | form.urow { margin-bottom: 0px; } 41 | 42 | .widget { position:relative; } 43 | 44 | /* for widgets and the like 45 |
46 |
my width is set
47 |
my width is 100%, minus the set width of the narrow-control
48 |
49 | 50 | .w85 { width:85px; } 51 | */ 52 | .vertical-col > *, 53 | .vertical-col > .table-thing, .vertical-col > .afScrollPanel > .table-thing, 54 | .wrapping-col > .no_wrap.table-thing, .wrapping-col > .afScrollPanel > .no_wrap.table-thing { 55 | width:100%; 56 | } 57 | 58 | #afui .vertical-col > .afScrollPanel > .widget, 59 | #afui .vertical-col > .widget, 60 | .vertical-col > .widget { 61 | width: calc(100% ~'-' 10px); 62 | margin-left: 5px; 63 | } 64 | 65 | .col > .vertical-col > .widget { 66 | width: 100%; 67 | margin-left: 0; 68 | } 69 | 70 | .table-thing{ display:table; } 71 | .wide-control{ display:table-cell; width:100% } 72 | .narrow-control{ display:table-cell; } 73 | 74 | /* wrapping column */ 75 | .wrapping-col.right > *, .wrapping-col.right > .afScrollPanel > * { float: right; } /* margin: 0 5px; move margin to another class */ 76 | .wrapping-col.left > *, .wrapping-col.left > .afScrollPanel > * { float: left; } 77 | 78 | /* center and right alignment */ 79 | .vertical-col.center { text-align:center; } 80 | .vertical-col.right { text-align:right; } 81 | 82 | .vertical-col.right > *, 83 | .col > .vertical-col.right > .widget, 84 | .vertical-col.right > .afScrollPanel > * { 85 | margin-left:auto; 86 | } 87 | .vertical-col.center > *, 88 | .col > .vertical-col.center > .widget, 89 | .vertical-col.center > .afScrollPanel > * { 90 | margin-left:auto; 91 | margin-right:auto; 92 | } 93 | .wrapping-col:not(.horiz-area) > .no_wrap, 94 | .wrapping-col:not(.horiz-area) > .afScrollPanel > .no_wrap { 95 | float: none; 96 | clear :both; 97 | /* margin: 8px 0px; */ 98 | } 99 | 100 | .center-h-v-col > .widget { 101 | position: absolute !important; 102 | left: 50%; 103 | top: 50%; 104 | transform: translate(-50%, -50%); 105 | -webkit-transform:translate(-50%, -50%); 106 | margin-top: 0 !important; 107 | } 108 | 109 | /* shim */ 110 | .uib_shim{ clear:both; float:none !important; width:100%; position:relative; height:0px; line-height: 0px; font-size:0px; display:block; } 111 | 112 | /* content-box fix for box-sizing */ 113 | .content-box, .content-box:before, .content-box:after { 114 | -webkit-box-sizing: content-box; 115 | -moz-box-sizing: content-box; 116 | box-sizing: content-box; 117 | } 118 | 119 | /* page */ 120 | .hidden:not(.afPopup) { 121 | display: none; 122 | } 123 | 124 | .upage-content, .upage-outer {position:relative; } 125 | html, body { height: 100%; } 126 | body:not(#afui) { 127 | .upage, .upage-content { height: 100%; } 128 | .upage-outer { height: auto; } 129 | } 130 | 131 | /* position relative works fine. but fixed can be elected as well */ 132 | /* .upage-content, .upage-outer { position: fixed; height:100%; } */ 133 | 134 | .upage { overflow-x: hidden; } 135 | .upage-content { z-index:1; } 136 | #afui .upage { padding: 0; } 137 | 138 | /* sidebars and crossbars */ 139 | 140 | .uib_sidebar { 141 | position: fixed; 142 | height: 100%; 143 | top: 0px; 144 | } 145 | 146 | .uib_crossbar { 147 | position: fixed; 148 | width: 100%; 149 | left: 0px; 150 | } 151 | 152 | .leftbar, .rightbar { z-index:2; } 153 | .reveal.leftbar { left:0px; z-index:0; } 154 | .reveal.rightbar { right:0px; z-index:0;} 155 | .leftbar.oh, 156 | .rightbar.oh { z-index:3; } 157 | .reveal { z-index:0; visibility: hidden; } 158 | .topbar { z-index:3; } 159 | .topbar.reveal { top:0px; z-index:0; } 160 | .botbar { z-index:3; position:fixed; } 161 | .botbar.oh, 162 | .topbar.oh { z-index:4; } 163 | 164 | .sidebar-content { 165 | height: 100%; 166 | overflow-y: auto; 167 | position: relative; 168 | margin: 0; 169 | } 170 | 171 | .sidebar-thumb{ position:relative; margin:0; /* background-image:url('images/gripper.png'); */} 172 | 173 | //service method support 174 | .template { display:none !important; } 175 | 176 | //Absolute positioning 177 | .uib-absolute { position: absolute !important } 178 | 179 | //framework 7 content block inner block 180 | .content-block-inner { box-sizing: content-box; } 181 | 182 | //framework 7 multi-button header 183 | .navbar-inner .widget-container { display: inline-flex; } 184 | 185 | //framework 7 searchbar width override 186 | .searchbar { width: 100% !important; margin: 0 !important; } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/views/.ignore/views_main.less: -------------------------------------------------------------------------------- 1 | 2 | @max_width: none; 3 | @gutter: 20px; 4 | 5 | @wp_1: 0px; 6 | @wp_2: 0px; 7 | @wp_3: 0px; 8 | 9 | @import "defaults.less"; -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/views/defaults.less: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Warning: This CSS file has been auto-generated from a .less file. If you edit it your edits will be lost the next time LessCSS is run. 4 | 5 | It would be best to make a separate CSS file and place any overriding CSS in there. If you must access the original CSS, do so by editing the .less files. 6 | 7 | */ 8 | 9 | /* global settings */ 10 | *, *:after, *:before { 11 | -webkit-box-sizing: border-box; 12 | -moz-box-sizing: border-box; 13 | box-sizing: border-box; 14 | } 15 | 16 | body { 17 | margin: 0px; 18 | } 19 | 20 | /* grid */ 21 | .grid { width:100%; } 22 | .upage-content > .grid { max-width:@max_width; margin-left:auto; margin-right:auto; } 23 | 24 | /* gutter around whole design */ 25 | /* 26 | .upage-content > .grid-pad { 27 | padding: @gutter @gutter 0px @gutter; 28 | } 29 | */ 30 | 31 | /* column */ 32 | .urow:not(.cright) > .col { float:left; } 33 | .urow.cright > .col { float:right; } 34 | 35 | .col { position:relative; min-height:1px; } 36 | .content-area { position:relative; } 37 | 38 | /* row */ 39 | .urow { clear:both; position:relative; } 40 | form.urow { margin-bottom: 0px; } 41 | 42 | .widget { position:relative; } 43 | 44 | /* for widgets and the like 45 |
46 |
my width is set
47 |
my width is 100%, minus the set width of the narrow-control
48 |
49 | 50 | .w85 { width:85px; } 51 | */ 52 | .vertical-col > *, 53 | .vertical-col > .table-thing, .vertical-col > .afScrollPanel > .table-thing, 54 | .wrapping-col > .no_wrap.table-thing, .wrapping-col > .afScrollPanel > .no_wrap.table-thing { 55 | width:100%; 56 | } 57 | 58 | #afui .vertical-col > .afScrollPanel > .widget, 59 | #afui .vertical-col > .widget, 60 | .vertical-col > .widget { 61 | width: calc(100% ~'-' 10px); 62 | margin-left: 5px; 63 | } 64 | 65 | .col > .vertical-col > .widget { 66 | width: 100%; 67 | margin-left: 0; 68 | } 69 | 70 | .table-thing{ display:table; } 71 | .wide-control{ display:table-cell; width:100% } 72 | .narrow-control{ display:table-cell; } 73 | 74 | /* wrapping column */ 75 | .wrapping-col.right > *, .wrapping-col.right > .afScrollPanel > * { float: right; } /* margin: 0 5px; move margin to another class */ 76 | .wrapping-col.left > *, .wrapping-col.left > .afScrollPanel > * { float: left; } 77 | 78 | /* center and right alignment */ 79 | .vertical-col.center { text-align:center; } 80 | .vertical-col.right { text-align:right; } 81 | 82 | .vertical-col.right > *, 83 | .col > .vertical-col.right > .widget, 84 | .vertical-col.right > .afScrollPanel > * { 85 | margin-left:auto; 86 | } 87 | .vertical-col.center > *, 88 | .col > .vertical-col.center > .widget, 89 | .vertical-col.center > .afScrollPanel > * { 90 | margin-left:auto; 91 | margin-right:auto; 92 | } 93 | .wrapping-col:not(.horiz-area) > .no_wrap, 94 | .wrapping-col:not(.horiz-area) > .afScrollPanel > .no_wrap { 95 | float: none; 96 | clear :both; 97 | /* margin: 8px 0px; */ 98 | } 99 | 100 | .center-h-v-col > .widget { 101 | position: absolute !important; 102 | left: 50%; 103 | top: 50%; 104 | transform: translate(-50%, -50%); 105 | -webkit-transform:translate(-50%, -50%); 106 | margin-top: 0 !important; 107 | } 108 | 109 | /* shim */ 110 | .uib_shim{ clear:both; float:none !important; width:100%; position:relative; height:0px; line-height: 0px; font-size:0px; display:block; } 111 | 112 | /* content-box fix for box-sizing */ 113 | .content-box, .content-box:before, .content-box:after { 114 | -webkit-box-sizing: content-box; 115 | -moz-box-sizing: content-box; 116 | box-sizing: content-box; 117 | } 118 | 119 | /* page */ 120 | .hidden:not(.afPopup) { 121 | display: none; 122 | } 123 | 124 | .upage-content, .upage-outer {position:relative; } 125 | html, body { height: 100%; } 126 | body:not(#afui) { 127 | .upage, .upage-content { height: 100%; } 128 | .upage-outer { height: auto; } 129 | } 130 | 131 | /* position relative works fine. but fixed can be elected as well */ 132 | /* .upage-content, .upage-outer { position: fixed; height:100%; } */ 133 | 134 | .upage { overflow-x: hidden; } 135 | .upage-content { z-index:1; } 136 | #afui .upage { padding: 0; } 137 | 138 | /* sidebars and crossbars */ 139 | 140 | .uib_sidebar { 141 | position: fixed; 142 | height: 100%; 143 | top: 0px; 144 | } 145 | 146 | .uib_crossbar { 147 | position: fixed; 148 | width: 100%; 149 | left: 0px; 150 | } 151 | 152 | .leftbar, .rightbar { z-index:2; } 153 | .reveal.leftbar { left:0px; z-index:0; } 154 | .reveal.rightbar { right:0px; z-index:0;} 155 | .leftbar.oh, 156 | .rightbar.oh { z-index:3; } 157 | .reveal { z-index:0; visibility: hidden; } 158 | .topbar { z-index:3; } 159 | .topbar.reveal { top:0px; z-index:0; } 160 | .botbar { z-index:3; position:fixed; } 161 | .botbar.oh, 162 | .topbar.oh { z-index:4; } 163 | 164 | .sidebar-content { 165 | height: 100%; 166 | overflow-y: auto; 167 | position: relative; 168 | margin: 0; 169 | } 170 | 171 | .sidebar-thumb{ position:relative; margin:0; /* background-image:url('images/gripper.png'); */} 172 | 173 | //service method support 174 | .template { display:none !important; } 175 | 176 | //Absolute positioning 177 | .uib-absolute { position: absolute !important } 178 | 179 | //framework 7 content block inner block 180 | .content-block-inner { box-sizing: content-box; } 181 | 182 | //framework 7 multi-button header 183 | .navbar-inner .widget-container { display: inline-flex; } 184 | 185 | //framework 7 searchbar width override 186 | .searchbar { width: 100% !important; margin: 0 !important; } -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/views/views_main.less: -------------------------------------------------------------------------------- 1 | 2 | @max_width: none; 3 | @gutter: 20px; 4 | 5 | @wp_1: 0px; 6 | @wp_2: 0px; 7 | @wp_3: 0px; 8 | 9 | @import "defaults.less"; -------------------------------------------------------------------------------- /IonicProjectStarter/www/css/views_main.less.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Warning: This CSS file has been auto-generated from a .less file. If you edit it your edits will be lost the next time LessCSS is run. 4 | 5 | It would be best to make a separate CSS file and place any overriding CSS in there. If you must access the original CSS, do so by editing the .less files. 6 | 7 | */ 8 | /* global settings */ 9 | *, 10 | *:after, 11 | *:before { 12 | -webkit-box-sizing: border-box; 13 | -moz-box-sizing: border-box; 14 | box-sizing: border-box; 15 | } 16 | body { 17 | margin: 0px; 18 | } 19 | /* grid */ 20 | .grid { 21 | width: 100%; 22 | } 23 | .upage-content > .grid { 24 | max-width: none; 25 | margin-left: auto; 26 | margin-right: auto; 27 | } 28 | /* gutter around whole design */ 29 | /* 30 | .upage-content > .grid-pad { 31 | padding: @gutter @gutter 0px @gutter; 32 | } 33 | */ 34 | /* column */ 35 | .urow:not(.cright) > .col { 36 | float: left; 37 | } 38 | .urow.cright > .col { 39 | float: right; 40 | } 41 | .col { 42 | position: relative; 43 | min-height: 1px; 44 | } 45 | .content-area { 46 | position: relative; 47 | } 48 | /* row */ 49 | .urow { 50 | clear: both; 51 | position: relative; 52 | } 53 | form.urow { 54 | margin-bottom: 0px; 55 | } 56 | .widget { 57 | position: relative; 58 | } 59 | /* for widgets and the like 60 |
61 |
my width is set
62 |
my width is 100%, minus the set width of the narrow-control
63 |
64 | 65 | .w85 { width:85px; } 66 | */ 67 | .vertical-col > *, 68 | .vertical-col > .table-thing, 69 | .vertical-col > .afScrollPanel > .table-thing, 70 | .wrapping-col > .no_wrap.table-thing, 71 | .wrapping-col > .afScrollPanel > .no_wrap.table-thing { 72 | width: 100%; 73 | } 74 | #afui .vertical-col > .afScrollPanel > .widget, 75 | #afui .vertical-col > .widget, 76 | .vertical-col > .widget { 77 | width: calc(100% - 10px); 78 | margin-left: 5px; 79 | } 80 | .col > .vertical-col > .widget { 81 | width: 100%; 82 | margin-left: 0; 83 | } 84 | .table-thing { 85 | display: table; 86 | } 87 | .wide-control { 88 | display: table-cell; 89 | width: 100%; 90 | } 91 | .narrow-control { 92 | display: table-cell; 93 | } 94 | /* wrapping column */ 95 | .wrapping-col.right > *, 96 | .wrapping-col.right > .afScrollPanel > * { 97 | float: right; 98 | } 99 | /* margin: 0 5px; move margin to another class */ 100 | .wrapping-col.left > *, 101 | .wrapping-col.left > .afScrollPanel > * { 102 | float: left; 103 | } 104 | /* center and right alignment */ 105 | .vertical-col.center { 106 | text-align: center; 107 | } 108 | .vertical-col.right { 109 | text-align: right; 110 | } 111 | .vertical-col.right > *, 112 | .col > .vertical-col.right > .widget, 113 | .vertical-col.right > .afScrollPanel > * { 114 | margin-left: auto; 115 | } 116 | .vertical-col.center > *, 117 | .col > .vertical-col.center > .widget, 118 | .vertical-col.center > .afScrollPanel > * { 119 | margin-left: auto; 120 | margin-right: auto; 121 | } 122 | .wrapping-col:not(.horiz-area) > .no_wrap, 123 | .wrapping-col:not(.horiz-area) > .afScrollPanel > .no_wrap { 124 | float: none; 125 | clear: both; 126 | /* margin: 8px 0px; */ 127 | 128 | } 129 | .center-h-v-col > .widget { 130 | position: absolute !important; 131 | left: 50%; 132 | top: 50%; 133 | transform: translate(-50%, -50%); 134 | -webkit-transform: translate(-50%, -50%); 135 | margin-top: 0 !important; 136 | } 137 | /* shim */ 138 | .uib_shim { 139 | clear: both; 140 | float: none !important; 141 | width: 100%; 142 | position: relative; 143 | height: 0px; 144 | line-height: 0px; 145 | font-size: 0px; 146 | display: block; 147 | } 148 | /* content-box fix for box-sizing */ 149 | .content-box, 150 | .content-box:before, 151 | .content-box:after { 152 | -webkit-box-sizing: content-box; 153 | -moz-box-sizing: content-box; 154 | box-sizing: content-box; 155 | } 156 | /* page */ 157 | .hidden:not(.afPopup) { 158 | display: none; 159 | } 160 | .upage-content, 161 | .upage-outer { 162 | position: relative; 163 | } 164 | html, 165 | body { 166 | height: 100%; 167 | } 168 | body:not(#afui) .upage, 169 | body:not(#afui) .upage-content { 170 | height: 100%; 171 | } 172 | body:not(#afui) .upage-outer { 173 | height: auto; 174 | } 175 | /* position relative works fine. but fixed can be elected as well */ 176 | /* .upage-content, .upage-outer { position: fixed; height:100%; } */ 177 | .upage { 178 | overflow-x: hidden; 179 | } 180 | .upage-content { 181 | z-index: 1; 182 | } 183 | #afui .upage { 184 | padding: 0; 185 | } 186 | /* sidebars and crossbars */ 187 | .uib_sidebar { 188 | position: fixed; 189 | height: 100%; 190 | top: 0px; 191 | } 192 | .uib_crossbar { 193 | position: fixed; 194 | width: 100%; 195 | left: 0px; 196 | } 197 | .leftbar, 198 | .rightbar { 199 | z-index: 2; 200 | } 201 | .reveal.leftbar { 202 | left: 0px; 203 | z-index: 0; 204 | } 205 | .reveal.rightbar { 206 | right: 0px; 207 | z-index: 0; 208 | } 209 | .leftbar.oh, 210 | .rightbar.oh { 211 | z-index: 3; 212 | } 213 | .reveal { 214 | z-index: 0; 215 | visibility: hidden; 216 | } 217 | .topbar { 218 | z-index: 3; 219 | } 220 | .topbar.reveal { 221 | top: 0px; 222 | z-index: 0; 223 | } 224 | .botbar { 225 | z-index: 3; 226 | position: fixed; 227 | } 228 | .botbar.oh, 229 | .topbar.oh { 230 | z-index: 4; 231 | } 232 | .sidebar-content { 233 | height: 100%; 234 | overflow-y: auto; 235 | position: relative; 236 | margin: 0; 237 | } 238 | .sidebar-thumb { 239 | position: relative; 240 | margin: 0; 241 | /* background-image:url('images/gripper.png'); */ 242 | } 243 | .template { 244 | display: none !important; 245 | } 246 | .uib-absolute { 247 | position: absolute !important; 248 | } 249 | .content-block-inner { 250 | box-sizing: content-box; 251 | } 252 | .navbar-inner .widget-container { 253 | display: inline-flex; 254 | } 255 | .searchbar { 256 | width: 100% !important; 257 | margin: 0 !important; 258 | } 259 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/images/Arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/images/Arrow.png -------------------------------------------------------------------------------- /IonicProjectStarter/www/images/Checkmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/images/Checkmark.png -------------------------------------------------------------------------------- /IonicProjectStarter/www/images/Exclaim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/images/Exclaim.png -------------------------------------------------------------------------------- /IonicProjectStarter/www/images/Strabburg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/images/Strabburg.jpg -------------------------------------------------------------------------------- /IonicProjectStarter/www/images/X.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/images/X.png -------------------------------------------------------------------------------- /IonicProjectStarter/www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | Blank App Designer Cordova Web App Project Template 11 | 12 | 13 | 24 | 25 | 26 | 27 | 28 | 29 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 |

Navigation

81 |
82 | 83 | 84 | Home 85 | 86 | 87 | About 88 | 89 | 90 | 91 |

Powered by Reinsys.

92 | 93 | 94 |
95 |
96 | 97 | 98 | 99 | Back 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 |
114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/ionic/fonts/ionicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/ionic/fonts/ionicons.eot -------------------------------------------------------------------------------- /IonicProjectStarter/www/ionic/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/ionic/fonts/ionicons.ttf -------------------------------------------------------------------------------- /IonicProjectStarter/www/ionic/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Reinsys/intel-xdk-ionic-angularjs-starter-template/8c7a3931052a2ab0fed5033e90d2af0b8c6a9679/IonicProjectStarter/www/ionic/fonts/ionicons.woff -------------------------------------------------------------------------------- /IonicProjectStarter/www/ionic/js/angular-ui/angular-ui-router.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * State-based routing for AngularJS 3 | * @version v0.2.13 4 | * @link http://angular-ui.github.com/ 5 | * @license MIT License, http://www.opensource.org/licenses/MIT 6 | */ 7 | "undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return M(new(M(function(){},{prototype:a})),b)}function e(a){return L(arguments,function(b){b!==a&&L(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var c=[];return b.forEach(a,function(a,b){c.push(b)}),c}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return M({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e "));if(s[c]=d,I(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);L(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return J(a)&&a.then&&a.$$promises}if(!J(i))throw new Error("'invocables' must be an object");var p=g(i||{}),q=[],r=[],s={};return L(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!G(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;L(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!J(d))throw new Error("'locals' must be an object")}else d=k;if(f){if(!o(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=m;var n=a.defer(),r=n.promise,s=r.$$promises={},t=M({},d),u=1+q.length/3,v=!1;if(G(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,l(f.$$inheritedValues,p)),M(s,f.$$promises),f.$$values?(v=e(t,l(f.$$values,p)),r.$$inheritedValues=l(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=l(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function p(a,b,c){this.fromConfig=function(a,b,c){return G(a.template)?this.fromString(a.template,b):G(a.templateUrl)?this.fromUrl(a.templateUrl,b):G(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return H(a)?a(b):a},this.fromUrl=function(c,d){return H(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:"text/html"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function q(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(p[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");return p[b]=new O.Param(b,c,d,e),p[b]}function g(a,b,c){var d=["",""],e=a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!b)return e;switch(c){case!1:d=["(",")"];break;case!0:d=["?(",")?"];break;default:d=["("+c+"|",")?"]}return e+d[0]+b+d[1]}function h(c,e){var f,g,h,i,j;return f=c[2]||c[3],j=b.params[f],h=a.substring(m,c.index),g=e?c[4]:c[4]||("*"==c[1]?".*":null),i=O.type(g||"string")||d(O.type("string"),{pattern:new RegExp(g)}),{id:f,regexp:g,segment:h,type:i,cfg:j}}b=M({params:{}},J(b)?b:{});var i,j=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,k=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l="^",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new O.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf("?")>=0));)s=f(r.id,r.type,r.cfg,"path"),l+=g(r.segment,s.type.pattern.source,s.squash),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf("?");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,"search"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch="";l+=g(t)+(b.strict===!1?"/?":"")+"$",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?"i":c),this.prefix=n[0],this.$$paramNames=q}function r(a){M(this,a)}function s(){function a(a){return null!=a?a.toString().replace(/\//g,"%2F"):a}function e(a){return null!=a?a.toString().replace(/%2F/g,"/"):a}function f(a){return this.pattern.test(a)}function i(){return{strict:t,caseInsensitive:p}}function j(a){return H(a)||K(a)&&H(a[a.length-1])}function k(){for(;x.length;){var a=x.shift();if(a.pattern)throw new Error("You cannot override a type's .pattern at runtime.");b.extend(v[a.name],o.invoke(a.def))}}function l(a){M(this,a||{})}O=this;var o,p=!1,t=!0,u=!1,v={},w=!0,x=[],y={string:{encode:a,decode:e,is:f,pattern:/[^/]*/},"int":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return G(a)&&this.decode(a.toString())===a},pattern:/\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),("0"+(a.getMonth()+1)).slice(-2),("0"+a.getDate()).slice(-2)].join("-"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^/]*/},any:{encode:b.identity,decode:b.identity,is:b.identity,equals:b.equals,pattern:/.*/}};s.$$getDefaultValue=function(a){if(!j(a.value))return a.value;if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(a.value)},this.caseInsensitive=function(a){return G(a)&&(p=a),p},this.strictMode=function(a){return G(a)&&(t=a),t},this.defaultSquashPolicy=function(a){if(!G(a))return u;if(a!==!0&&a!==!1&&!I(a))throw new Error("Invalid squash policy: "+a+". Valid policies: false, true, arbitrary-string");return u=a,a},this.compile=function(a,b){return new q(a,M(i(),b))},this.isMatcher=function(a){if(!J(a))return!1;var b=!0;return L(q.prototype,function(c,d){H(c)&&(b=b&&G(a[d])&&H(a[d]))}),b},this.type=function(a,b,c){if(!G(b))return v[a];if(v.hasOwnProperty(a))throw new Error("A type named '"+a+"' has already been defined.");return v[a]=new r(M({name:a},b)),c&&(x.push({name:a,def:c}),w||k()),this},L(y,function(a,b){v[b]=new r(M({name:b},a))}),v=d(v,{}),this.$get=["$injector",function(a){return o=a,w=!1,k(),L(y,function(a,b){v[b]||(v[b]=new r(a))}),this}],this.Param=function(a,b,d,e){function f(a){var b=J(a)?g(a):[],c=-1===h(b,"value")&&-1===h(b,"type")&&-1===h(b,"squash")&&-1===h(b,"array");return c&&(a={value:a}),a.$$fn=j(a.value)?a.value:function(){return a.value},a}function i(b,c,d){if(b.type&&c)throw new Error("Param '"+a+"' has two type configurations.");return c?c:b.type?b.type instanceof r?b.type:new r(b.type):"config"===d?v.any:v.string}function k(){var b={array:"search"===e?"auto":!1},c=a.match(/\[\]$/)?{array:!0}:{};return M(b,c,d).array}function l(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!G(c)||null==c)return u;if(c===!0||I(c))return c;throw new Error("Invalid squash policy: '"+c+"'. Valid policies: false, true, or arbitrary string")}function p(a,b,d,e){var f,g,i=[{from:"",to:d||b?c:""},{from:null,to:d||b?c:""}];return f=K(a.replace)?a.replace:[],I(e)&&f.push({from:e,to:c}),g=n(f,function(a){return a.from}),m(i,function(a){return-1===h(g,a.from)}).concat(f)}function q(){if(!o)throw new Error("Injectable functions cannot be called at configuration time");return o.invoke(d.$$fn)}function s(a){function b(a){return function(b){return b.from===a}}function c(a){var c=n(m(w.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),G(a)?w.type.decode(a):q()}function t(){return"{Param:"+a+" "+b+" squash: '"+z+"' optional: "+y+"}"}var w=this;d=f(d),b=i(d,b,e);var x=k();b=x?b.$asArray(x,"search"===e):b,"string"!==b.name||x||"path"!==e||d.value!==c||(d.value="");var y=d.value!==c,z=l(d,y),A=p(d,x,y,z);M(this,{id:a,type:b,location:e,array:x,squash:z,replace:A,isOptional:y,value:s,dynamic:c,config:d,toString:t})},l.prototype={$$new:function(){return d(this,M(new l,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(l.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),L(b,function(b){L(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return L(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return L(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var b,c,d,e=!0,f=this;return L(this.$$keys(),function(g){d=f[g],c=a[g],b=!c&&d.isOptional,e=e&&(b||!!d.type.is(c))}),e},$$parent:c},this.ParamSet=l}function t(a,d){function e(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function f(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return G(d)?d:!0}function h(d,e,f,g){function h(a,b,c){return"/"===p?a:b?p.slice(0,-1)+a:c?p.slice(1)+a:a}function m(a){function b(a){var b=a(f,d);return b?(I(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){var e=o&&d.url()===o;if(o=c,e)return!0;var g,h=j.length;for(g=0;h>g;g++)if(b(j[g]))return;k&&b(k)}}function n(){return i=i||e.$on("$locationChangeSuccess",m)}var o,p=g.baseHref(),q=d.url();return l||n(),{sync:function(){m()},listen:function(){return n()},update:function(a){return a?void(q=d.url()):void(d.url()!==q&&(d.url(q),d.replace()))},push:function(a,b,e){d.url(a.format(b||{})),o=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled);var i=c.format(e);if(f=f||{},g||null===i||(i="#"+a.hashPrefix()+i),i=h(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?"/":"",k=d.port();return k=80===k||443===k?"":":"+k,[d.protocol(),"://",d.host(),k,j,i].join("")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!H(a))throw new Error("'rule' must be a function");return j.push(a),this},this.otherwise=function(a){if(I(a)){var b=a;a=function(){return b}}else if(!H(a))throw new Error("'rule' must be a function");return k=a,this},this.when=function(a,b){var c,h=I(b);if(I(a)&&(a=d.compile(a)),!h&&!H(b)&&!K(b))throw new Error("invalid 'handler' in when()");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=["$match",function(a){return c.format(a)}]),M(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:I(a.prefix)?a.prefix:""})},regex:function(a,b){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(c=b,b=["$match",function(a){return f(c,a)}]),M(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=["$location","$rootScope","$injector","$browser"]}function u(a,e){function f(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){if(!a)return c;var d=I(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error("No reference point given for path '"+e+"'");b=l(b);for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var m=y[e];return!m||!d&&(d||m!==a&&m.self!==a)?c:m}function m(a,b){z[a]||(z[a]=[]),z[a].push(b)}function o(a){for(var b=z[a]||[];b.length;)p(b.shift())}function p(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!I(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(y.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):I(b.parent)?b.parent:J(b.parent)&&I(b.parent.name)?b.parent.name:"";if(e&&!y[e])return m(e,b.self);for(var f in B)H(B[f])&&(b[f]=B[f](b,B.$delegates[f]));return y[c]=b,!b[A]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){x.$current.navigable==b&&j(a,c)||x.transitionTo(b,a,{inherit:!0,location:!1})}]),o(c),b}function q(a){return a.indexOf("*")>-1}function r(a){var b=a.split("."),c=x.$current.name.split(".");if("**"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return c.join("")===b.join("")}function s(a,b){return I(a)&&!G(b)?B[a]:H(b)&&I(a)?(B[a]&&!B.$delegates[a]&&(B.$delegates[a]=B[a]),B[a]=b,this):this}function t(a,b){return J(a)?b=a:b.name=a,p(b),this}function u(a,e,f,h,m,o,p){function s(b,c,d,f){var g=a.$broadcast("$stateNotFound",b,c,d);if(g.defaultPrevented)return p.update(),B;if(!g.retry)return null;if(f.$retry)return p.update(),C;var h=x.transition=e.when(g.retry);return h.then(function(){return h!==x.transition?u:(b.options.$retry=!0,x.transitionTo(b.to,b.toParams,b.options))},function(){return B}),p.update(),h}function t(a,c,d,g,i,j){var l=d?c:k(a.params.$$keys(),c),n={$stateParams:l};i.resolve=m.resolve(a.resolve,n,i.resolve,a);var o=[i.resolve.then(function(a){i.globals=a})];return g&&o.push(g),L(a.views,function(c,d){var e=c.resolve&&c.resolve!==a.resolve?c.resolve:{};e.$template=[function(){return f.load(d,{view:c,locals:n,params:l,notify:j.notify})||""}],o.push(m.resolve(e,n,i.resolve,a).then(function(f){if(H(c.controllerProvider)||K(c.controllerProvider)){var g=b.extend({},e,n);f.$$controller=h.invoke(c.controllerProvider,null,g)}else f.$$controller=c.controller;f.$$state=a,f.$$controllerAs=c.controllerAs,i[d]=f}))}),e.all(o).then(function(){return i})}var u=e.reject(new Error("transition superseded")),z=e.reject(new Error("transition prevented")),B=e.reject(new Error("transition aborted")),C=e.reject(new Error("transition failed"));return w.locals={resolve:null,globals:{$stateParams:{}}},x={params:{},current:w.self,$current:w,transition:null},x.reload=function(){return x.transitionTo(x.current,o,{reload:!0,inherit:!1,notify:!0})},x.go=function(a,b,c){return x.transitionTo(a,b,M({inherit:!0,relative:x.$current},c))},x.transitionTo=function(b,c,f){c=c||{},f=M({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=x.$current,m=x.params,n=j.path,q=l(b,f.relative);if(!G(q)){var r={to:b,toParams:c,options:f},y=s(r,j.self,m,f);if(y)return y;if(b=r.to,c=r.toParams,f=r.options,q=l(b,f.relative),!G(q)){if(!f.relative)throw new Error("No such state '"+b+"'");throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'")}}if(q[A])throw new Error("Cannot transition to abstract state '"+b+"'");if(f.inherit&&(c=i(o,c||{},x.$current,q)),!q.params.$$validates(c))return C;c=q.params.$$values(c),b=q;var B=b.path,D=0,E=B[D],F=w.locals,H=[];if(!f.reload)for(;E&&E===n[D]&&E.ownParams.$$equals(c,m);)F=H[D]=E.locals,D++,E=B[D];if(v(b,j,F,f))return b.self.reloadOnSearch!==!1&&p.update(),x.transition=null,e.when(x.current);if(c=k(b.params.$$keys(),c||{}),f.notify&&a.$broadcast("$stateChangeStart",b.self,c,j.self,m).defaultPrevented)return p.update(),z;for(var I=e.when(F),J=D;J=D;d--)g=n[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d=0?e:e+"@"+(f?f.state.name:"")}function A(a,b){var c,d=a.match(/^\s*({[^}]*})\s*$/);if(d&&(a=b+"("+d[1]+")"),c=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!c||4!==c.length)throw new Error("Invalid state ref '"+a+"'");return{state:c[1],paramExpr:c[3]||null}}function B(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function C(a,c){var d=["location","inherit","reload"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(e,f,g,h){var i=A(g.uiSref,a.current.name),j=null,k=B(f)||a.$current,l=null,m="A"===f.prop("tagName"),n="FORM"===f[0].nodeName,o=n?"action":"href",p=!0,q={relative:k,inherit:!0},r=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in r&&(q[a]=r[a])});var s=function(c){if(c&&(j=b.copy(c)),p){l=a.href(i.state,j,q);var d=h[1]||h[0];return d&&d.$$setStateInfo(i.state,j),null===l?(p=!1,!1):void g.$set(o,l)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a){a!==j&&s(a)},!0),j=b.copy(e.$eval(i.paramExpr))),s(),n||f.bind("click",function(b){var d=b.which||b.button;if(!(d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target"))){var e=c(function(){a.go(i.state,j,q)});b.preventDefault();var g=m&&!l?1:0;b.preventDefault=function(){g--<=0&&c.cancel(e)}}})}}}function D(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(b,d,e){function f(){g()?d.addClass(j):d.removeClass(j)}function g(){return"undefined"!=typeof e.uiSrefActiveEq?h&&a.is(h.name,i):h&&a.includes(h.name,i)}var h,i,j;j=c(e.uiSrefActiveEq||e.uiSrefActive||"",!1)(b),this.$$setStateInfo=function(b,c){h=a.get(b,B(d)),i=c,f()},b.$on("$stateChangeSuccess",f)}]}}function E(a){var b=function(b){return a.is(b)};return b.$stateful=!0,b}function F(a){var b=function(b){return a.includes(b)};return b.$stateful=!0,b}var G=b.isDefined,H=b.isFunction,I=b.isString,J=b.isObject,K=b.isArray,L=b.forEach,M=b.extend,N=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),o.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",o),p.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",p);var O;q.prototype.concat=function(a,b){var c={caseInsensitive:O.caseInsensitive(),strict:O.strictMode(),squash:O.defaultSquashPolicy()};return new q(this.sourcePath+a+this.sourceSearch,M(c,b),this)},q.prototype.toString=function(){return this.source},q.prototype.exec=function(a,b){function c(a){function b(a){return a.split("").reverse().join("")}function c(a){return a.replace(/\\-/,"-")}var d=b(a).split(/-(?!\\)/),e=n(d,b);return n(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(e=0;j>e;e++){g=h[e];var l=this.params[g],m=d[e+1];for(f=0;fe;e++)g=h[e],k[g]=this.params[g].value(b[g]);return k},q.prototype.parameters=function(a){return G(a)?this.params[a]||null:this.$$paramNames},q.prototype.validates=function(a){return this.params.$$validates(a)},q.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return"%5C%"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],o=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),o),q=p?m.squash:!1,r=m.type.encode(o);if(k){var s=c[f+1];if(q===!1)null!=r&&(j+=K(r)?n(r,b).join("-"):encodeURIComponent(r)),j+=s;else if(q===!0){var t=j.match(/\/$/)?/\/?(.*)/:/(.*)/;j+=s.match(t)[1]}else I(q)&&(j+=q+s)}else{if(null==r||p&&q!==!1)continue;K(r)||(r=[r]),r=n(r,encodeURIComponent).join("&"+l+"="),j+=(g?"&":"?")+(l+"="+r),g=!0}}return j},r.prototype.is=function(){return!0},r.prototype.encode=function(a){return a},r.prototype.decode=function(a){return a},r.prototype.equals=function(a,b){return a==b},r.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},r.prototype.pattern=/.*/,r.prototype.toString=function(){return"{Type:"+this.name+"}"},r.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return K(a)?a:G(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return"auto"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){c=e(c);var d=n(c,a);return b===!0?0===m(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g=C&&b>=x&&c()}var m=g(e);a=e.data("$$ngAnimateCSS3Data");if(-1!=m.getAttribute("class").indexOf(b)&&a){var k="",t="";n(b.split(" "),function(a, 26 | b){var e=(0 21 | * 22 | * See {@link ngSanitize.$sanitize `$sanitize`} for usage. 23 | */ 24 | 25 | /* 26 | * HTML Parser By Misko Hevery (misko@hevery.com) 27 | * based on: HTML Parser By John Resig (ejohn.org) 28 | * Original code by Erik Arvidsson, Mozilla Public License 29 | * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js 30 | * 31 | * // Use like so: 32 | * htmlParser(htmlString, { 33 | * start: function(tag, attrs, unary) {}, 34 | * end: function(tag) {}, 35 | * chars: function(text) {}, 36 | * comment: function(text) {} 37 | * }); 38 | * 39 | */ 40 | 41 | 42 | /** 43 | * @ngdoc service 44 | * @name $sanitize 45 | * @kind function 46 | * 47 | * @description 48 | * The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are 49 | * then serialized back to properly escaped html string. This means that no unsafe input can make 50 | * it into the returned string, however, since our parser is more strict than a typical browser 51 | * parser, it's possible that some obscure input, which would be recognized as valid HTML by a 52 | * browser, won't make it through the sanitizer. The input may also contain SVG markup. 53 | * The whitelist is configured using the functions `aHrefSanitizationWhitelist` and 54 | * `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}. 55 | * 56 | * @param {string} html HTML input. 57 | * @returns {string} Sanitized HTML. 58 | * 59 | * @example 60 | 61 | 62 | 74 |
75 | Snippet: 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 |
DirectiveHowSourceRendered
ng-bind-htmlAutomatically uses $sanitize
<div ng-bind-html="snippet">
</div>
ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value 93 |
<div ng-bind-html="deliberatelyTrustDangerousSnippet()">
 94 | </div>
95 |
ng-bindAutomatically escapes
<div ng-bind="snippet">
</div>
105 |
106 |
107 | 108 | it('should sanitize the html snippet by default', function() { 109 | expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). 110 | toBe('

an html\nclick here\nsnippet

'); 111 | }); 112 | 113 | it('should inline raw snippet if bound to a trusted value', function() { 114 | expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). 115 | toBe("

an html\n" + 116 | "click here\n" + 117 | "snippet

"); 118 | }); 119 | 120 | it('should escape snippet without any filter', function() { 121 | expect(element(by.css('#bind-default div')).getInnerHtml()). 122 | toBe("<p style=\"color:blue\">an html\n" + 123 | "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + 124 | "snippet</p>"); 125 | }); 126 | 127 | it('should update', function() { 128 | element(by.model('snippet')).clear(); 129 | element(by.model('snippet')).sendKeys('new text'); 130 | expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). 131 | toBe('new text'); 132 | expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( 133 | 'new text'); 134 | expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( 135 | "new <b onclick=\"alert(1)\">text</b>"); 136 | }); 137 |
138 |
139 | */ 140 | function $SanitizeProvider() { 141 | this.$get = ['$$sanitizeUri', function($$sanitizeUri) { 142 | return function(html) { 143 | var buf = []; 144 | htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { 145 | return !/^unsafe/.test($$sanitizeUri(uri, isImage)); 146 | })); 147 | return buf.join(''); 148 | }; 149 | }]; 150 | } 151 | 152 | function sanitizeText(chars) { 153 | var buf = []; 154 | var writer = htmlSanitizeWriter(buf, angular.noop); 155 | writer.chars(chars); 156 | return buf.join(''); 157 | } 158 | 159 | 160 | // Regular Expressions for parsing tags and attributes 161 | var START_TAG_REGEXP = 162 | /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/, 163 | END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/, 164 | ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, 165 | BEGIN_TAG_REGEXP = /^/g, 168 | DOCTYPE_REGEXP = /]*?)>/i, 169 | CDATA_REGEXP = //g, 170 | SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, 171 | // Match everything outside of normal chars and " (quote character) 172 | NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; 173 | 174 | 175 | // Good source of info about elements and attributes 176 | // http://dev.w3.org/html5/spec/Overview.html#semantics 177 | // http://simon.html5.org/html-elements 178 | 179 | // Safe Void Elements - HTML5 180 | // http://dev.w3.org/html5/spec/Overview.html#void-elements 181 | var voidElements = makeMap("area,br,col,hr,img,wbr"); 182 | 183 | // Elements that you can, intentionally, leave open (and which close themselves) 184 | // http://dev.w3.org/html5/spec/Overview.html#optional-tags 185 | var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), 186 | optionalEndTagInlineElements = makeMap("rp,rt"), 187 | optionalEndTagElements = angular.extend({}, 188 | optionalEndTagInlineElements, 189 | optionalEndTagBlockElements); 190 | 191 | // Safe Block Elements - HTML5 192 | var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," + 193 | "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + 194 | "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); 195 | 196 | // Inline Elements - HTML5 197 | var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," + 198 | "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + 199 | "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); 200 | 201 | // SVG Elements 202 | // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements 203 | var svgElements = makeMap("animate,animateColor,animateMotion,animateTransform,circle,defs," + 204 | "desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient," + 205 | "line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,set," + 206 | "stop,svg,switch,text,title,tspan,use"); 207 | 208 | // Special Elements (can contain anything) 209 | var specialElements = makeMap("script,style"); 210 | 211 | var validElements = angular.extend({}, 212 | voidElements, 213 | blockElements, 214 | inlineElements, 215 | optionalEndTagElements, 216 | svgElements); 217 | 218 | //Attributes that have href and hence need to be sanitized 219 | var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href"); 220 | 221 | var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + 222 | 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + 223 | 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + 224 | 'scope,scrolling,shape,size,span,start,summary,target,title,type,' + 225 | 'valign,value,vspace,width'); 226 | 227 | // SVG attributes (without "id" and "name" attributes) 228 | // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes 229 | var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' + 230 | 'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,' + 231 | 'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,' + 232 | 'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,' + 233 | 'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,' + 234 | 'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,' + 235 | 'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,' + 236 | 'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,' + 237 | 'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,' + 238 | 'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,' + 239 | 'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,' + 240 | 'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,' + 241 | 'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,' + 242 | 'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,' + 243 | 'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,' + 244 | 'zoomAndPan'); 245 | 246 | var validAttrs = angular.extend({}, 247 | uriAttrs, 248 | svgAttrs, 249 | htmlAttrs); 250 | 251 | function makeMap(str) { 252 | var obj = {}, items = str.split(','), i; 253 | for (i = 0; i < items.length; i++) obj[items[i]] = true; 254 | return obj; 255 | } 256 | 257 | 258 | /** 259 | * @example 260 | * htmlParser(htmlString, { 261 | * start: function(tag, attrs, unary) {}, 262 | * end: function(tag) {}, 263 | * chars: function(text) {}, 264 | * comment: function(text) {} 265 | * }); 266 | * 267 | * @param {string} html string 268 | * @param {object} handler 269 | */ 270 | function htmlParser(html, handler) { 271 | if (typeof html !== 'string') { 272 | if (html === null || typeof html === 'undefined') { 273 | html = ''; 274 | } else { 275 | html = '' + html; 276 | } 277 | } 278 | var index, chars, match, stack = [], last = html, text; 279 | stack.last = function() { return stack[ stack.length - 1 ]; }; 280 | 281 | while (html) { 282 | text = ''; 283 | chars = true; 284 | 285 | // Make sure we're not in a script or style element 286 | if (!stack.last() || !specialElements[ stack.last() ]) { 287 | 288 | // Comment 289 | if (html.indexOf("", index) === index) { 294 | if (handler.comment) handler.comment(html.substring(4, index)); 295 | html = html.substring(index + 3); 296 | chars = false; 297 | } 298 | // DOCTYPE 299 | } else if (DOCTYPE_REGEXP.test(html)) { 300 | match = html.match(DOCTYPE_REGEXP); 301 | 302 | if (match) { 303 | html = html.replace(match[0], ''); 304 | chars = false; 305 | } 306 | // end tag 307 | } else if (BEGING_END_TAGE_REGEXP.test(html)) { 308 | match = html.match(END_TAG_REGEXP); 309 | 310 | if (match) { 311 | html = html.substring(match[0].length); 312 | match[0].replace(END_TAG_REGEXP, parseEndTag); 313 | chars = false; 314 | } 315 | 316 | // start tag 317 | } else if (BEGIN_TAG_REGEXP.test(html)) { 318 | match = html.match(START_TAG_REGEXP); 319 | 320 | if (match) { 321 | // We only have a valid start-tag if there is a '>'. 322 | if (match[4]) { 323 | html = html.substring(match[0].length); 324 | match[0].replace(START_TAG_REGEXP, parseStartTag); 325 | } 326 | chars = false; 327 | } else { 328 | // no ending tag found --- this piece should be encoded as an entity. 329 | text += '<'; 330 | html = html.substring(1); 331 | } 332 | } 333 | 334 | if (chars) { 335 | index = html.indexOf("<"); 336 | 337 | text += index < 0 ? html : html.substring(0, index); 338 | html = index < 0 ? "" : html.substring(index); 339 | 340 | if (handler.chars) handler.chars(decodeEntities(text)); 341 | } 342 | 343 | } else { 344 | html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), 345 | function(all, text) { 346 | text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); 347 | 348 | if (handler.chars) handler.chars(decodeEntities(text)); 349 | 350 | return ""; 351 | }); 352 | 353 | parseEndTag("", stack.last()); 354 | } 355 | 356 | if (html == last) { 357 | throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + 358 | "of html: {0}", html); 359 | } 360 | last = html; 361 | } 362 | 363 | // Clean up any remaining tags 364 | parseEndTag(); 365 | 366 | function parseStartTag(tag, tagName, rest, unary) { 367 | tagName = angular.lowercase(tagName); 368 | if (blockElements[ tagName ]) { 369 | while (stack.last() && inlineElements[ stack.last() ]) { 370 | parseEndTag("", stack.last()); 371 | } 372 | } 373 | 374 | if (optionalEndTagElements[ tagName ] && stack.last() == tagName) { 375 | parseEndTag("", tagName); 376 | } 377 | 378 | unary = voidElements[ tagName ] || !!unary; 379 | 380 | if (!unary) 381 | stack.push(tagName); 382 | 383 | var attrs = {}; 384 | 385 | rest.replace(ATTR_REGEXP, 386 | function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { 387 | var value = doubleQuotedValue 388 | || singleQuotedValue 389 | || unquotedValue 390 | || ''; 391 | 392 | attrs[name] = decodeEntities(value); 393 | }); 394 | if (handler.start) handler.start(tagName, attrs, unary); 395 | } 396 | 397 | function parseEndTag(tag, tagName) { 398 | var pos = 0, i; 399 | tagName = angular.lowercase(tagName); 400 | if (tagName) 401 | // Find the closest opened tag of the same type 402 | for (pos = stack.length - 1; pos >= 0; pos--) 403 | if (stack[ pos ] == tagName) 404 | break; 405 | 406 | if (pos >= 0) { 407 | // Close all the open elements, up the stack 408 | for (i = stack.length - 1; i >= pos; i--) 409 | if (handler.end) handler.end(stack[ i ]); 410 | 411 | // Remove the open elements from the stack 412 | stack.length = pos; 413 | } 414 | } 415 | } 416 | 417 | var hiddenPre=document.createElement("pre"); 418 | var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/; 419 | /** 420 | * decodes all entities into regular string 421 | * @param value 422 | * @returns {string} A string with decoded entities. 423 | */ 424 | function decodeEntities(value) { 425 | if (!value) { return ''; } 426 | 427 | // Note: IE8 does not preserve spaces at the start/end of innerHTML 428 | // so we must capture them and reattach them afterward 429 | var parts = spaceRe.exec(value); 430 | var spaceBefore = parts[1]; 431 | var spaceAfter = parts[3]; 432 | var content = parts[2]; 433 | if (content) { 434 | hiddenPre.innerHTML=content.replace(//g, '>'); 465 | } 466 | 467 | /** 468 | * create an HTML/XML writer which writes to buffer 469 | * @param {Array} buf use buf.jain('') to get out sanitized html string 470 | * @returns {object} in the form of { 471 | * start: function(tag, attrs, unary) {}, 472 | * end: function(tag) {}, 473 | * chars: function(text) {}, 474 | * comment: function(text) {} 475 | * } 476 | */ 477 | function htmlSanitizeWriter(buf, uriValidator) { 478 | var ignore = false; 479 | var out = angular.bind(buf, buf.push); 480 | return { 481 | start: function(tag, attrs, unary) { 482 | tag = angular.lowercase(tag); 483 | if (!ignore && specialElements[tag]) { 484 | ignore = tag; 485 | } 486 | if (!ignore && validElements[tag] === true) { 487 | out('<'); 488 | out(tag); 489 | angular.forEach(attrs, function(value, key) { 490 | var lkey=angular.lowercase(key); 491 | var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); 492 | if (validAttrs[lkey] === true && 493 | (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { 494 | out(' '); 495 | out(key); 496 | out('="'); 497 | out(encodeEntities(value)); 498 | out('"'); 499 | } 500 | }); 501 | out(unary ? '/>' : '>'); 502 | } 503 | }, 504 | end: function(tag) { 505 | tag = angular.lowercase(tag); 506 | if (!ignore && validElements[tag] === true) { 507 | out(''); 510 | } 511 | if (tag == ignore) { 512 | ignore = false; 513 | } 514 | }, 515 | chars: function(chars) { 516 | if (!ignore) { 517 | out(encodeEntities(chars)); 518 | } 519 | } 520 | }; 521 | } 522 | 523 | 524 | // define ngSanitize module and register $sanitize service 525 | angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); 526 | 527 | /* global sanitizeText: false */ 528 | 529 | /** 530 | * @ngdoc filter 531 | * @name linky 532 | * @kind function 533 | * 534 | * @description 535 | * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and 536 | * plain email address links. 537 | * 538 | * Requires the {@link ngSanitize `ngSanitize`} module to be installed. 539 | * 540 | * @param {string} text Input text. 541 | * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. 542 | * @returns {string} Html-linkified text. 543 | * 544 | * @usage 545 | 546 | * 547 | * @example 548 | 549 | 550 | 562 |
563 | Snippet: 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 575 | 578 | 579 | 580 | 581 | 584 | 587 | 588 | 589 | 590 | 591 | 592 | 593 |
FilterSourceRendered
linky filter 573 |
<div ng-bind-html="snippet | linky">
</div>
574 |
576 |
577 |
linky target 582 |
<div ng-bind-html="snippetWithTarget | linky:'_blank'">
</div>
583 |
585 |
586 |
no filter
<div ng-bind="snippet">
</div>
594 | 595 | 596 | it('should linkify the snippet with urls', function() { 597 | expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). 598 | toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + 599 | 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); 600 | expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); 601 | }); 602 | 603 | it('should not linkify snippet without the linky filter', function() { 604 | expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). 605 | toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + 606 | 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); 607 | expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); 608 | }); 609 | 610 | it('should update', function() { 611 | element(by.model('snippet')).clear(); 612 | element(by.model('snippet')).sendKeys('new http://link.'); 613 | expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). 614 | toBe('new http://link.'); 615 | expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); 616 | expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) 617 | .toBe('new http://link.'); 618 | }); 619 | 620 | it('should work with the target property', function() { 621 | expect(element(by.id('linky-target')). 622 | element(by.binding("snippetWithTarget | linky:'_blank'")).getText()). 623 | toBe('http://angularjs.org/'); 624 | expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); 625 | }); 626 | 627 | 628 | */ 629 | angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { 630 | var LINKY_URL_REGEXP = 631 | /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/, 632 | MAILTO_REGEXP = /^mailto:/; 633 | 634 | return function(text, target) { 635 | if (!text) return text; 636 | var match; 637 | var raw = text; 638 | var html = []; 639 | var url; 640 | var i; 641 | while ((match = raw.match(LINKY_URL_REGEXP))) { 642 | // We can not end in these as they are sometimes found at the end of the sentence 643 | url = match[0]; 644 | // if we did not match ftp/http/www/mailto then assume mailto 645 | if (!match[2] && !match[4]) { 646 | url = (match[3] ? 'http://' : 'mailto:') + url; 647 | } 648 | i = match.index; 649 | addText(raw.substr(0, i)); 650 | addLink(url, match[0].replace(MAILTO_REGEXP, '')); 651 | raw = raw.substring(i + match[0].length); 652 | } 653 | addText(raw); 654 | return $sanitize(html.join('')); 655 | 656 | function addText(text) { 657 | if (!text) { 658 | return; 659 | } 660 | html.push(sanitizeText(text)); 661 | } 662 | 663 | function addLink(url, text) { 664 | html.push(''); 673 | addText(text); 674 | html.push(''); 675 | } 676 | }; 677 | }]); 678 | 679 | 680 | })(window, window.angular); 681 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/ionic/js/angular/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(""));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=/^]*?)>/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 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/ionic/version.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0-beta.14", 3 | "codename": "magnesium-mongoose", 4 | "date": "2014-12-15", 5 | "time": "20:15:47" 6 | } 7 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/js/app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Please see the included README.md file for license terms and conditions. 3 | */ 4 | 5 | 6 | // This file is a suggested starting place for your code. 7 | // It is completely optional and not required. 8 | // Note the reference that includes it in the index.html file. 9 | 10 | 11 | /*jslint browser:true, devel:true, white:true, vars:true */ 12 | /*global $:false, intel:false app:false, dev:false, cordova:false */ 13 | 14 | 15 | 16 | // This file contains your event handlers, the center of your application. 17 | // NOTE: see app.initEvents() in init-app.js for event handler initialization code. 18 | 19 | // function myEventHandler() { 20 | // "use strict" ; 21 | // // ...event handler code here... 22 | // } 23 | 24 | 25 | // ...additional event handlers here... 26 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/js/controllers.js: -------------------------------------------------------------------------------- 1 | app.controller('AppController', function($scope, display, $ionicHistory, $ionicSideMenuDelegate, $ionicPlatform, $rootScope) { 2 | $scope.display = display; 3 | $ionicPlatform.onHardwareBackButton(function(event){ 4 | $ionicHistory.goBack(); 5 | }); 6 | $scope.toggleLeft = function(){ 7 | $ionicSideMenuDelegate.toggleLeft(); 8 | } 9 | }); 10 | app.controller('IndexController', function($rootScope, $scope, display) { 11 | $rootScope.title = 'Home'; 12 | 13 | }); 14 | app.controller('SearchController', function($scope, display){ 15 | $scope.$parent.title = 'Search'; 16 | }); -------------------------------------------------------------------------------- /IonicProjectStarter/www/js/index_init_services.js: -------------------------------------------------------------------------------- 1 | /* -------------- 2 | initialization 3 | the xdkFilter argument can be set to a function that 4 | receives the data of the service method and can return alternate data 5 | thus you can reformat dates or names, remove or add entries, etc. 6 | -------------- */ 7 | 8 | var app = angular.module('myApp',['ionic','ngCordova']); 9 | app.config(['$controllerProvider', function($controllerProvider) { 10 | $controllerProvider.allowGlobals(); 11 | }]); 12 | app.config(function($ionicConfigProvider) { 13 | //$ionicConfigProvider.views.transition('none'); 14 | //$ionicConfigProvider.navBar.transition('none'); 15 | }); 16 | app.config(function($stateProvider, $urlRouterProvider) { 17 | $stateProvider 18 | .state('index', { 19 | url: '/', 20 | views : { 21 | index:{ 22 | templateProvider : function(display){/*use display service to load the intel xdk template by page id*/ 23 | return display.getPageTemplate('page-index').then(function(template){ 24 | return template; 25 | }); 26 | 27 | }, 28 | controller: 'IndexController' 29 | } 30 | } 31 | }) 32 | .state('search', { 33 | url: '/search', 34 | views : { 35 | index:{ 36 | templateProvider : function(display){ 37 | return display.getPageTemplate('page-search').then(function(template){ 38 | return template; 39 | }); 40 | }, 41 | controller: 'SearchController' 42 | } 43 | } 44 | }) 45 | 46 | $urlRouterProvider.otherwise("/"); 47 | 48 | }); -------------------------------------------------------------------------------- /IonicProjectStarter/www/js/init-app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Please see the included README.md file for license terms and conditions. 3 | */ 4 | 5 | 6 | // This file is a suggested initialization place for your code. 7 | // It is completely optional and not required. 8 | // It implements a Cordova "hide splashscreen" function, that may be useful. 9 | // Note the reference that includes it in the index.html file. 10 | 11 | 12 | /*jslint browser:true, devel:true, white:true, vars:true */ 13 | /*global $:false, intel:false, app:false, dev:false */ 14 | /*global myEventHandler:false, cordova:false, device:false */ 15 | 16 | 17 | 18 | window.app = window.app || {} ; // there should only be one of these... 19 | 20 | 21 | 22 | // Set to "true" if you want the console.log messages to appear. 23 | 24 | app.LOG = app.LOG || false ; 25 | 26 | app.consoleLog = function() { // only emits console.log messages if app.LOG != false 27 | if( app.LOG ) { 28 | var args = Array.prototype.slice.call(arguments, 0) ; 29 | console.log.apply(console, args) ; 30 | } 31 | } ; 32 | 33 | 34 | 35 | // App init point (runs on custom app.Ready event from init-dev.js). 36 | // Runs after underlying device native code and webview/browser is ready. 37 | // Where you should "kick off" your application by initializing app events, etc. 38 | 39 | // NOTE: Customize this function to initialize your application, as needed. 40 | 41 | app.initEvents = function() { 42 | "use strict" ; 43 | var fName = "app.initEvents():" ; 44 | app.consoleLog(fName, "entry") ; 45 | 46 | // NOTE: initialize your third-party libraries and event handlers 47 | 48 | // initThirdPartyLibraryNumberOne() ; 49 | // initThirdPartyLibraryNumberTwo() ; 50 | // initThirdPartyLibraryNumberEtc() ; 51 | 52 | // NOTE: initialize your application code 53 | 54 | // initMyAppCodeNumberOne() ; 55 | // initMyAppCodeNumberTwo() ; 56 | // initMyAppCodeNumberEtc() ; 57 | 58 | // NOTE: initialize your app event handlers, see app.js for a simple event handler example 59 | 60 | // TODO: configure following to work with both touch and click events (mouse + touch) 61 | // see http://msopentech.com/blog/2013/09/16/add-pinch-pointer-events-apache-cordova-phonegap-app/ 62 | 63 | //...overly simple example... 64 | // var el, evt ; 65 | // 66 | // if( navigator.msPointerEnabled || !('ontouchend' in window)) // if on Win 8 machine or no touch 67 | // evt = "click" ; // let touch become a click event 68 | // else // else, assume touch events available 69 | // evt = "touchend" ; // not optimum, but works 70 | // 71 | // el = document.getElementById("id_btnHello") ; 72 | // el.addEventListener(evt, myEventHandler, false) ; 73 | 74 | // NOTE: ...you can put other miscellaneous init stuff in this function... 75 | // NOTE: ...and add whatever else you want to do now that the app has started... 76 | // NOTE: ...or create your own init handlers outside of this file that trigger off the "app.Ready" event... 77 | 78 | app.initDebug() ; // just for debug, not required; keep it if you want it or get rid of it 79 | app.hideSplashScreen() ; // after init is good time to remove splash screen; using a splash screen is optional 80 | 81 | // app initialization is done 82 | // app event handlers are ready 83 | // exit to idle state and wait for app events... 84 | 85 | app.consoleLog(fName, "exit") ; 86 | } ; 87 | document.addEventListener("app.Ready", app.initEvents, false) ; 88 | 89 | 90 | 91 | // Just a bunch of useful debug console.log() messages. 92 | // Runs after underlying device native code and webview/browser is ready. 93 | // The following is just for debug, not required; keep it if you want or get rid of it. 94 | 95 | app.initDebug = function() { 96 | "use strict" ; 97 | var fName = "app.initDebug():" ; 98 | app.consoleLog(fName, "entry") ; 99 | 100 | if( window.device && device.cordova ) { // old Cordova 2.x version detection 101 | app.consoleLog("device.version: " + device.cordova) ; // print the cordova version string... 102 | app.consoleLog("device.model: " + device.model) ; 103 | app.consoleLog("device.platform: " + device.platform) ; 104 | app.consoleLog("device.version: " + device.version) ; 105 | } 106 | 107 | if( window.cordova && cordova.version ) { // only works in Cordova 3.x 108 | app.consoleLog("cordova.version: " + cordova.version) ; // print new Cordova 3.x version string... 109 | 110 | if( cordova.require ) { // print included cordova plugins 111 | app.consoleLog(JSON.stringify(cordova.require('cordova/plugin_list').metadata, null, 1)) ; 112 | } 113 | } 114 | 115 | app.consoleLog(fName, "exit") ; 116 | } ; 117 | 118 | 119 | 120 | // Using a splash screen is optional. This function will not fail if none is present. 121 | // This is also a simple study in the art of multi-platform device API detection. 122 | 123 | app.hideSplashScreen = function() { 124 | "use strict" ; 125 | var fName = "app.hideSplashScreen():" ; 126 | app.consoleLog(fName, "entry") ; 127 | 128 | // see https://github.com/01org/appframework/blob/master/documentation/detail/%24.ui.launch.md 129 | // Do the following if you disabled App Framework autolaunch (in index.html, for example) 130 | // $.ui.launch() ; 131 | 132 | if( navigator.splashscreen && navigator.splashscreen.hide ) { // Cordova API detected 133 | navigator.splashscreen.hide() ; 134 | } 135 | if( window.intel && intel.xdk && intel.xdk.device ) { // Intel XDK device API detected, but... 136 | if( intel.xdk.device.hideSplashScreen ) // ...hideSplashScreen() is inside the base plugin 137 | intel.xdk.device.hideSplashScreen() ; 138 | } 139 | 140 | app.consoleLog(fName, "exit") ; 141 | } ; 142 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/js/services.js: -------------------------------------------------------------------------------- 1 | app.factory('display', ['$filter','$q','$ionicPopup','$ionicSideMenuDelegate','$ionicHistory', function($filter, $q, $ionicPopup, $ionicSideMenuDelegate, $ionicHistory) { 2 | return { 3 | alert : function(message, title, button, callback){ 4 | if(!callback) var callback = function(){return;} 5 | if(!title) title = 'Attention'; 6 | if(!button) button = 'Close'; 7 | var alertPopup = $ionicPopup.alert({ 8 | title: title, 9 | template: message, 10 | buttons: [ 11 | { 12 | text: ''+button+'', 13 | type: 'button-positive', 14 | } 15 | ] 16 | 17 | }); 18 | alertPopup.then(callback); 19 | }, 20 | goToPath : function(pathLink){ 21 | var path = "index.html#" + pathLink; 22 | window.location = path; 23 | }, 24 | getPageTemplate : function(pageId){ 25 | var deffered = $q.defer(); 26 | $("#template").load("views.html #" + pageId, function(){ 27 | var template = $("#" + pageId).html(); 28 | $(this).html('') 29 | deffered.resolve(template); 30 | }); 31 | return deffered.promise; 32 | }, 33 | menuIsOpen : function(){ 34 | return ($ionicSideMenuDelegate.isOpenLeft()) ? true : false; 35 | }, 36 | currentStateName : function(){ 37 | return $ionicHistory.currentStateName(); 38 | } 39 | } 40 | 41 | }]); 42 | 43 | app.factory('helper', ['$filter', function($filter) { 44 | return { 45 | toDateTime : function(secs) 46 | { 47 | var t = new Date(1970,0,1); 48 | t.setSeconds(secs); 49 | return t; 50 | } 51 | } 52 | }]); 53 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/js/views_init_services.js: -------------------------------------------------------------------------------- 1 | /* -------------- 2 | initialization 3 | the xdkFilter argument can be set to a function that 4 | receives the data of the service method and can return alternate data 5 | thus you can reformat dates or names, remove or add entries, etc. 6 | -------------- */ 7 | 8 | angular.module('myApp',['ionic']).config(['$controllerProvider', function($controllerProvider) { 9 | $controllerProvider.allowGlobals(); 10 | }]); 11 | 12 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/lib/ng-cordova-mocks.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * ngCordova 3 | * v0.1.20-alpha 4 | * Copyright 2015 Drifty Co. http://drifty.com/ 5 | * See LICENSE in this repository for license information 6 | */ 7 | !function(){var e=angular.module("ngCordovaMocks",[]);e.factory("$cordovaAppVersion",["$q",function(e){var r=!1;return{throwsError:r,getAppVersion:function(){var r=e.defer();return r.resolve("mock v"),r.promise}}}]),e.factory("$cordovaBarcodeScanner",["$q",function(e){var r=!1,t="",o="",i=!1;return{throwsError:r,scannedText:t,scannedFormat:o,wasCancelled:i,scan:function(){var r=e.defer();return this.throwsError?r.reject("There was an error scanning."):r.resolve({text:this.scannedText,format:this.scannedFormat,cancelled:this.wasCancelled}),r.promise},encode:function(r,t){this.scannedFormat=r,this.scannedText=t;var o=e.defer();return this.throwsError?o.reject("There was an error encoding the data."):o.resolve(),o.promise}}}]),e.factory("$cordovaBLE",["$q","$timeout",function(e,r){var t={name:"Test Device",id:"AA:BB:CC:DD:EE:FF",advertising:[2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121],rssi:-55},o={name:"Test Device",id:"AA:BB:CC:DD:EE:FF",advertising:[2,1,6,3,3,15,24,8,9,66,97,116,116,101,114,121],rssi:-55,services:["1800","1801","180f"],characteristics:[{service:"1800",characteristic:"2a00",properties:["Read"]},{service:"1800",characteristic:"2a01",properties:["Read"]},{service:"1801",characteristic:"2a05",properties:["Read"]},{service:"180f",characteristic:"2a19",properties:["Read"],descriptors:[{uuid:"2901"},{uuid:"2904"}]}]},i=new ArrayBuffer(8);return{scan:function(o,i){var n=e.defer();return r(function(){n.resolve(t)},1e3*i),n.promise},connect:function(t){var i=e.defer();return r(function(){i.resolve(o)},1500),i.promise},disconnect:function(t){var o=e.defer();return r(function(){o.resolve(!0)},500),o.promise},read:function(t,o,n){var s=e.defer();return r(function(){s.resolve(i)},100),s.promise},write:function(t,o,i,n){var s=e.defer();return r(function(){s.resolve(!0)},100),s.promise},writeCommand:function(t,o,i,n){var s=e.defer();return r(function(){s.resolve(!0)},100),s.promise},notify:function(t,o,i){var n=e.defer();return r(function(){n.resolve(!0)},100),n.promise},indicate:function(t,o,i){var n=e.defer();return r(function(){n.resolve(!0)},100),n.promise},isConnected:function(r){var t=e.defer();return t.resolve(!0),t.promise},isEnabled:function(){var r=e.defer();return r.resolve(!0),r.promise}}}]),e.factory("$cordovaBrightness",["$q",function(e){var r=100;return{get:function(){var t=e.defer();return t.resolve(r),t.promise},set:function(t){var o=e.defer();return r=t,o.resolve("OK"),o.promise},setKeepScreenOn:function(r){var t=e.defer();return t.resolve("OK"),t.promise}}}]),e.factory("$cordovaCamera",["$q",function(e){var r=!1,t="";return{throwsError:r,imageData:t,getPicture:function(r){var t=e.defer();return this.throwsError?t.reject("There was an error getting the picture."):(r&&(r=r),t.resolve(this.imageData)),t.promise}}}]),e.factory("$cordovaCapture",["$q",function(e){var r=!1;return{throwsError:r,captureAudio:function(){var r=e.defer();return this.throwsError?r.reject("There was an error capturing the audio."):r.resolve(),r.promise},captureImage:function(){var r=e.defer();return this.throwsError?r.reject("There was an error capturing the image."):r.resolve(),r.promise},captureVideo:function(){var r=e.defer();return this.throwsError?r.reject("There was an error capturing the video."):r.resolve(),r.promise}}}]),e.factory("$cordovaContacts",["$q",function(e){var r=!1,t=[];return{throwsError:r,contacts:t,save:function(r){var t=e.defer();if(this.throwsError)t.reject("There was an error saving the contact.");else{for(var o=null,i=0;i0&&(this.isVibrating=!0,self=this,r instanceof Array?this.vibrateTimer=e(function(){self.isVibrating=!1,self.vibrateTimer=null},r[0]):this.vibrateTimer=e(function(){self.isVibrating=!1,self.vibrateTimer=null},r))},vibrateWithPattern:function(e,r){},cancelVibration:function(){null!==this.vibrateTimer&&this.isVibrating===!0&&(e.cancel(this.vibrateTimer),this.isVibrating=!1)}}}])}(); -------------------------------------------------------------------------------- /IonicProjectStarter/www/marginal/marginal-position.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Intel Corporation. All rights reserved. 3 | */ 4 | 5 | (function() { 6 | 7 | "use strict"; 8 | 9 | /** 10 | * Get the max height of a set of elements 11 | * 12 | * @param {jQuery} $elements: jQuery set 13 | * @return {Integer}: maximum height of the elements in $elements 14 | */ 15 | var get_max_height_headers = function($elements) { 16 | if (!$elements.length) { return 0; } 17 | 18 | var heights = $elements.map(function(i, element) { 19 | return $(element).is('.bar-header') ? 44 : 88; 20 | }); 21 | 22 | return Math.max.apply(null, heights); 23 | }; 24 | 25 | var get_max_height_footers = function($headers, $footers) { 26 | if (!$headers.length || !$footers.length) { return 0; } 27 | 28 | var header_heights = $headers.map(function(i, element) { 29 | return $(element).is('.bar-header') ? 44 : 88; 30 | }); 31 | var footer_heights = $footers.map(function(i, element) { 32 | return $(element).is('.bar-footer') ? 44 : 88; 33 | }); 34 | 35 | var max_header = Math.max.apply(null, header_heights); 36 | var max_footer = Math.max.apply(null, footer_heights); 37 | 38 | return max_header + max_footer; 39 | }; 40 | 41 | 42 | var set_content_offsets = function(outerNode) { 43 | var $outer = $(outerNode); 44 | var $contents = $outer.children('.upage-content'); 45 | 46 | var $headers = $outer.children('.bar-header, .bar-subheader'); 47 | var $footers = $outer.children('.bar-footer, .bar-subfooter'); 48 | 49 | if (window.jQuery) { 50 | if (window.jQuery('.uib_crossbar.topbar') 51 | .filter(':animated, .uib_bar_visible').length) { return; } 52 | } 53 | 54 | // find the maximum height amongst the fixed headers/footers and adjust 55 | // the top offset and padding-bottom of the content areas to match 56 | $outer 57 | .css({ 'padding-bottom': get_max_height_footers($headers, $footers) }) 58 | .removeClass('hidden'); 59 | $contents.css({ 'top': get_max_height_headers($headers) }); 60 | }; 61 | 62 | 63 | var set_all_content_offsets = function() { 64 | $('.upage-outer').each(function() { 65 | set_content_offsets(this); 66 | }); 67 | }; 68 | 69 | 70 | $(function() { 71 | set_all_content_offsets(); 72 | $(window).on('resize', set_all_content_offsets); 73 | $(document).on('recalc-marginal-offset', set_all_content_offsets); 74 | $(document).on('pagechange', set_all_content_offsets); 75 | }); 76 | 77 | })(); 78 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/views.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 55 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/xdk/init-dev.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Please see the included README.md file for license terms and conditions. 3 | */ 4 | 5 | 6 | /* 7 | * NOTE: In most cases, you can leave the code in this file alone and use it as is. 8 | * 9 | * The functions in this file are designed to reliably detect various "ready" events 10 | * within a variety of containers (Intel XDK "legacy" container, Cordova 3.x container, 11 | * standard browser, App Preview, Crosswalk, etc.). It "unifies" the commonly used 12 | * ready events and is very helpful for moving a "web app" to a "hybrid app" scenario. 13 | * 14 | * This file has no dependencies. It will generate a custom "app.Ready" event 15 | * that you should use once to start your application, rather than waiting on a 16 | * "device ready" or "document ready" or "window load" or similar events. 17 | * 18 | * You should not have to modify anything in this file to use it. See the example 19 | * index.html file that accompanies this file (in its sample repo location) for 20 | * recommendations on the best placement of this file relative to other files and 21 | * for recommendations regarding the loading of other JavaScript files. 22 | * 23 | * There are a large number of console.log messages contained within this file. 24 | * They can be used to debug initialization problems and understand how it works. 25 | * It is highly recommended that you leave them in your app, they will not unduly 26 | * slow down or burden your application. 27 | * 28 | * There are many comments in this file and the accompanying index.html file. 29 | * Please read the comments within for details and further documentation. 30 | * 31 | * BTW: "dev" means "device" in this context, not "develop," because it grew out 32 | * of a desire to build a more reliable and flexible "device ready" detector. 33 | */ 34 | 35 | 36 | /*jslint browser:true, devel:true, white:true, vars:true */ 37 | /*global $:false, intel:false, dev:false, performance:false */ 38 | 39 | 40 | 41 | window.dev = window.dev || {} ; // there should only be one of these... 42 | 43 | 44 | 45 | // Use performance counter if it is available, otherwise, use milliseconds since 1970 46 | 47 | if( window.performance && performance.now ) { 48 | dev.timeStamp = function() { return performance.now().toFixed(3) ; } ; 49 | } 50 | else { 51 | dev.timeStart = Date.now() ; // feeble zero ref for relative time in ms 52 | dev.timeStamp = function() { return (Date.now() - dev.timeStart) ; } ; 53 | } 54 | 55 | 56 | 57 | // Set to "true" if you want the console.log messages to appear. 58 | // Helpful for debugging and understanding how this thing works. 59 | 60 | dev.LOG = false ; 61 | 62 | dev.consoleLog = function() { // only emits console.log messages if dev.LOG != false 63 | if( dev.LOG ) { 64 | var args = Array.prototype.slice.call(arguments, 0) ; 65 | console.log.apply(console, args) ; 66 | } 67 | } ; 68 | 69 | 70 | 71 | // Defines some delays constants used throughout for ready detections. 72 | // Each should be smaller than the next; most cases should work as is. 73 | // Lowering dev.BROWSER will speed up detection of browser scenario... 74 | // ...at expense of possible false detects of browser environment... 75 | // ...probably okay to go as low as 3000ms, depends on external libraries, etc. 76 | 77 | dev.INSURANCE = 250 ; // ms, insurance on registering ready events detected 78 | dev.WINDOW_LOAD = 500 ; // ms, for combating premature window load events 79 | dev.BROWSER = 7000 ; // ms, detecting in a browser (probably best at >5 seconds) 80 | dev.FAIL_SAFE = 10000 ; // ms, if all else fails, this saves our bacon :-) 81 | 82 | 83 | 84 | // Used to keep track of time when each of these items was triggered. 85 | // Sorry for the weird names in the isDeviceReady structure, it's done for 86 | // easier debugging and comparison of numbers when displayed in console.log messages. 87 | 88 | dev.isDeviceReady = { // listed in approximate order expected 89 | a_startTime______:dev.timeStamp(), // when we started execution of this module 90 | b_fnDocumentReady:false, // detected document.readyState == "complete" 91 | c_cordova_ready__:false, // detected cordova device ready event 92 | d_xdk_ready______:false, // detected Intel XDK device ready event 93 | e_fnDeviceReady__:false, // entered onDeviceReady() 94 | f_browser_ready__:false // detected browser container 95 | } ; 96 | 97 | 98 | 99 | // Where the device ready event ultimately ends up, regardless of environment. 100 | // Runs after underlying device native code and browser is initialized. 101 | // Usually not much needed here, just additional "device init" code. 102 | // See initDeviceReady() below for code that kicks off this function. 103 | // This function works with Cordova and Intel XDK webview or in a browser. 104 | 105 | // NOTE: Customize this function, if necessary, for low-level init of your app. 106 | 107 | dev.onDeviceReady = function() { 108 | var fName = "dev.onDeviceReady():" ; 109 | dev.consoleLog(fName, "entry") ; 110 | 111 | // Useful for debug and understanding initialization flow. 112 | if( dev.isDeviceReady.e_fnDeviceReady__ ) { 113 | dev.consoleLog(fName, "function terminated") ; 114 | return ; 115 | } else { 116 | dev.isDeviceReady.e_fnDeviceReady__ = dev.timeStamp() ; 117 | } 118 | 119 | // TODO: change this to use new custom events if I confirm it works in all webviews. 120 | // All device initialization is done; create and issue custom event named "app.Ready". 121 | // Using deprecated custom events until I can confirm new method works in all webviews... 122 | 123 | var evt = document.createEvent("Event") ; 124 | evt.initEvent("app.Ready", false, false) ; 125 | document.dispatchEvent(evt) ; 126 | 127 | dev.consoleLog(fName, dev.isDeviceReady) ; 128 | dev.consoleLog(fName, "exit") ; 129 | } ; 130 | 131 | 132 | 133 | /* 134 | * The following is an excerpt from the 3.3.0 cordova.js file and is useful for understanding 135 | * Cordova events. The order of events during page load and Cordova startup is as follows: 136 | * 137 | * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. 138 | * onNativeReady* Internal event that indicates the Cordova native side is ready. 139 | * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. 140 | * onDeviceReady* User event fired to indicate that Cordova is ready 141 | * onResume User event fired to indicate a start/resume lifecycle event 142 | * onPause User event fired to indicate a pause lifecycle event 143 | * onDestroy* Internal event fired when app is being destroyed (User should use window.onunload event, not this one). 144 | * 145 | * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. 146 | * All listeners that subscribe after the event is fired will be executed right away. 147 | * 148 | * The only Cordova events that user code should register for are: 149 | * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript 150 | * pause App has moved to background 151 | * resume App has returned to foreground 152 | * 153 | * Listeners can be registered as: 154 | * document.addEventListener("deviceready", myDeviceReadyListener, false); 155 | * document.addEventListener("resume", myResumeListener, false); 156 | * document.addEventListener("pause", myPauseListener, false); 157 | * 158 | * The DOM lifecycle events should be used for saving and restoring state 159 | * window.onload 160 | * window.onunload 161 | * 162 | */ 163 | 164 | // The following is not fool-proof, we're mostly interested in detecting one 165 | // or both events to insure device init is finished, detecting either will do. 166 | // Even though the timing should indicate which container, it does not always work. 167 | 168 | // If this event is called first, we should be in the Cordova container. 169 | 170 | dev.onDeviceReadyCordova = function() { 171 | dev.isDeviceReady.c_cordova_ready__ = dev.timeStamp() ; 172 | var fName = "dev.onDeviceReadyCordova():" ; 173 | dev.consoleLog(fName, dev.isDeviceReady.c_cordova_ready__) ; 174 | window.setTimeout(dev.onDeviceReady, dev.INSURANCE) ; 175 | } ; 176 | 177 | // If this event is called first, we should be in the legacy Intel XDK container. 178 | 179 | dev.onDeviceReadyXDK = function() { 180 | dev.isDeviceReady.d_xdk_ready______ = dev.timeStamp() ; 181 | var fName = "dev.onDeviceReadyXDK():" ; 182 | dev.consoleLog(fName, dev.isDeviceReady.d_xdk_ready______) ; 183 | window.setTimeout(dev.onDeviceReady, dev.INSURANCE) ; 184 | } ; 185 | 186 | // This is a faux onDeviceReady for browser scenario, mostly for code symmetry and fail-safe. 187 | 188 | dev.onDeviceReadyBrowser = function() { 189 | dev.isDeviceReady.f_browser_ready__ = dev.timeStamp() ; 190 | var fName = "dev.onDeviceReadyBrowser():" ; 191 | dev.consoleLog(fName, dev.isDeviceReady.f_browser_ready__) ; 192 | window.setTimeout(dev.onDeviceReady, dev.INSURANCE) ; 193 | } ; 194 | 195 | 196 | 197 | // Runs after document is loaded, and sets up wait for native (device) init to finish. 198 | // If we're running in a browser we're ready to go when document is loaded, but... 199 | // if we're running on a device we need to wait for native code to finish its init. 200 | 201 | dev.initDeviceReady = function() { 202 | var fName = "dev.initDeviceReady():" ; 203 | dev.consoleLog(fName, "entry") ; 204 | 205 | // Useful for debug and understanding initialization flow. 206 | if( dev.isDeviceReady.b_fnDocumentReady ) { 207 | dev.consoleLog(fName, "function terminated") ; 208 | return ; 209 | } else { 210 | dev.isDeviceReady.b_fnDocumentReady = dev.timeStamp() ; 211 | } 212 | 213 | document.addEventListener("intel.xdk.device.ready", dev.onDeviceReadyXDK, false) ; 214 | document.addEventListener("deviceready", dev.onDeviceReadyCordova, false) ; 215 | window.setTimeout(dev.onDeviceReadyBrowser, dev.BROWSER) ; 216 | 217 | // Last one, above, is fail-safe, in case we got no device ready event from Cordova or Intel XDK. 218 | // Cordova will timeout after five seconds, so we use a longer timeout to be conservative. 219 | // Very end of this file includes a "fail-safe, fail-safe" in case all else fails! 220 | 221 | // TODO: might want to double-check for Cordova deviceready, shouldn't be required... 222 | // "if" logic (below) needs further investigation in Cordova, legacy and debug containers 223 | // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. 224 | // if( window.channel && channel.onCordovaReady && (channel.onCordovaReady.state === 2) ) 225 | // dev.onDeviceReadyCordova() ; 226 | 227 | dev.consoleLog(fName, "navigator.vendor:", navigator.vendor) ; 228 | dev.consoleLog(fName, "navigator.platform:", navigator.platform) ; 229 | dev.consoleLog(fName, "navigator.userAgent:", navigator.userAgent) ; 230 | 231 | dev.consoleLog(fName, "exit") ; 232 | } ; 233 | 234 | 235 | 236 | // Wait for document ready before looking for device ready. 237 | // This insures the app does not start running until DOM is ready and... 238 | // ...makes it easier to deal with both in-browser and on-device scenarios and... 239 | // ...makes it easier to init device-dependent and device-independent code in one place. 240 | 241 | // NOTE: document.readyState seems to be more reliable, but seems not to be omnipresent. 242 | // NOTE: Delay after "load" event is added because some webviews appear to trigger prematurely. 243 | 244 | if( document.readyState ) { // some devices don't support this, why??? 245 | dev.consoleLog("document.readyState:", document.readyState) ; 246 | document.onreadystatechange = function () { 247 | dev.consoleLog("document.readyState:", document.readyState) ; 248 | if (document.readyState === "complete") { 249 | dev.initDeviceReady() ; // call when document is "ready ready" :) 250 | } 251 | } ; 252 | } 253 | dev.consoleLog("addEventListener:", dev.timeStamp()) ; 254 | window.addEventListener("load", function(){window.setTimeout(dev.initDeviceReady,dev.WINDOW_LOAD);}.bind(dev), false) ; 255 | window.setTimeout(dev.initDeviceReady, dev.FAIL_SAFE) ; // fail-safe fail-safe, just in case we miss all events! 256 | -------------------------------------------------------------------------------- /IonicProjectStarter/www/xdk/project-info.json: -------------------------------------------------------------------------------- 1 | { 2 | "__comment__": "/*This file is auto-generated by the Intel® XDK.*/", 3 | "signatureVersion": 1, 4 | "xdkVersion": "2496", 5 | "usesAppDesigner": "true", 6 | "projectGuid": "093974b2-eba3-4a42-94c0-d840844ca468", 7 | "projectTypeName": "com.intel.xdk.projecttype.jsapp", 8 | "src": "appDesigner", 9 | "type": "App Designer" 10 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 adefokun 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Intel-XDK-ionic-starter 2 | A simple and complete Intel XDK Ionic Framework starter project to enable the use of Intel XDK HTML designer for your Ionic Framework project that can take full advantage AngularJS. The bundled Ionic Framework Starter in Intel XDK does not enable use of the powerful Intel XDK HTML Designer because of the way Angular JS requires HTML templates to be defined to enable one-page design. 3 | 4 | # Installation 5 | Open the unzipped folder 6 | 7 | Open intel-xdk-ionic-angularjs-starter-template-masterfolder 8 | 9 | Copy IonicProjectStarter folder to your projects directory and rename to "YourProjectName" 10 | 11 | Open "YourProjectName" and rename "IonicProjectStarter.xdk" to "YourProjectName.xdk" 12 | 13 | Open your IntelXDK software 14 | 15 | Under Projects tab of IntelXDK, click OPEN AN INTEL XDK PROJECT 16 | 17 | Browse to "YourProjectName" folder in your projects directory 18 | 19 | Click and open "YourProjectName.xdk" 20 | --------------------------------------------------------------------------------