├── .gitignore ├── .travis.yml ├── LICENSE ├── about.html ├── app.png ├── collaborators.md ├── config.json ├── configure.js ├── configure.tmpl ├── css ├── ratchet-theme-android.css ├── ratchet-theme-android.min.css ├── ratchet-theme-ios.css ├── ratchet-theme-ios.min.css ├── ratchet.css └── ratchet.min.css ├── detail.tmpl ├── fonts ├── ratchicons.eot ├── ratchicons.svg ├── ratchicons.ttf └── ratchicons.woff ├── images ├── Icon.png ├── Icon@2x.png └── Monu.icns ├── index.html ├── index.js ├── makefile ├── mon ├── notes.md ├── package.json ├── readme.md └── screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | test/meta 4 | Monu.app 5 | Monu.zip -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.12' 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Max Ogden and contributors 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /about.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 7 | 8 |

About Monu

9 |
10 |
11 |
What is Monu
12 |

Monu is an open source process monitoring application for Mac OS. You can configure Monu to launch programs, and when Monu starts up it will start them. Additionally, it will monitor the processes and restart them if they crash.

13 |
How to use Monu
14 |

To configure Monu, click 'Open Config Folder' and open 'config.json' in a text editor. When you save and return to Monu your new configuration will be automatically loaded.

15 |

Be sure your JSON syntax is valid when editing the configuration. Here are supported options. These should be added as top level key/value pairs to 'config.json':

16 | 26 |
Adding Processes
27 |

In the 'config.json' file add processes to the 'processes' key. The key must be a name (lowercase letters and hypens) and the value must be the launch command. For example:

28 |

{
29 |   "logs": "./logs",
30 |   "pids": "./pids",
31 |   "processes": {
32 |     "web-1": "http-server . -p 8081",
33 |     "web-2": "http-server . -p 8082",
34 |     "web-3": "http-server . -p 8083"
35 |   }
36 | }
37 |
Launch on Startup
38 |

When you open Monu.app, it will start all configured processes.

39 |

If you would like Monu.app to start when your Mac starts up, got to System Preferences > Users and Groups and add Monu.app to Login Items for your User.

40 |
About
41 |

Monu is a portmanteau of 'monitor' and 'menu'. It has two C/C++ dependencies, Electron and the Mon process monitor.

42 |

If you find bugs, want to send pull requests, or want the source code visit https://github.com/maxogden/monu

43 |
44 | -------------------------------------------------------------------------------- /app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/app.png -------------------------------------------------------------------------------- /collaborators.md: -------------------------------------------------------------------------------- 1 | ## Collaborators 2 | 3 | monu is only possible due to the excellent work of the following collaborators: 4 | 5 | 6 | 7 | 8 | 9 | 10 |
maxogdenGitHub/maxogden
mafintoshGitHub/mafintosh
marcbachmannGitHub/marcbachmann
karissaGitHub/karissa
remixzGitHub/remixz
11 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "logs": "./logs", 3 | "pids": "./pids", 4 | "processes": { 5 | 6 | } 7 | } -------------------------------------------------------------------------------- /configure.js: -------------------------------------------------------------------------------- 1 | var Ractive = require('ractive') 2 | var page = require('page') 3 | var fs = require('fs') 4 | var Client = require('electron-rpc/client') 5 | var client = new Client() 6 | 7 | Ractive.DEBUG = false 8 | 9 | // Throw unhandled javascript errors 10 | window.onerror = function errorHandler (message, url, lineNumber) { 11 | message = message + '\n' + url + ':' + lineNumber 12 | throwError(message) 13 | } 14 | 15 | var templates = { 16 | configure: fs.readFileSync(__dirname + '/configure.tmpl').toString(), 17 | detail: fs.readFileSync(__dirname + '/detail.tmpl').toString(), 18 | about: fs.readFileSync(__dirname + '/about.html').toString() 19 | } 20 | 21 | var state = {} 22 | 23 | var events = { 24 | processAction: function (e) { 25 | var action = e.node.attributes['data-action'].value 26 | var procNameAttr = e.node.attributes['data-name'] 27 | var data = {task: action} 28 | if (procNameAttr) data.name = procNameAttr.value 29 | execTask(data) 30 | }, 31 | 32 | quit: function () { 33 | client.request('terminate') 34 | }, 35 | 36 | openDir: function () { 37 | client.request('open-dir') 38 | }, 39 | 40 | openKillMenu: function (e) { 41 | var remote = require('remote') 42 | var Menu = remote.require('menu') 43 | var MenuItem = remote.require('menu-item') 44 | 45 | function sendSignal (signal) { 46 | return function () { 47 | var procNameAttr = e.node.attributes['data-name'] 48 | execTask({task: 'stop', name: procNameAttr.value, signal: signal}) 49 | } 50 | } 51 | 52 | var menu = new Menu() 53 | ;['SIGTERM', 'SIGHUP', 'SIGINT', 'SIGKILL', 'SIGQUIT'].forEach(function (signal) { 54 | menu.append(new MenuItem({ label: 'Send ' + signal, click: sendSignal(signal) })) 55 | }) 56 | 57 | menu.popup(remote.getCurrentWindow()) 58 | return false 59 | }, 60 | 61 | openLogsDir: function (e) { 62 | client.request('open-logs-dir', {name: e.context.name}) 63 | } 64 | } 65 | 66 | var routes = { 67 | configure: function configure (ctx, next) { 68 | ctx.template = templates.configure 69 | state.configure = render(ctx, {loading: true}) 70 | getAndRenderAll(next) 71 | }, 72 | detail: function detail (ctx, next) { 73 | ctx.template = templates.detail 74 | state.detail = render(ctx, {loading: true}) 75 | getAndRender(ctx.params.name, next) 76 | }, 77 | about: function about (ctx, next) { 78 | ctx.template = templates.about 79 | state.about = render(ctx, {}) 80 | } 81 | } 82 | 83 | // set up routes 84 | page('/', routes.configure) 85 | page('/detail/:name', routes.detail) 86 | page('/about', routes.about) 87 | 88 | // initialize router 89 | page.start() 90 | page('/') 91 | 92 | // Load all statuses when the app gets focused 93 | client.on('show', function () { 94 | getAndRenderAll() 95 | var currentProcess = state.detail && state.detail.get('name') 96 | if (currentProcess) getAndRender(currentProcess) 97 | }) 98 | 99 | function execTask (task) { 100 | client.request('task', task, function (err, data) { 101 | if (err) return throwError(err) 102 | if (!data) return 103 | 104 | if (Array.isArray(data)) { 105 | renderAll(data) 106 | } else if (data.name) { 107 | state.detail.set(data) 108 | } 109 | }) 110 | } 111 | 112 | function render (ctx) { 113 | var ract = new Ractive({ 114 | el: '#container', 115 | template: ctx.template, 116 | data: ctx.data 117 | }) 118 | 119 | ract.on(events) 120 | return ract 121 | } 122 | 123 | function getAndRenderAll (callback) { 124 | callback = catchErrors(callback || function () {}) 125 | client.request('get-all', function (err, data) { 126 | if (err) return callback(err) 127 | renderAll(data) 128 | callback() 129 | }) 130 | } 131 | 132 | function renderAll (data) { 133 | data = data || [] 134 | var obj = {items: data, hasProcesses: data.length > 0} 135 | state.configure.set(obj) 136 | } 137 | 138 | function getAndRender (name, callback) { 139 | callback = catchErrors(callback || function () {}) 140 | client.request('get-one', {name: name}, function (err, data) { 141 | if (err) return callback(err) 142 | state.detail.set(data) 143 | callback() 144 | }) 145 | } 146 | 147 | function catchErrors (callback) { 148 | return function throwErrorsOrContinue (err) { 149 | if (err) return throwError(err) 150 | callback() 151 | } 152 | } 153 | 154 | function throwError (error) { 155 | var message = error.stack || error.message || JSON.stringify(error) 156 | console.error(message) 157 | window.alert(message) 158 | } 159 | -------------------------------------------------------------------------------- /configure.tmpl: -------------------------------------------------------------------------------- 1 |
2 | 53 |
54 | 62 | -------------------------------------------------------------------------------- /css/ratchet-theme-android.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Ratchet v2.0.2 (http://goratchet.com) 4 | * Copyright 2014 Connor Sears 5 | * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE) 6 | * 7 | * v2.0.2 designed by @connors. 8 | * ===================================================== 9 | */ 10 | 11 | body { 12 | font-family: "Roboto", sans-serif; 13 | font-size: 18px; 14 | line-height: 22px; 15 | color: #222; 16 | } 17 | 18 | a { 19 | color: #33b5e5; 20 | } 21 | a:active { 22 | color: #1a9bcb; 23 | } 24 | 25 | .content { 26 | background-color: #f2f2f2; 27 | } 28 | 29 | .bar-nav ~ .content { 30 | padding-top: 50px; 31 | } 32 | 33 | .bar-header-secondary ~ .content { 34 | padding-top: 100px; 35 | } 36 | 37 | .bar-tab ~ .content { 38 | padding-top: 50px; 39 | padding-bottom: 0; 40 | } 41 | 42 | .bar-footer ~ .content { 43 | padding-bottom: 50px; 44 | } 45 | 46 | .bar-footer-secondary ~ .content { 47 | padding-bottom: 100px; 48 | } 49 | 50 | .btn { 51 | padding: 8px 15px; 52 | font-size: 14px; 53 | color: #222; 54 | background-color: #cecece; 55 | border: 0; 56 | border-radius: 2px; 57 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 1px rgba(0, 0, 0, .25); 58 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 1px rgba(0, 0, 0, .25); 59 | } 60 | .btn:active, .btn.active { 61 | color: #222; 62 | background-color: #999; 63 | border: 0; 64 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .2); 65 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .2); 66 | } 67 | 68 | .btn-primary { 69 | color: #fff; 70 | background-color: #33b5e5; 71 | border: 0; 72 | } 73 | .btn-primary:active, .btn-primary.active { 74 | color: #fff; 75 | background-color: #1a9bcb; 76 | border: 0; 77 | } 78 | 79 | .btn-positive { 80 | color: #fff; 81 | background-color: #9c0; 82 | border: 0; 83 | } 84 | .btn-positive:active, .btn-positive.active { 85 | color: #fff; 86 | background-color: #739900; 87 | border: 0; 88 | } 89 | 90 | .btn-negative { 91 | color: #fff; 92 | background-color: #f44; 93 | border: 0; 94 | } 95 | .btn-negative:active, .btn-negative.active { 96 | color: #fff; 97 | background-color: #f11; 98 | border: 0; 99 | } 100 | 101 | .btn-outlined { 102 | background-color: transparent; 103 | border: 1px solid #999; 104 | -webkit-box-shadow: none; 105 | box-shadow: none; 106 | } 107 | .btn-outlined.btn-primary { 108 | color: #33b5e5; 109 | border: 1px solid #33b5e5; 110 | } 111 | .btn-outlined.btn-primary:active { 112 | background-color: #33b5e5; 113 | border: 1px solid #33b5e5; 114 | } 115 | .btn-outlined.btn-positive { 116 | color: #9c0; 117 | border: 1px solid #9c0; 118 | } 119 | .btn-outlined.btn-positive:active { 120 | background-color: #9c0; 121 | border: 1px solid #9c0; 122 | } 123 | .btn-outlined.btn-negative { 124 | color: #f44; 125 | border: 1px solid #f44; 126 | } 127 | .btn-outlined.btn-negative:active { 128 | background-color: #f44; 129 | border: 1px solid #f44; 130 | } 131 | .btn-outlined:active { 132 | background-color: #999; 133 | border: 1px solid #999; 134 | -webkit-box-shadow: none; 135 | box-shadow: none; 136 | } 137 | .btn-outlined.btn-primary:active, .btn-outlined.btn-positive:active, .btn-outlined.btn-negative:active { 138 | color: #fff; 139 | -webkit-box-shadow: none; 140 | box-shadow: none; 141 | } 142 | 143 | .btn-link { 144 | color: #33b5e5; 145 | background-color: transparent; 146 | border: none; 147 | -webkit-box-shadow: none; 148 | box-shadow: none; 149 | } 150 | .btn-link:active, .btn-link.active { 151 | color: #1a9bcb; 152 | background-color: transparent; 153 | -webkit-box-shadow: none; 154 | box-shadow: none; 155 | } 156 | 157 | .btn-block { 158 | padding: 15px 0; 159 | font-size: 18px; 160 | } 161 | 162 | .btn .badge { 163 | background-color: rgba(0, 0, 0, .15); 164 | } 165 | .btn .badge.badge-inverted { 166 | background-color: transparent; 167 | } 168 | .btn:active .badge { 169 | color: #fff; 170 | } 171 | 172 | .bar { 173 | height: 50px; 174 | background-color: #ddd; 175 | border-bottom: 1px solid #b1b1b1; 176 | -webkit-box-shadow: inset 0 -2px 0 #d2d2d2, 0 3px 3px rgba(0, 0, 0, .07); 177 | box-shadow: inset 0 -2px 0 #d2d2d2, 0 3px 3px rgba(0, 0, 0, .07); 178 | } 179 | .bar.bar-header-secondary { 180 | top: 50px; 181 | } 182 | .bar.bar-footer-secondary { 183 | bottom: 50px; 184 | } 185 | .bar.bar-footer-secondary-tab { 186 | bottom: 50px; 187 | } 188 | .bar .bar-footer, 189 | .bar .bar-footer-secondary, 190 | .bar .bar-footer-secondary-tab { 191 | border-top: 1px solid #b1b1b1; 192 | border-bottom: 0; 193 | -webkit-box-shadow: inset 0 -2px 0 #33b5e5; 194 | box-shadow: inset 0 -2px 0 #33b5e5; 195 | } 196 | 197 | .bar-tab { 198 | top: 0; 199 | bottom: auto; 200 | height: 50px; 201 | border-top: 0; 202 | } 203 | .bar-tab .tab-item { 204 | color: #929292; 205 | } 206 | .bar-tab .tab-item.active { 207 | color: #33b5e5; 208 | -webkit-box-shadow: inset 0 -2px 0 #33b5e5; 209 | box-shadow: inset 0 -2px 0 #33b5e5; 210 | } 211 | .bar-tab .tab-item:active { 212 | color: #929292; 213 | background-color: #78c6e3; 214 | } 215 | .bar-tab .tab-item .icon { 216 | top: 3px; 217 | padding-top: 0; 218 | padding-bottom: 0; 219 | } 220 | 221 | .title { 222 | position: static; 223 | padding-left: 15px; 224 | font-size: 18px; 225 | line-height: 49px; 226 | text-align: left; 227 | } 228 | 229 | .bar .btn { 230 | top: 7px; 231 | padding-top: 10px; 232 | padding-bottom: 10px; 233 | } 234 | .bar .btn-link { 235 | top: 0; 236 | padding: 0; 237 | font-size: 18px; 238 | line-height: 49px; 239 | color: #33b5e5; 240 | } 241 | .bar .btn-link:active, .bar .btn-link.active { 242 | color: #1a9bcb; 243 | } 244 | .bar .btn-link .icon { 245 | top: 2px; 246 | padding: 0; 247 | } 248 | .bar .btn-block { 249 | top: 4px; 250 | } 251 | 252 | .bar .segmented-control { 253 | top: 7px; 254 | } 255 | 256 | .bar .icon { 257 | padding-top: 13px; 258 | padding-bottom: 13px; 259 | } 260 | .bar .title .icon { 261 | padding: 0; 262 | } 263 | .bar .title .icon.icon-caret { 264 | top: 10px; 265 | color: #777; 266 | } 267 | 268 | .bar input[type="search"] { 269 | height: 35px; 270 | } 271 | 272 | .badge.badge-inverted { 273 | color: #999; 274 | background-color: transparent; 275 | } 276 | 277 | .badge-primary { 278 | color: #fff; 279 | background-color: #33b5e5; 280 | } 281 | .badge-primary.badge-inverted { 282 | color: #33b5e5; 283 | background-color: transparent; 284 | } 285 | 286 | .badge-positive { 287 | color: #fff; 288 | background-color: #9c0; 289 | } 290 | .badge-positive.badge-inverted { 291 | color: #9c0; 292 | background-color: transparent; 293 | } 294 | 295 | .badge-negative { 296 | color: #fff; 297 | background-color: #f44; 298 | } 299 | .badge-negative.badge-inverted { 300 | color: #f44; 301 | background-color: transparent; 302 | } 303 | 304 | .card { 305 | background-color: transparent; 306 | border-color: #d9d9d9; 307 | border-radius: 2px; 308 | } 309 | 310 | .table-view { 311 | background-color: transparent; 312 | } 313 | .table-view .table-view-cell { 314 | border-bottom: 1px solid #d9d9d9; 315 | } 316 | .table-view .table-view-cell:last-child { 317 | background-image: none; 318 | } 319 | .table-view .table-view-cell > a:not(.btn):active { 320 | color: inherit; 321 | background-color: #e0e0e0; 322 | } 323 | .table-view .table-view-cell > a:not(.btn):active .icon { 324 | color: #fff; 325 | } 326 | .table-view .table-view-divider { 327 | padding-top: 25px; 328 | font-size: 12px; 329 | font-weight: bold; 330 | text-transform: uppercase; 331 | background-color: transparent; 332 | border-top: 0; 333 | border-bottom: 2px solid #a9a9a9; 334 | } 335 | 336 | .table-view-cell .navigate-left > .btn, 337 | .table-view-cell .navigate-left > .badge, 338 | .table-view-cell .navigate-left > .toggle, 339 | .table-view-cell .navigate-right > .btn, 340 | .table-view-cell .navigate-right > .badge, 341 | .table-view-cell .navigate-right > .toggle, 342 | .table-view-cell .push-left > .btn, 343 | .table-view-cell .push-left > .badge, 344 | .table-view-cell .push-left > .toggle, 345 | .table-view-cell .push-right > .btn, 346 | .table-view-cell .push-right > .badge, 347 | .table-view-cell .push-right > .toggle, 348 | .table-view-cell > a .navigate-left > .btn, 349 | .table-view-cell > a .navigate-left > .badge, 350 | .table-view-cell > a .navigate-left > .toggle, 351 | .table-view-cell > a .navigate-right > .btn, 352 | .table-view-cell > a .navigate-right > .badge, 353 | .table-view-cell > a .navigate-right > .toggle, 354 | .table-view-cell > a .push-left > .btn, 355 | .table-view-cell > a .push-left > .badge, 356 | .table-view-cell > a .push-left > .toggle, 357 | .table-view-cell > a .push-right > .btn, 358 | .table-view-cell > a .push-right > .badge, 359 | .table-view-cell > a .push-right > .toggle { 360 | right: 15px; 361 | } 362 | 363 | select, 364 | textarea, 365 | input[type="text"], 366 | input[type="search"], 367 | input[type="password"], 368 | input[type="datetime"], 369 | input[type="datetime-local"], 370 | input[type="date"], 371 | input[type="month"], 372 | input[type="time"], 373 | input[type="week"], 374 | input[type="number"], 375 | input[type="email"], 376 | input[type="url"], 377 | input[type="tel"], 378 | input[type="color"], 379 | .input-group { 380 | height: 40px; 381 | padding: 10px 15px; 382 | border: 1px solid rgba(0, 0, 0, .2); 383 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .1); 384 | box-shadow: 0 1px 1px rgba(0, 0, 0, .1); 385 | } 386 | 387 | input[type="search"] { 388 | border-radius: 2px; 389 | } 390 | 391 | select, 392 | textarea, 393 | .input-group { 394 | height: auto; 395 | } 396 | 397 | .input-group { 398 | padding: 0; 399 | border: 0; 400 | } 401 | 402 | .input-group input { 403 | border: 0; 404 | border-bottom: 1px solid #d9d9d9; 405 | -webkit-box-shadow: none; 406 | box-shadow: none; 407 | } 408 | 409 | .input-group input:last-child { 410 | background-image: none; 411 | } 412 | 413 | .input-row { 414 | height: 40px; 415 | border-bottom: 1px solid #d9d9d9; 416 | } 417 | 418 | .input-row label { 419 | padding-top: 10px; 420 | padding-bottom: 10px; 421 | } 422 | 423 | .input-row label + input { 424 | background-image: none; 425 | border-bottom: 0; 426 | } 427 | 428 | .segmented-control { 429 | font-size: 14px; 430 | background-color: #cecece; 431 | border: 0; 432 | border-radius: 2px; 433 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .25); 434 | box-shadow: 0 1px 1px rgba(0, 0, 0, .25); 435 | } 436 | .segmented-control .control-item { 437 | padding-top: 10px; 438 | padding-bottom: 10px; 439 | color: #222; 440 | border-left: 1px solid #999; 441 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .2); 442 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .2), inset 0 1px 0 rgba(255, 255, 255, .2); 443 | } 444 | .segmented-control .control-item:first-child { 445 | border-left-width: 0; 446 | } 447 | .segmented-control .control-item:active, .segmented-control .control-item.active { 448 | background-color: #999; 449 | } 450 | 451 | .segmented-control-primary { 452 | border: 0; 453 | } 454 | .segmented-control-primary .control-item { 455 | color: #fff; 456 | border-color: inherit; 457 | } 458 | .segmented-control-primary .control-item:active, .segmented-control-primary .control-item.active { 459 | color: #fff; 460 | background-color: #33b5e5; 461 | } 462 | 463 | .segmented-control-positive { 464 | border: 0; 465 | } 466 | .segmented-control-positive .control-item { 467 | color: #fff; 468 | border-color: inherit; 469 | } 470 | .segmented-control-positive .control-item:active, .segmented-control-positive .control-item.active { 471 | color: #fff; 472 | background-color: #9c0; 473 | } 474 | 475 | .segmented-control-negative { 476 | border: 0; 477 | } 478 | .segmented-control-negative .control-item { 479 | color: #fff; 480 | border-color: inherit; 481 | } 482 | .segmented-control-negative .control-item:active, .segmented-control-negative .control-item.active { 483 | color: #fff; 484 | background-color: #f44; 485 | } 486 | 487 | .popover { 488 | top: 47px; 489 | left: 15px; 490 | width: 200px; 491 | margin-left: 0; 492 | border: 1px solid #9b9b9b; 493 | border-radius: 0; 494 | -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .2); 495 | box-shadow: 0 0 3px rgba(0, 0, 0, .2); 496 | -webkit-transition: -webkit-transform .1s ease-in-out, opacity .2s ease-in-out; 497 | -moz-transition: -moz-transform .1s ease-in-out, opacity .2s ease-in-out; 498 | transition: transform .1s ease-in-out, opacity .2s ease-in-out; 499 | -webkit-transform: scale(.75); 500 | -ms-transform: scale(.75); 501 | transform: scale(.75); 502 | } 503 | .popover:before { 504 | display: none; 505 | } 506 | .popover.visible { 507 | -webkit-transform: scale(1); 508 | -ms-transform: scale(1); 509 | transform: scale(1); 510 | } 511 | 512 | .backdrop { 513 | background-color: transparent; 514 | } 515 | 516 | .popover .bar { 517 | border-radius: 0; 518 | } 519 | .popover .bar-nav ~ .table-view { 520 | padding-top: 50px; 521 | } 522 | 523 | .popover .table-view { 524 | border-radius: 12px; 525 | } 526 | 527 | .toggle { 528 | width: 104px; 529 | height: 28px; 530 | background-color: #d7d7d7; 531 | border: 2px solid #d7d7d7; 532 | border-radius: 0; 533 | } 534 | .toggle .toggle-handle { 535 | top: 0; 536 | left: 0; 537 | width: 50px; 538 | height: 24px; 539 | background-color: #bebebe; 540 | border: 1px solid #b5b5b5; 541 | border-radius: 2px; 542 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .3), inset 0 -1px 0 rgba(0, 0, 0, .1); 543 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .3), inset 0 -1px 0 rgba(0, 0, 0, .1); 544 | } 545 | .toggle:before { 546 | top: 1px; 547 | right: auto; 548 | left: 11px; 549 | z-index: 3; 550 | color: #fff; 551 | } 552 | .toggle.active { 553 | background-color: #d7d7d7; 554 | border: 2px solid #d7d7d7; 555 | } 556 | .toggle.active .toggle-handle { 557 | margin-right: 2px; 558 | background-color: #33b5e5; 559 | border-color: #33b5e5; 560 | -webkit-transform: translate3d(50px, 0, 0); 561 | -ms-transform: translate3d(50px, 0, 0); 562 | transform: translate3d(50px, 0, 0); 563 | } 564 | .toggle.active:before { 565 | right: 14px; 566 | left: auto; 567 | color: #fff; 568 | } 569 | 570 | .navigate-left:after, 571 | .push-left:after { 572 | content: ''; 573 | } 574 | 575 | .navigate-right:after, 576 | .push-right:after { 577 | content: ''; 578 | } 579 | 580 | .icon-caret:before { 581 | content: '\e800'; 582 | } 583 | 584 | .icon-down:before, 585 | .icon-down-nav:before { 586 | content: '\e801'; 587 | } 588 | 589 | .icon-download:before { 590 | content: '\e802'; 591 | } 592 | 593 | .icon-left:before, 594 | .icon-left-nav:before { 595 | content: '\e803'; 596 | } 597 | 598 | .icon-more-vertical:before { 599 | content: '\e804'; 600 | } 601 | 602 | .icon-more:before { 603 | content: '\e805'; 604 | } 605 | 606 | .icon-right:before, 607 | .icon-right-nav:before { 608 | content: '\e806'; 609 | } 610 | 611 | .icon-search:before { 612 | content: '\e807'; 613 | } 614 | 615 | .icon-share:before { 616 | content: '\e808'; 617 | } 618 | 619 | .icon-up:before, 620 | .icon-up-nav:before { 621 | content: '\e809'; 622 | } 623 | -------------------------------------------------------------------------------- /css/ratchet-theme-android.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Ratchet v2.0.2 (http://goratchet.com) 4 | * Copyright 2014 Connor Sears 5 | * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE) 6 | * 7 | * v2.0.2 designed by @connors. 8 | * ===================================================== 9 | */body{font-family:Roboto,sans-serif;font-size:18px;line-height:22px;color:#222}a{color:#33b5e5}a:active{color:#1a9bcb}.content{background-color:#f2f2f2}.bar-nav~.content{padding-top:50px}.bar-header-secondary~.content{padding-top:100px}.bar-tab~.content{padding-top:50px;padding-bottom:0}.bar-footer~.content{padding-bottom:50px}.bar-footer-secondary~.content{padding-bottom:100px}.btn{padding:8px 15px;font-size:14px;color:#222;background-color:#cecece;border:0;border-radius:2px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.2),0 1px 1px rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.2),0 1px 1px rgba(0,0,0,.25)}.btn.active,.btn:active{color:#222;background-color:#999;border:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.2);box-shadow:inset 0 -1px 0 rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.2)}.btn-primary{color:#fff;background-color:#33b5e5;border:0}.btn-primary.active,.btn-primary:active{color:#fff;background-color:#1a9bcb;border:0}.btn-positive{color:#fff;background-color:#9c0;border:0}.btn-positive.active,.btn-positive:active{color:#fff;background-color:#739900;border:0}.btn-negative{color:#fff;background-color:#f44;border:0}.btn-negative.active,.btn-negative:active{color:#fff;background-color:#f11;border:0}.btn-outlined{background-color:transparent;border:1px solid #999;-webkit-box-shadow:none;box-shadow:none}.btn-outlined.btn-primary{color:#33b5e5;border:1px solid #33b5e5}.btn-outlined.btn-primary:active{background-color:#33b5e5;border:1px solid #33b5e5}.btn-outlined.btn-positive{color:#9c0;border:1px solid #9c0}.btn-outlined.btn-positive:active{background-color:#9c0;border:1px solid #9c0}.btn-outlined.btn-negative{color:#f44;border:1px solid #f44}.btn-outlined.btn-negative:active{background-color:#f44;border:1px solid #f44}.btn-outlined:active{background-color:#999;border:1px solid #999;-webkit-box-shadow:none;box-shadow:none}.btn-outlined.btn-negative:active,.btn-outlined.btn-positive:active,.btn-outlined.btn-primary:active{color:#fff;-webkit-box-shadow:none;box-shadow:none}.btn-link{color:#33b5e5;background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none}.btn-link.active,.btn-link:active{color:#1a9bcb;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-block{padding:15px 0;font-size:18px}.btn .badge{background-color:rgba(0,0,0,.15)}.btn .badge.badge-inverted{background-color:transparent}.btn:active .badge{color:#fff}.bar{height:50px;background-color:#ddd;border-bottom:1px solid #b1b1b1;-webkit-box-shadow:inset 0 -2px 0 #d2d2d2,0 3px 3px rgba(0,0,0,.07);box-shadow:inset 0 -2px 0 #d2d2d2,0 3px 3px rgba(0,0,0,.07)}.bar.bar-header-secondary{top:50px}.bar.bar-footer-secondary,.bar.bar-footer-secondary-tab{bottom:50px}.bar .bar-footer,.bar .bar-footer-secondary,.bar .bar-footer-secondary-tab{border-top:1px solid #b1b1b1;border-bottom:0;-webkit-box-shadow:inset 0 -2px 0 #33b5e5;box-shadow:inset 0 -2px 0 #33b5e5}.bar-tab{top:0;bottom:auto;height:50px;border-top:0}.bar-tab .tab-item{color:#929292}.bar-tab .tab-item.active{color:#33b5e5;-webkit-box-shadow:inset 0 -2px 0 #33b5e5;box-shadow:inset 0 -2px 0 #33b5e5}.bar-tab .tab-item:active{color:#929292;background-color:#78c6e3}.bar-tab .tab-item .icon{top:3px;padding-top:0;padding-bottom:0}.title{position:static;padding-left:15px;font-size:18px;line-height:49px;text-align:left}.bar .btn{top:7px;padding-top:10px;padding-bottom:10px}.bar .btn-link{top:0;padding:0;font-size:18px;line-height:49px;color:#33b5e5}.bar .btn-link.active,.bar .btn-link:active{color:#1a9bcb}.bar .btn-link .icon{top:2px;padding:0}.bar .btn-block{top:4px}.bar .segmented-control{top:7px}.bar .icon{padding-top:13px;padding-bottom:13px}.bar .title .icon{padding:0}.bar .title .icon.icon-caret{top:10px;color:#777}.bar input[type=search]{height:35px}.badge.badge-inverted{color:#999;background-color:transparent}.badge-primary{color:#fff;background-color:#33b5e5}.badge-primary.badge-inverted{color:#33b5e5;background-color:transparent}.badge-positive{color:#fff;background-color:#9c0}.badge-positive.badge-inverted{color:#9c0;background-color:transparent}.badge-negative{color:#fff;background-color:#f44}.badge-negative.badge-inverted{color:#f44;background-color:transparent}.card{background-color:transparent;border-color:#d9d9d9;border-radius:2px}.table-view{background-color:transparent}.table-view .table-view-cell{border-bottom:1px solid #d9d9d9}.table-view .table-view-cell:last-child{background-image:none}.table-view .table-view-cell>a:not(.btn):active{color:inherit;background-color:#e0e0e0}.table-view .table-view-cell>a:not(.btn):active .icon{color:#fff}.table-view .table-view-divider{padding-top:25px;font-size:12px;font-weight:700;text-transform:uppercase;background-color:transparent;border-top:0;border-bottom:2px solid #a9a9a9}.table-view-cell .navigate-left>.badge,.table-view-cell .navigate-left>.btn,.table-view-cell .navigate-left>.toggle,.table-view-cell .navigate-right>.badge,.table-view-cell .navigate-right>.btn,.table-view-cell .navigate-right>.toggle,.table-view-cell .push-left>.badge,.table-view-cell .push-left>.btn,.table-view-cell .push-left>.toggle,.table-view-cell .push-right>.badge,.table-view-cell .push-right>.btn,.table-view-cell .push-right>.toggle,.table-view-cell>a .navigate-left>.badge,.table-view-cell>a .navigate-left>.btn,.table-view-cell>a .navigate-left>.toggle,.table-view-cell>a .navigate-right>.badge,.table-view-cell>a .navigate-right>.btn,.table-view-cell>a .navigate-right>.toggle,.table-view-cell>a .push-left>.badge,.table-view-cell>a .push-left>.btn,.table-view-cell>a .push-left>.toggle,.table-view-cell>a .push-right>.badge,.table-view-cell>a .push-right>.btn,.table-view-cell>a .push-right>.toggle{right:15px}.input-group,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{height:40px;padding:10px 15px;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}input[type=search]{border-radius:2px}.input-group,select,textarea{height:auto}.input-group{padding:0;border:0}.input-group input{border:0;border-bottom:1px solid #d9d9d9;-webkit-box-shadow:none;box-shadow:none}.input-group input:last-child{background-image:none}.input-row{height:40px;border-bottom:1px solid #d9d9d9}.input-row label{padding-top:10px;padding-bottom:10px}.input-row label+input{background-image:none;border-bottom:0}.segmented-control{font-size:14px;background-color:#cecece;border:0;border-radius:2px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.25);box-shadow:0 1px 1px rgba(0,0,0,.25)}.segmented-control .control-item{padding-top:10px;padding-bottom:10px;color:#222;border-left:1px solid #999;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.2);box-shadow:inset 0 -1px 0 rgba(0,0,0,.2),inset 0 1px 0 rgba(255,255,255,.2)}.segmented-control .control-item:first-child{border-left-width:0}.segmented-control .control-item.active,.segmented-control .control-item:active{background-color:#999}.segmented-control-primary{border:0}.segmented-control-primary .control-item{color:#fff;border-color:inherit}.segmented-control-primary .control-item.active,.segmented-control-primary .control-item:active{color:#fff;background-color:#33b5e5}.segmented-control-positive{border:0}.segmented-control-positive .control-item{color:#fff;border-color:inherit}.segmented-control-positive .control-item.active,.segmented-control-positive .control-item:active{color:#fff;background-color:#9c0}.segmented-control-negative{border:0}.segmented-control-negative .control-item{color:#fff;border-color:inherit}.segmented-control-negative .control-item.active,.segmented-control-negative .control-item:active{color:#fff;background-color:#f44}.popover{top:47px;left:15px;width:200px;margin-left:0;border:1px solid #9b9b9b;border-radius:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,.2);box-shadow:0 0 3px rgba(0,0,0,.2);-webkit-transition:-webkit-transform .1s ease-in-out,opacity .2s ease-in-out;-moz-transition:-moz-transform .1s ease-in-out,opacity .2s ease-in-out;transition:transform .1s ease-in-out,opacity .2s ease-in-out;-webkit-transform:scale(.75);-ms-transform:scale(.75);transform:scale(.75)}.popover:before{display:none}.popover.visible{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.backdrop{background-color:transparent}.popover .bar{border-radius:0}.popover .bar-nav~.table-view{padding-top:50px}.popover .table-view{border-radius:12px}.toggle{width:104px;height:28px;background-color:#d7d7d7;border:2px solid #d7d7d7;border-radius:0}.toggle .toggle-handle{top:0;left:0;width:50px;height:24px;background-color:#bebebe;border:1px solid #b5b5b5;border-radius:2px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.3),inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.3),inset 0 -1px 0 rgba(0,0,0,.1)}.toggle:before{top:1px;right:auto;left:11px;z-index:3;color:#fff}.toggle.active{background-color:#d7d7d7;border:2px solid #d7d7d7}.toggle.active .toggle-handle{margin-right:2px;background-color:#33b5e5;border-color:#33b5e5;-webkit-transform:translate3d(50px,0,0);-ms-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.toggle.active:before{right:14px;left:auto;color:#fff}.navigate-left:after,.navigate-right:after,.push-left:after,.push-right:after{content:''}.icon-caret:before{content:'\e800'}.icon-down-nav:before,.icon-down:before{content:'\e801'}.icon-download:before{content:'\e802'}.icon-left-nav:before,.icon-left:before{content:'\e803'}.icon-more-vertical:before{content:'\e804'}.icon-more:before{content:'\e805'}.icon-right-nav:before,.icon-right:before{content:'\e806'}.icon-search:before{content:'\e807'}.icon-share:before{content:'\e808'}.icon-up-nav:before,.icon-up:before{content:'\e809'} -------------------------------------------------------------------------------- /css/ratchet-theme-ios.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Ratchet v2.0.2 (http://goratchet.com) 4 | * Copyright 2014 Connor Sears 5 | * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE) 6 | * 7 | * v2.0.2 designed by @connors. 8 | * ===================================================== 9 | */ 10 | 11 | a { 12 | color: #007aff; 13 | } 14 | a:active { 15 | color: #0062cc; 16 | } 17 | 18 | .content { 19 | background-color: #efeff4; 20 | } 21 | 22 | .h5, h5, 23 | .h6, h6, 24 | p { 25 | color: #8f8f94; 26 | } 27 | 28 | .h5, h5, 29 | .h6, h6 { 30 | font-weight: normal; 31 | text-transform: uppercase; 32 | } 33 | 34 | .btn { 35 | color: #929292; 36 | background-color: rgba(247, 247, 247, .98); 37 | border: 1px solid #929292; 38 | -webkit-transition: all; 39 | -moz-transition: all; 40 | transition: all; 41 | -webkit-transition-timing-function: linear; 42 | -moz-transition-timing-function: linear; 43 | transition-timing-function: linear; 44 | -webkit-transition-duration: .2s; 45 | -moz-transition-duration: .2s; 46 | transition-duration: .2s; 47 | } 48 | .btn:active, .btn.active { 49 | color: #fff; 50 | background-color: #929292; 51 | } 52 | 53 | .btn-primary { 54 | color: #fff; 55 | background-color: #007aff; 56 | border: 1px solid #007aff; 57 | } 58 | .btn-primary:active, .btn-primary.active { 59 | background-color: #0062cc; 60 | border: 1px solid #0062cc; 61 | } 62 | 63 | .btn-positive { 64 | color: #fff; 65 | background-color: #4cd964; 66 | border: 1px solid #4cd964; 67 | } 68 | .btn-positive:active, .btn-positive.active { 69 | background-color: #2ac845; 70 | border: 1px solid #2ac845; 71 | } 72 | 73 | .btn-negative { 74 | color: #fff; 75 | background-color: #dd524d; 76 | border: 1px solid #dd524d; 77 | } 78 | .btn-negative:active, .btn-negative.active { 79 | background-color: #cf2d28; 80 | border: 1px solid #cf2d28; 81 | } 82 | 83 | .btn-outlined { 84 | background-color: transparent; 85 | } 86 | .btn-outlined.btn-primary { 87 | color: #007aff; 88 | } 89 | .btn-outlined.btn-positive { 90 | color: #4cd964; 91 | } 92 | .btn-outlined.btn-negative { 93 | color: #dd524d; 94 | } 95 | .btn-outlined.btn-primary:active, .btn-outlined.btn-positive:active, .btn-outlined.btn-negative:active { 96 | color: #fff; 97 | } 98 | 99 | .btn-link { 100 | color: #007aff; 101 | background-color: transparent; 102 | border: none; 103 | } 104 | .btn-link:active, .btn-link.active { 105 | color: #0062cc; 106 | background-color: transparent; 107 | } 108 | 109 | .btn .badge { 110 | background-color: rgba(0, 0, 0, .15); 111 | } 112 | .btn .badge.badge-inverted { 113 | background-color: transparent; 114 | } 115 | .btn:active .badge { 116 | color: #fff; 117 | } 118 | 119 | .bar { 120 | background-color: rgba(247, 247, 247, .98); 121 | border-bottom: 0; 122 | -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, .85); 123 | box-shadow: 0 0 1px rgba(0, 0, 0, .85); 124 | } 125 | .bar.bar-header-secondary { 126 | top: 44px; 127 | } 128 | .bar.bar-footer-secondary { 129 | bottom: 44px; 130 | } 131 | .bar.bar-footer-secondary-tab { 132 | bottom: 50px; 133 | } 134 | .bar.bar-footer, .bar.bar-footer-secondary, .bar.bar-footer-secondary-tab { 135 | border-top: 0; 136 | } 137 | 138 | .bar-tab { 139 | border-top: 0; 140 | } 141 | 142 | .tab-item { 143 | color: #929292; 144 | } 145 | .tab-item.active, .tab-item:active { 146 | color: #007aff; 147 | } 148 | 149 | .bar-nav .btn-link { 150 | color: #007aff; 151 | } 152 | .bar-nav .btn-link:active { 153 | color: #007aff; 154 | opacity: .6; 155 | } 156 | 157 | .badge.badge-inverted { 158 | color: #929292; 159 | background-color: transparent; 160 | } 161 | 162 | .badge-primary { 163 | color: #fff; 164 | background-color: #007aff; 165 | } 166 | .badge-primary.badge-inverted { 167 | color: #007aff; 168 | background-color: transparent; 169 | } 170 | 171 | .badge-positive { 172 | color: #fff; 173 | background-color: #4cd964; 174 | } 175 | .badge-positive.badge-inverted { 176 | color: #4cd964; 177 | background-color: transparent; 178 | } 179 | 180 | .badge-negative { 181 | color: #fff; 182 | background-color: #dd524d; 183 | } 184 | .badge-negative.badge-inverted { 185 | color: #dd524d; 186 | background-color: transparent; 187 | } 188 | 189 | .card .table-view { 190 | background-image: none; 191 | } 192 | 193 | .card .table-view-cell:last-child { 194 | background-image: none; 195 | } 196 | 197 | .table-view { 198 | background-image: url("data:image/svg+xml;utf8,"), url("data:image/svg+xml;utf8,"); 199 | background-repeat: no-repeat; 200 | background-position: 0 100%, 0 0; 201 | border-top: 0; 202 | border-bottom: 0; 203 | } 204 | .table-view .table-view-cell { 205 | background-image: url("data:image/svg+xml;utf8,"); 206 | background-repeat: no-repeat; 207 | background-position: 15px 100%; 208 | border-bottom: 0; 209 | } 210 | .table-view .table-view-cell:last-child { 211 | background-image: none; 212 | } 213 | .table-view .table-view-cell > a:not(.btn):active { 214 | color: inherit; 215 | } 216 | .table-view .table-view-divider { 217 | background-image: url("data:image/svg+xml;utf8,"), url("data:image/svg+xml;utf8,"); 218 | background-repeat: no-repeat; 219 | background-position: 0 100%, 0 0; 220 | border-top: 0; 221 | border-bottom: 0; 222 | } 223 | 224 | select, 225 | textarea, 226 | input[type="text"], 227 | input[type="search"], 228 | input[type="password"], 229 | input[type="datetime"], 230 | input[type="datetime-local"], 231 | input[type="date"], 232 | input[type="month"], 233 | input[type="time"], 234 | input[type="week"], 235 | input[type="number"], 236 | input[type="email"], 237 | input[type="url"], 238 | input[type="tel"], 239 | input[type="color"], 240 | .input-group { 241 | height: 40px; 242 | padding: 10px 15px; 243 | border: 1px solid rgba(0, 0, 0, .2); 244 | } 245 | 246 | input[type="search"] { 247 | height: 34px; 248 | text-align: center; 249 | background-color: rgba(0, 0, 0, .1); 250 | border: 0; 251 | border-radius: 6px; 252 | } 253 | 254 | input[type="search"]:focus { 255 | text-align: left; 256 | } 257 | 258 | select, 259 | textarea, 260 | .input-group { 261 | height: auto; 262 | } 263 | 264 | .input-group { 265 | padding: 0; 266 | background-image: url("data:image/svg+xml;utf8,"), url("data:image/svg+xml;utf8,"); 267 | background-repeat: no-repeat; 268 | background-position: 0 100%, 0 0; 269 | border: 0; 270 | } 271 | 272 | .input-group input { 273 | background-image: url("data:image/svg+xml;utf8,"); 274 | background-repeat: no-repeat; 275 | background-position: 15px 100%; 276 | border: 0; 277 | } 278 | 279 | .input-group input:last-child { 280 | background-image: none; 281 | } 282 | 283 | .input-row { 284 | background-image: url("data:image/svg+xml;utf8,"); 285 | background-repeat: no-repeat; 286 | background-position: 15px 100%; 287 | border-bottom: 0; 288 | } 289 | 290 | .input-row:last-child, 291 | .input-row label + input { 292 | background-image: none; 293 | } 294 | 295 | .segmented-control { 296 | background-color: transparent; 297 | border: 1px solid #929292; 298 | } 299 | .segmented-control .control-item { 300 | color: #929292; 301 | border-color: #929292; 302 | -webkit-transition: background-color .1s linear; 303 | -moz-transition: background-color .1s linear; 304 | transition: background-color .1s linear; 305 | } 306 | .segmented-control .control-item:active { 307 | background-color: #ebebeb; 308 | } 309 | .segmented-control .control-item.active { 310 | color: #fff; 311 | background-color: #929292; 312 | } 313 | 314 | .segmented-control-primary { 315 | border: 1px solid #007aff; 316 | } 317 | .segmented-control-primary .control-item { 318 | color: #007aff; 319 | border-color: inherit; 320 | } 321 | .segmented-control-primary .control-item:active { 322 | background-color: #b3d7ff; 323 | } 324 | .segmented-control-primary .control-item.active { 325 | color: #fff; 326 | background-color: #007aff; 327 | } 328 | 329 | .segmented-control-positive { 330 | border: 1px solid #4cd964; 331 | } 332 | .segmented-control-positive .control-item { 333 | color: #4cd964; 334 | border-color: inherit; 335 | } 336 | .segmented-control-positive .control-item:active { 337 | background-color: #dff8e3; 338 | } 339 | .segmented-control-positive .control-item.active { 340 | color: #fff; 341 | background-color: #4cd964; 342 | } 343 | 344 | .segmented-control-negative { 345 | border: 1px solid #dd524d; 346 | } 347 | .segmented-control-negative .control-item { 348 | color: #dd524d; 349 | border-color: inherit; 350 | } 351 | .segmented-control-negative .control-item:active { 352 | background-color: #fae4e3; 353 | } 354 | .segmented-control-negative .control-item.active { 355 | color: #fff; 356 | background-color: #dd524d; 357 | } 358 | 359 | .popover { 360 | border-radius: 12px; 361 | -webkit-transition: -webkit-transform .2s ease-in-out, opacity .2s ease-in-out; 362 | -moz-transition: -webkit-transform .2s ease-in-out, opacity .2s ease-in-out; 363 | transition: -webkit-transform .2s ease-in-out, opacity .2s ease-in-out; 364 | } 365 | .popover:before { 366 | border-bottom: 15px solid rgba(247, 247, 247, .98); 367 | } 368 | 369 | .popover .bar { 370 | -webkit-box-shadow: none; 371 | box-shadow: none; 372 | } 373 | 374 | .popover .bar-nav { 375 | border-bottom: 1px solid rgba(0, 0, 0, .15); 376 | } 377 | 378 | .popover .table-view { 379 | background-image: none; 380 | border-radius: 12px; 381 | } 382 | 383 | .modal { 384 | -webkit-transition-timing-function: cubic-bezier(.1, .5, .1, 1); 385 | -moz-transition-timing-function: cubic-bezier(.1, .5, .1, 1); 386 | transition-timing-function: cubic-bezier(.1, .5, .1, 1); 387 | } 388 | .modal.active { 389 | -webkit-transition-timing-function: cubic-bezier(.1, .5, .1, 1); 390 | -moz-transition-timing-function: cubic-bezier(.1, .5, .1, 1); 391 | transition-timing-function: cubic-bezier(.1, .5, .1, 1); 392 | } 393 | 394 | .toggle { 395 | width: 47px; 396 | border: 2px solid #e6e6e6; 397 | -webkit-box-shadow: inset 0 0 0 0 #e1e1e1; 398 | box-shadow: inset 0 0 0 0 #e1e1e1; 399 | -webkit-transition-duration: .2s; 400 | -moz-transition-duration: .2s; 401 | transition-duration: .2s; 402 | -webkit-transition-property: box-shadow, border; 403 | -moz-transition-property: box-shadow, border; 404 | transition-property: box-shadow, border; 405 | } 406 | .toggle .toggle-handle { 407 | border: 1px solid rgba(0, 0, 0, .2); 408 | -webkit-box-shadow: 0 3px 3px rgba(0, 0, 0, .08); 409 | box-shadow: 0 3px 3px rgba(0, 0, 0, .08); 410 | -webkit-transition-property: -webkit-transform, border, width; 411 | -moz-transition-property: -moz-transform, border, width; 412 | transition-property: transform, border, width; 413 | } 414 | .toggle:before { 415 | display: none; 416 | } 417 | .toggle.active { 418 | background-color: transparent; 419 | border: 2px solid #4cd964; 420 | -webkit-box-shadow: inset 0 0 0 13px #4cd964; 421 | box-shadow: inset 0 0 0 13px #4cd964; 422 | } 423 | .toggle.active .toggle-handle { 424 | -webkit-transform: translate3d(17px, 0, 0); 425 | -ms-transform: translate3d(17px, 0, 0); 426 | transform: translate3d(17px, 0, 0); 427 | } 428 | .toggle.active .toggle-handle { 429 | border-color: #4cd964; 430 | } 431 | 432 | .content.fade { 433 | -webkit-transition: opacity .2s ease-in-out; 434 | -moz-transition: opacity .2s ease-in-out; 435 | transition: opacity .2s ease-in-out; 436 | } 437 | .content.sliding { 438 | -webkit-transition-timing-function: cubic-bezier(.1, .5, .1, 1); 439 | -moz-transition-timing-function: cubic-bezier(.1, .5, .1, 1); 440 | transition-timing-function: cubic-bezier(.1, .5, .1, 1); 441 | } 442 | .content.sliding.sliding-in, .content.sliding.right:not([class*="sliding-in"]) { 443 | -webkit-animation-name: fadeOverlay; 444 | -moz-animation-name: fadeOverlay; 445 | animation-name: fadeOverlay; 446 | -webkit-animation-duration: .4s; 447 | -moz-animation-duration: .4s; 448 | animation-duration: .4s; 449 | } 450 | .content.sliding.right:not([class*="sliding-in"]) { 451 | -webkit-animation-direction: reverse; 452 | -moz-animation-direction: reverse; 453 | animation-direction: reverse; 454 | } 455 | .content.sliding.left { 456 | -webkit-transform: translate3d(-20%, 0, 0); 457 | -ms-transform: translate3d(-20%, 0, 0); 458 | transform: translate3d(-20%, 0, 0); 459 | } 460 | 461 | @-webkit-keyframes fadeOverlay { 462 | from { 463 | -webkit-box-shadow: 0 0 10px transparent, -320px 0 0 transparent; 464 | box-shadow: 0 0 10px transparent, -320px 0 0 transparent; 465 | } 466 | 467 | to { 468 | -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, .3), -320px 0 0 rgba(0, 0, 0, .1); 469 | box-shadow: 0 0 10px rgba(0, 0, 0, .3), -320px 0 0 rgba(0, 0, 0, .1); 470 | } 471 | } 472 | -------------------------------------------------------------------------------- /css/ratchet-theme-ios.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Ratchet v2.0.2 (http://goratchet.com) 4 | * Copyright 2014 Connor Sears 5 | * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE) 6 | * 7 | * v2.0.2 designed by @connors. 8 | * ===================================================== 9 | */a{color:#007aff}a:active{color:#0062cc}.content{background-color:#efeff4}.h5,.h6,h5,h6,p{color:#8f8f94}.h5,.h6,h5,h6{font-weight:400;text-transform:uppercase}.btn{color:#929292;background-color:rgba(247,247,247,.98);border:1px solid #929292;-webkit-transition:all;-moz-transition:all;transition:all;-webkit-transition-timing-function:linear;-moz-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:.2s;-moz-transition-duration:.2s;transition-duration:.2s}.btn.active,.btn:active{color:#fff;background-color:#929292}.btn-primary{color:#fff;background-color:#007aff;border:1px solid #007aff}.btn-primary.active,.btn-primary:active{background-color:#0062cc;border:1px solid #0062cc}.btn-positive{color:#fff;background-color:#4cd964;border:1px solid #4cd964}.btn-positive.active,.btn-positive:active{background-color:#2ac845;border:1px solid #2ac845}.btn-negative{color:#fff;background-color:#dd524d;border:1px solid #dd524d}.btn-negative.active,.btn-negative:active{background-color:#cf2d28;border:1px solid #cf2d28}.btn-outlined{background-color:transparent}.btn-outlined.btn-primary{color:#007aff}.btn-outlined.btn-positive{color:#4cd964}.btn-outlined.btn-negative{color:#dd524d}.btn-outlined.btn-negative:active,.btn-outlined.btn-positive:active,.btn-outlined.btn-primary:active{color:#fff}.btn-link{color:#007aff;background-color:transparent;border:none}.btn-link.active,.btn-link:active{color:#0062cc;background-color:transparent}.btn .badge{background-color:rgba(0,0,0,.15)}.btn .badge.badge-inverted{background-color:transparent}.btn:active .badge{color:#fff}.bar{background-color:rgba(247,247,247,.98);border-bottom:0;-webkit-box-shadow:0 0 1px rgba(0,0,0,.85);box-shadow:0 0 1px rgba(0,0,0,.85)}.bar.bar-header-secondary{top:44px}.bar.bar-footer-secondary{bottom:44px}.bar.bar-footer-secondary-tab{bottom:50px}.bar-tab,.bar.bar-footer,.bar.bar-footer-secondary,.bar.bar-footer-secondary-tab{border-top:0}.tab-item{color:#929292}.bar-nav .btn-link,.tab-item.active,.tab-item:active{color:#007aff}.bar-nav .btn-link:active{color:#007aff;opacity:.6}.badge.badge-inverted{color:#929292;background-color:transparent}.badge-primary{color:#fff;background-color:#007aff}.badge-primary.badge-inverted{color:#007aff;background-color:transparent}.badge-positive{color:#fff;background-color:#4cd964}.badge-positive.badge-inverted{color:#4cd964;background-color:transparent}.badge-negative{color:#fff;background-color:#dd524d}.badge-negative.badge-inverted{color:#dd524d;background-color:transparent}.card .table-view,.card .table-view-cell:last-child{background-image:none}.table-view{background-image:url("data:image/svg+xml;utf8,"),url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:0 100%,0 0;border-top:0;border-bottom:0}.table-view .table-view-cell{background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:15px 100%;border-bottom:0}.table-view .table-view-cell:last-child{background-image:none}.table-view .table-view-cell>a:not(.btn):active{color:inherit}.table-view .table-view-divider{background-image:url("data:image/svg+xml;utf8,"),url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:0 100%,0 0;border-top:0;border-bottom:0}.input-group,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{height:40px;padding:10px 15px;border:1px solid rgba(0,0,0,.2)}input[type=search]{height:34px;text-align:center;background-color:rgba(0,0,0,.1);border:0;border-radius:6px}input[type=search]:focus{text-align:left}.input-group,select,textarea{height:auto}.input-group{padding:0;background-image:url("data:image/svg+xml;utf8,"),url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:0 100%,0 0;border:0}.input-group input{background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:15px 100%;border:0}.input-group input:last-child{background-image:none}.input-row{background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position:15px 100%;border-bottom:0}.input-row label+input,.input-row:last-child{background-image:none}.segmented-control{background-color:transparent;border:1px solid #929292}.segmented-control .control-item{color:#929292;border-color:#929292;-webkit-transition:background-color .1s linear;-moz-transition:background-color .1s linear;transition:background-color .1s linear}.segmented-control .control-item:active{background-color:#ebebeb}.segmented-control .control-item.active{color:#fff;background-color:#929292}.segmented-control-primary{border:1px solid #007aff}.segmented-control-primary .control-item{color:#007aff;border-color:inherit}.segmented-control-primary .control-item:active{background-color:#b3d7ff}.segmented-control-primary .control-item.active{color:#fff;background-color:#007aff}.segmented-control-positive{border:1px solid #4cd964}.segmented-control-positive .control-item{color:#4cd964;border-color:inherit}.segmented-control-positive .control-item:active{background-color:#dff8e3}.segmented-control-positive .control-item.active{color:#fff;background-color:#4cd964}.segmented-control-negative{border:1px solid #dd524d}.segmented-control-negative .control-item{color:#dd524d;border-color:inherit}.segmented-control-negative .control-item:active{background-color:#fae4e3}.segmented-control-negative .control-item.active{color:#fff;background-color:#dd524d}.popover{border-radius:12px;-webkit-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out}.popover:before{border-bottom:15px solid rgba(247,247,247,.98)}.popover .bar{-webkit-box-shadow:none;box-shadow:none}.popover .bar-nav{border-bottom:1px solid rgba(0,0,0,.15)}.popover .table-view{background-image:none;border-radius:12px}.modal,.modal.active{-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);-moz-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1)}.toggle{width:47px;border:2px solid #e6e6e6;-webkit-box-shadow:inset 0 0 0 0 #e1e1e1;box-shadow:inset 0 0 0 0 #e1e1e1;-webkit-transition-duration:.2s;-moz-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:box-shadow,border;-moz-transition-property:box-shadow,border;transition-property:box-shadow,border}.toggle .toggle-handle{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 3px 3px rgba(0,0,0,.08);box-shadow:0 3px 3px rgba(0,0,0,.08);-webkit-transition-property:-webkit-transform,border,width;-moz-transition-property:-moz-transform,border,width;transition-property:transform,border,width}.toggle:before{display:none}.toggle.active{background-color:transparent;border:2px solid #4cd964;-webkit-box-shadow:inset 0 0 0 13px #4cd964;box-shadow:inset 0 0 0 13px #4cd964}.toggle.active .toggle-handle{-webkit-transform:translate3d(17px,0,0);-ms-transform:translate3d(17px,0,0);transform:translate3d(17px,0,0);border-color:#4cd964}.content.fade{-webkit-transition:opacity .2s ease-in-out;-moz-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.content.sliding{-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);-moz-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1)}.content.sliding.right:not([class*=sliding-in]),.content.sliding.sliding-in{-webkit-animation-name:fadeOverlay;-moz-animation-name:fadeOverlay;animation-name:fadeOverlay;-webkit-animation-duration:.4s;-moz-animation-duration:.4s;animation-duration:.4s}.content.sliding.right:not([class*=sliding-in]){-webkit-animation-direction:reverse;-moz-animation-direction:reverse;animation-direction:reverse}.content.sliding.left{-webkit-transform:translate3d(-20%,0,0);-ms-transform:translate3d(-20%,0,0);transform:translate3d(-20%,0,0)}@-webkit-keyframes fadeOverlay{from{-webkit-box-shadow:0 0 10px transparent,-320px 0 0 transparent;box-shadow:0 0 10px transparent,-320px 0 0 transparent}to{-webkit-box-shadow:0 0 10px rgba(0,0,0,.3),-320px 0 0 rgba(0,0,0,.1);box-shadow:0 0 10px rgba(0,0,0,.3),-320px 0 0 rgba(0,0,0,.1)}} -------------------------------------------------------------------------------- /css/ratchet.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Ratchet v2.0.2 (http://goratchet.com) 4 | * Copyright 2014 Connor Sears 5 | * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE) 6 | * 7 | * v2.0.2 designed by @connors. 8 | * ===================================================== 9 | */ 10 | 11 | /*! normalize.css v3.0.1 | MIT License | git.io/normalize */ 12 | html { 13 | font-family: sans-serif; 14 | -webkit-text-size-adjust: 100%; 15 | -ms-text-size-adjust: 100%; 16 | } 17 | 18 | body { 19 | margin: 0; 20 | } 21 | 22 | article, 23 | aside, 24 | details, 25 | figcaption, 26 | figure, 27 | footer, 28 | header, 29 | hgroup, 30 | main, 31 | nav, 32 | section, 33 | summary { 34 | display: block; 35 | } 36 | 37 | audio, 38 | canvas, 39 | progress, 40 | video { 41 | display: inline-block; 42 | vertical-align: baseline; 43 | } 44 | 45 | audio:not([controls]) { 46 | display: none; 47 | height: 0; 48 | } 49 | 50 | [hidden], 51 | template { 52 | display: none; 53 | } 54 | 55 | a { 56 | background: transparent; 57 | } 58 | 59 | a:active, 60 | a:hover { 61 | outline: 0; 62 | } 63 | 64 | abbr[title] { 65 | border-bottom: 1px dotted; 66 | } 67 | 68 | b, 69 | strong { 70 | font-weight: bold; 71 | } 72 | 73 | dfn { 74 | font-style: italic; 75 | } 76 | 77 | h1 { 78 | margin: .67em 0; 79 | font-size: 2em; 80 | } 81 | 82 | mark { 83 | color: #000; 84 | background: #ff0; 85 | } 86 | 87 | small { 88 | font-size: 80%; 89 | } 90 | 91 | sub, 92 | sup { 93 | position: relative; 94 | font-size: 75%; 95 | line-height: 0; 96 | vertical-align: baseline; 97 | } 98 | 99 | sup { 100 | top: -.5em; 101 | } 102 | 103 | sub { 104 | bottom: -.25em; 105 | } 106 | 107 | img { 108 | border: 0; 109 | } 110 | 111 | svg:not(:root) { 112 | overflow: hidden; 113 | } 114 | 115 | figure { 116 | margin: 1em 40px; 117 | } 118 | 119 | hr { 120 | height: 0; 121 | -moz-box-sizing: content-box; 122 | box-sizing: content-box; 123 | } 124 | 125 | pre { 126 | overflow: auto; 127 | } 128 | 129 | code, 130 | kbd, 131 | pre, 132 | samp { 133 | font-family: monospace, monospace; 134 | font-size: 1em; 135 | } 136 | 137 | button, 138 | input, 139 | optgroup, 140 | select, 141 | textarea { 142 | margin: 0; 143 | font: inherit; 144 | color: inherit; 145 | } 146 | 147 | button { 148 | overflow: visible; 149 | } 150 | 151 | button, 152 | select { 153 | text-transform: none; 154 | } 155 | 156 | button, 157 | html input[type="button"], 158 | input[type="reset"], 159 | input[type="submit"] { 160 | -webkit-appearance: button; 161 | cursor: pointer; 162 | } 163 | 164 | button[disabled], 165 | html input[disabled] { 166 | cursor: default; 167 | } 168 | 169 | button::-moz-focus-inner, 170 | input::-moz-focus-inner { 171 | padding: 0; 172 | border: 0; 173 | } 174 | 175 | input { 176 | line-height: normal; 177 | } 178 | 179 | input[type="checkbox"], 180 | input[type="radio"] { 181 | box-sizing: border-box; 182 | padding: 0; 183 | } 184 | 185 | input[type="number"]::-webkit-inner-spin-button, 186 | input[type="number"]::-webkit-outer-spin-button { 187 | height: auto; 188 | } 189 | 190 | input[type="search"] { 191 | -webkit-box-sizing: content-box; 192 | -moz-box-sizing: content-box; 193 | box-sizing: content-box; 194 | -webkit-appearance: textfield; 195 | } 196 | 197 | input[type="search"]::-webkit-search-cancel-button, 198 | input[type="search"]::-webkit-search-decoration { 199 | -webkit-appearance: none; 200 | } 201 | 202 | fieldset { 203 | padding: .35em .625em .75em; 204 | margin: 0 2px; 205 | border: 1px solid #c0c0c0; 206 | } 207 | 208 | legend { 209 | padding: 0; 210 | border: 0; 211 | } 212 | 213 | textarea { 214 | overflow: auto; 215 | } 216 | 217 | optgroup { 218 | font-weight: bold; 219 | } 220 | 221 | table { 222 | border-spacing: 0; 223 | border-collapse: collapse; 224 | } 225 | 226 | td, 227 | th { 228 | padding: 0; 229 | } 230 | 231 | * { 232 | -webkit-box-sizing: border-box; 233 | -moz-box-sizing: border-box; 234 | box-sizing: border-box; 235 | } 236 | 237 | body { 238 | position: fixed; 239 | top: 0; 240 | right: 0; 241 | bottom: 0; 242 | left: 0; 243 | font-family: "Helvetica Neue", Helvetica, sans-serif; 244 | font-size: 17px; 245 | line-height: 21px; 246 | color: #000; 247 | background-color: #fff; 248 | } 249 | 250 | a { 251 | color: #428bca; 252 | text-decoration: none; 253 | 254 | -webkit-tap-highlight-color: transparent; 255 | } 256 | a:active { 257 | color: #3071a9; 258 | } 259 | 260 | .content { 261 | position: absolute; 262 | top: 0; 263 | right: 0; 264 | bottom: 0; 265 | left: 0; 266 | overflow: auto; 267 | -webkit-overflow-scrolling: touch; 268 | background-color: #fff; 269 | } 270 | 271 | .content > * { 272 | -webkit-transform: translateZ(0); 273 | -ms-transform: translateZ(0); 274 | transform: translateZ(0); 275 | } 276 | 277 | .bar-nav ~ .content { 278 | padding-top: 44px; 279 | } 280 | 281 | .bar-header-secondary ~ .content { 282 | padding-top: 88px; 283 | } 284 | 285 | .bar-footer ~ .content { 286 | padding-bottom: 44px; 287 | } 288 | 289 | .bar-footer-secondary ~ .content { 290 | padding-bottom: 88px; 291 | } 292 | 293 | .bar-tab ~ .content { 294 | padding-bottom: 50px; 295 | } 296 | 297 | .bar-footer-secondary-tab ~ .content { 298 | padding-bottom: 94px; 299 | } 300 | 301 | .content-padded { 302 | margin: 10px; 303 | } 304 | 305 | .pull-left { 306 | float: left; 307 | } 308 | 309 | .pull-right { 310 | float: right; 311 | } 312 | 313 | .clearfix:before, .clearfix:after { 314 | display: table; 315 | content: " "; 316 | } 317 | .clearfix:after { 318 | clear: both; 319 | } 320 | 321 | h1, h2, h3, h4, h5, h6 { 322 | margin-top: 0; 323 | margin-bottom: 10px; 324 | line-height: 1; 325 | } 326 | 327 | h1, .h1 { 328 | font-size: 36px; 329 | } 330 | 331 | h2, .h2 { 332 | font-size: 30px; 333 | } 334 | 335 | h3, .h3 { 336 | font-size: 24px; 337 | } 338 | 339 | h4, .h4 { 340 | font-size: 18px; 341 | } 342 | 343 | h5, .h5 { 344 | margin-top: 20px; 345 | font-size: 14px; 346 | } 347 | 348 | h6, .h6 { 349 | margin-top: 20px; 350 | font-size: 12px; 351 | } 352 | 353 | p { 354 | margin-top: 0; 355 | margin-bottom: 10px; 356 | font-size: 14px; 357 | color: #777; 358 | } 359 | 360 | .btn { 361 | position: relative; 362 | display: inline-block; 363 | padding: 6px 8px 7px; 364 | margin-bottom: 0; 365 | font-size: 12px; 366 | font-weight: 400; 367 | line-height: 1; 368 | color: #333; 369 | text-align: center; 370 | white-space: nowrap; 371 | vertical-align: top; 372 | cursor: pointer; 373 | background-color: white; 374 | border: 1px solid #ccc; 375 | border-radius: 3px; 376 | } 377 | .btn:active, .btn.active { 378 | color: inherit; 379 | background-color: #ccc; 380 | } 381 | .btn:disabled, .btn.disabled { 382 | opacity: .6; 383 | } 384 | 385 | .btn-primary { 386 | color: #fff; 387 | background-color: #428bca; 388 | border: 1px solid #428bca; 389 | } 390 | .btn-primary:active, .btn-primary.active { 391 | color: #fff; 392 | background-color: #3071a9; 393 | border: 1px solid #3071a9; 394 | } 395 | 396 | .btn-positive { 397 | color: #fff; 398 | background-color: #5cb85c; 399 | border: 1px solid #5cb85c; 400 | } 401 | .btn-positive:active, .btn-positive.active { 402 | color: #fff; 403 | background-color: #449d44; 404 | border: 1px solid #449d44; 405 | } 406 | 407 | .btn-negative { 408 | color: #fff; 409 | background-color: #d9534f; 410 | border: 1px solid #d9534f; 411 | } 412 | .btn-negative:active, .btn-negative.active { 413 | color: #fff; 414 | background-color: #c9302c; 415 | border: 1px solid #c9302c; 416 | } 417 | 418 | .btn-outlined { 419 | background-color: transparent; 420 | } 421 | .btn-outlined.btn-primary { 422 | color: #428bca; 423 | } 424 | .btn-outlined.btn-positive { 425 | color: #5cb85c; 426 | } 427 | .btn-outlined.btn-negative { 428 | color: #d9534f; 429 | } 430 | .btn-outlined.btn-primary:active, .btn-outlined.btn-positive:active, .btn-outlined.btn-negative:active { 431 | color: #fff; 432 | } 433 | 434 | .btn-link { 435 | padding-top: 6px; 436 | padding-bottom: 6px; 437 | color: #428bca; 438 | background-color: transparent; 439 | border: 0; 440 | } 441 | .btn-link:active, .btn-link.active { 442 | color: #3071a9; 443 | background-color: transparent; 444 | } 445 | 446 | .btn-block { 447 | display: block; 448 | width: 100%; 449 | padding: 15px 0; 450 | margin-bottom: 10px; 451 | font-size: 18px; 452 | } 453 | 454 | input[type="submit"], 455 | input[type="reset"], 456 | input[type="button"] { 457 | width: 100%; 458 | } 459 | 460 | .btn .badge { 461 | margin: -2px -4px -2px 4px; 462 | font-size: 12px; 463 | background-color: rgba(0, 0, 0, .15); 464 | } 465 | 466 | .btn .badge-inverted, 467 | .btn:active .badge-inverted { 468 | background-color: transparent; 469 | } 470 | 471 | .btn-primary:active .badge-inverted, 472 | .btn-positive:active .badge-inverted, 473 | .btn-negative:active .badge-inverted { 474 | color: #fff; 475 | } 476 | 477 | .btn-block .badge { 478 | position: absolute; 479 | right: 0; 480 | margin-right: 10px; 481 | } 482 | 483 | .btn .icon { 484 | font-size: inherit; 485 | } 486 | 487 | .bar { 488 | position: fixed; 489 | right: 0; 490 | left: 0; 491 | z-index: 10; 492 | height: 44px; 493 | padding-right: 10px; 494 | padding-left: 10px; 495 | background-color: white; 496 | border-bottom: 1px solid #ddd; 497 | 498 | -webkit-backface-visibility: hidden; 499 | backface-visibility: hidden; 500 | } 501 | 502 | .bar-header-secondary { 503 | top: 44px; 504 | } 505 | 506 | .bar-footer { 507 | bottom: 0; 508 | } 509 | 510 | .bar-footer-secondary { 511 | bottom: 44px; 512 | } 513 | 514 | .bar-footer-secondary-tab { 515 | bottom: 50px; 516 | } 517 | 518 | .bar-footer, 519 | .bar-footer-secondary, 520 | .bar-footer-secondary-tab { 521 | border-top: 1px solid #ddd; 522 | border-bottom: 0; 523 | } 524 | 525 | .bar-nav { 526 | top: 0; 527 | } 528 | 529 | .title { 530 | position: absolute; 531 | display: block; 532 | width: 100%; 533 | padding: 0; 534 | margin: 0 -10px; 535 | font-size: 17px; 536 | font-weight: 500; 537 | line-height: 44px; 538 | color: #000; 539 | text-align: center; 540 | white-space: nowrap; 541 | } 542 | 543 | .title a { 544 | color: inherit; 545 | } 546 | 547 | .bar-tab { 548 | bottom: 0; 549 | display: table; 550 | width: 100%; 551 | height: 50px; 552 | padding: 0; 553 | table-layout: fixed; 554 | border-top: 1px solid #ddd; 555 | border-bottom: 0; 556 | } 557 | .bar-tab .tab-item { 558 | display: table-cell; 559 | width: 1%; 560 | height: 50px; 561 | color: #929292; 562 | text-align: center; 563 | vertical-align: middle; 564 | } 565 | .bar-tab .tab-item.active, .bar-tab .tab-item:active { 566 | color: #428bca; 567 | } 568 | .bar-tab .tab-item .icon { 569 | top: 3px; 570 | width: 24px; 571 | height: 24px; 572 | padding-top: 0; 573 | padding-bottom: 0; 574 | } 575 | .bar-tab .tab-item .icon ~ .tab-label { 576 | display: block; 577 | font-size: 11px; 578 | } 579 | 580 | .bar .btn { 581 | position: relative; 582 | top: 7px; 583 | z-index: 20; 584 | padding: 6px 12px 7px; 585 | margin-top: 0; 586 | font-weight: 400; 587 | } 588 | .bar .btn.pull-right { 589 | margin-left: 10px; 590 | } 591 | .bar .btn.pull-left { 592 | margin-right: 10px; 593 | } 594 | 595 | .bar .btn-link { 596 | top: 0; 597 | padding: 0; 598 | font-size: 16px; 599 | line-height: 44px; 600 | color: #428bca; 601 | border: 0; 602 | } 603 | .bar .btn-link:active, .bar .btn-link.active { 604 | color: #3071a9; 605 | } 606 | 607 | .bar .btn-block { 608 | top: 6px; 609 | padding: 7px 0; 610 | margin-bottom: 0; 611 | font-size: 16px; 612 | } 613 | 614 | .bar .btn-nav.pull-left { 615 | margin-left: -5px; 616 | } 617 | .bar .btn-nav.pull-left .icon-left-nav { 618 | margin-right: -3px; 619 | } 620 | .bar .btn-nav.pull-right { 621 | margin-right: -5px; 622 | } 623 | .bar .btn-nav.pull-right .icon-right-nav { 624 | margin-left: -3px; 625 | } 626 | 627 | .bar .icon { 628 | position: relative; 629 | z-index: 20; 630 | padding-top: 10px; 631 | padding-bottom: 10px; 632 | font-size: 24px; 633 | } 634 | .bar .btn .icon { 635 | top: 3px; 636 | padding: 0; 637 | } 638 | .bar .title .icon { 639 | padding: 0; 640 | } 641 | .bar .title .icon.icon-caret { 642 | top: 4px; 643 | margin-left: -5px; 644 | } 645 | 646 | .bar input[type="search"] { 647 | height: 29px; 648 | margin: 6px 0; 649 | } 650 | 651 | .bar .segmented-control { 652 | top: 7px; 653 | margin: 0 auto; 654 | } 655 | 656 | .badge { 657 | display: inline-block; 658 | padding: 2px 9px 3px; 659 | font-size: 12px; 660 | line-height: 1; 661 | color: #333; 662 | background-color: rgba(0, 0, 0, .15); 663 | border-radius: 100px; 664 | } 665 | .badge.badge-inverted { 666 | padding: 0 5px 0 0; 667 | background-color: transparent; 668 | } 669 | 670 | .badge-primary { 671 | color: #fff; 672 | background-color: #428bca; 673 | } 674 | .badge-primary.badge-inverted { 675 | color: #428bca; 676 | } 677 | 678 | .badge-positive { 679 | color: #fff; 680 | background-color: #5cb85c; 681 | } 682 | .badge-positive.badge-inverted { 683 | color: #5cb85c; 684 | } 685 | 686 | .badge-negative { 687 | color: #fff; 688 | background-color: #d9534f; 689 | } 690 | .badge-negative.badge-inverted { 691 | color: #d9534f; 692 | } 693 | 694 | .card { 695 | margin: 10px; 696 | overflow: hidden; 697 | background-color: white; 698 | border: 1px solid #ddd; 699 | border-radius: 6px; 700 | } 701 | 702 | .card .table-view { 703 | margin-bottom: 0; 704 | border-top: 0; 705 | border-bottom: 0; 706 | } 707 | .card .table-view .table-view-divider:first-child { 708 | top: 0; 709 | border-top-left-radius: 6px; 710 | border-top-right-radius: 6px; 711 | } 712 | .card .table-view .table-view-divider:last-child { 713 | border-bottom-right-radius: 6px; 714 | border-bottom-left-radius: 6px; 715 | } 716 | 717 | .card .table-view-cell:last-child { 718 | border-bottom: 0; 719 | } 720 | 721 | .table-view { 722 | padding-left: 0; 723 | margin-top: 0; 724 | margin-bottom: 15px; 725 | list-style: none; 726 | background-color: #fff; 727 | border-top: 1px solid #ddd; 728 | border-bottom: 1px solid #ddd; 729 | } 730 | 731 | .table-view-cell { 732 | position: relative; 733 | padding: 11px 65px 11px 15px; 734 | overflow: hidden; 735 | border-bottom: 1px solid #ddd; 736 | } 737 | .table-view-cell:last-child { 738 | border-bottom: 0; 739 | } 740 | .table-view-cell > a:not(.btn) { 741 | position: relative; 742 | display: block; 743 | padding: inherit; 744 | margin: -11px -65px -11px -15px; 745 | overflow: hidden; 746 | color: inherit; 747 | } 748 | .table-view-cell > a:not(.btn):active { 749 | background-color: #eee; 750 | } 751 | .table-view-cell p { 752 | margin-bottom: 0; 753 | } 754 | 755 | .table-view-divider { 756 | padding-top: 6px; 757 | padding-bottom: 6px; 758 | padding-left: 15px; 759 | margin-top: -1px; 760 | margin-left: 0; 761 | font-weight: 500; 762 | color: #999; 763 | background-color: #fafafa; 764 | border-top: 1px solid #ddd; 765 | border-bottom: 1px solid #ddd; 766 | } 767 | 768 | .table-view .media, 769 | .table-view .media-body { 770 | overflow: hidden; 771 | } 772 | 773 | .table-view .media-object.pull-left { 774 | margin-right: 10px; 775 | } 776 | .table-view .media-object.pull-right { 777 | margin-left: 10px; 778 | } 779 | 780 | .table-view-cell > .btn, 781 | .table-view-cell > .badge, 782 | .table-view-cell > .toggle, 783 | .table-view-cell > a > .btn, 784 | .table-view-cell > a > .badge, 785 | .table-view-cell > a > .toggle { 786 | position: absolute; 787 | top: 50%; 788 | right: 15px; 789 | -webkit-transform: translateY(-50%); 790 | -ms-transform: translateY(-50%); 791 | transform: translateY(-50%); 792 | } 793 | .table-view-cell .navigate-left > .btn, 794 | .table-view-cell .navigate-left > .badge, 795 | .table-view-cell .navigate-left > .toggle, 796 | .table-view-cell .navigate-right > .btn, 797 | .table-view-cell .navigate-right > .badge, 798 | .table-view-cell .navigate-right > .toggle, 799 | .table-view-cell .push-left > .btn, 800 | .table-view-cell .push-left > .badge, 801 | .table-view-cell .push-left > .toggle, 802 | .table-view-cell .push-right > .btn, 803 | .table-view-cell .push-right > .badge, 804 | .table-view-cell .push-right > .toggle, 805 | .table-view-cell > a .navigate-left > .btn, 806 | .table-view-cell > a .navigate-left > .badge, 807 | .table-view-cell > a .navigate-left > .toggle, 808 | .table-view-cell > a .navigate-right > .btn, 809 | .table-view-cell > a .navigate-right > .badge, 810 | .table-view-cell > a .navigate-right > .toggle, 811 | .table-view-cell > a .push-left > .btn, 812 | .table-view-cell > a .push-left > .badge, 813 | .table-view-cell > a .push-left > .toggle, 814 | .table-view-cell > a .push-right > .btn, 815 | .table-view-cell > a .push-right > .badge, 816 | .table-view-cell > a .push-right > .toggle { 817 | right: 35px; 818 | } 819 | 820 | .content > .table-view:first-child { 821 | margin-top: 15px; 822 | } 823 | 824 | input, 825 | textarea, 826 | button, 827 | select { 828 | font-family: "Helvetica Neue", Helvetica, sans-serif; 829 | font-size: 17px; 830 | } 831 | 832 | select, 833 | textarea, 834 | input[type="text"], 835 | input[type="search"], 836 | input[type="password"], 837 | input[type="datetime"], 838 | input[type="datetime-local"], 839 | input[type="date"], 840 | input[type="month"], 841 | input[type="time"], 842 | input[type="week"], 843 | input[type="number"], 844 | input[type="email"], 845 | input[type="url"], 846 | input[type="tel"], 847 | input[type="color"] { 848 | width: 100%; 849 | height: 35px; 850 | -webkit-appearance: none; 851 | padding: 0 15px; 852 | margin-bottom: 15px; 853 | line-height: 21px; 854 | background-color: #fff; 855 | border: 1px solid #ddd; 856 | border-radius: 3px; 857 | outline: none; 858 | } 859 | 860 | input[type="search"] { 861 | -webkit-box-sizing: border-box; 862 | -moz-box-sizing: border-box; 863 | box-sizing: border-box; 864 | padding: 0 10px; 865 | font-size: 16px; 866 | border-radius: 20px; 867 | } 868 | 869 | input[type="search"]:focus { 870 | text-align: left; 871 | } 872 | 873 | textarea { 874 | height: auto; 875 | } 876 | 877 | select { 878 | height: auto; 879 | font-size: 14px; 880 | background-color: #f8f8f8; 881 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .1); 882 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .1); 883 | } 884 | 885 | .input-group { 886 | background-color: #fff; 887 | } 888 | 889 | .input-group input, 890 | .input-group textarea { 891 | margin-bottom: 0; 892 | background-color: transparent; 893 | border-top: 0; 894 | border-right: 0; 895 | border-left: 0; 896 | border-radius: 0; 897 | -webkit-box-shadow: none; 898 | box-shadow: none; 899 | } 900 | 901 | .input-row { 902 | height: 35px; 903 | overflow: hidden; 904 | border-bottom: 1px solid #ddd; 905 | } 906 | 907 | .input-row label { 908 | float: left; 909 | width: 35%; 910 | padding: 8px 15px; 911 | font-family: "Helvetica Neue", Helvetica, sans-serif; 912 | line-height: 1.1; 913 | } 914 | 915 | .input-row input { 916 | float: right; 917 | width: 65%; 918 | padding-left: 0; 919 | margin-bottom: 0; 920 | border: 0; 921 | } 922 | 923 | .segmented-control { 924 | position: relative; 925 | display: table; 926 | overflow: hidden; 927 | font-size: 12px; 928 | font-weight: 400; 929 | background-color: white; 930 | border: 1px solid #ccc; 931 | border-radius: 3px; 932 | } 933 | .segmented-control .control-item { 934 | display: table-cell; 935 | width: 1%; 936 | padding-top: 6px; 937 | padding-bottom: 7px; 938 | overflow: hidden; 939 | line-height: 1; 940 | color: #333; 941 | text-align: center; 942 | text-overflow: ellipsis; 943 | white-space: nowrap; 944 | border-left: 1px solid #ccc; 945 | } 946 | .segmented-control .control-item:first-child { 947 | border-left-width: 0; 948 | } 949 | .segmented-control .control-item:active { 950 | background-color: #eee; 951 | } 952 | .segmented-control .control-item.active { 953 | background-color: #ccc; 954 | } 955 | 956 | .segmented-control-primary { 957 | border-color: #428bca; 958 | } 959 | .segmented-control-primary .control-item { 960 | color: #428bca; 961 | border-color: inherit; 962 | } 963 | .segmented-control-primary .control-item:active { 964 | background-color: #cde1f1; 965 | } 966 | .segmented-control-primary .control-item.active { 967 | color: #fff; 968 | background-color: #428bca; 969 | } 970 | 971 | .segmented-control-positive { 972 | border-color: #5cb85c; 973 | } 974 | .segmented-control-positive .control-item { 975 | color: #5cb85c; 976 | border-color: inherit; 977 | } 978 | .segmented-control-positive .control-item:active { 979 | background-color: #d8eed8; 980 | } 981 | .segmented-control-positive .control-item.active { 982 | color: #fff; 983 | background-color: #5cb85c; 984 | } 985 | 986 | .segmented-control-negative { 987 | border-color: #d9534f; 988 | } 989 | .segmented-control-negative .control-item { 990 | color: #d9534f; 991 | border-color: inherit; 992 | } 993 | .segmented-control-negative .control-item:active { 994 | background-color: #f9e2e2; 995 | } 996 | .segmented-control-negative .control-item.active { 997 | color: #fff; 998 | background-color: #d9534f; 999 | } 1000 | 1001 | .control-content { 1002 | display: none; 1003 | } 1004 | .control-content.active { 1005 | display: block; 1006 | } 1007 | 1008 | .popover { 1009 | position: fixed; 1010 | top: 55px; 1011 | left: 50%; 1012 | z-index: 20; 1013 | display: none; 1014 | width: 280px; 1015 | margin-left: -140px; 1016 | background-color: white; 1017 | border-radius: 6px; 1018 | -webkit-box-shadow: 0 0 15px rgba(0, 0, 0, .1); 1019 | box-shadow: 0 0 15px rgba(0, 0, 0, .1); 1020 | opacity: 0; 1021 | -webkit-transition: all .25s linear; 1022 | -moz-transition: all .25s linear; 1023 | transition: all .25s linear; 1024 | -webkit-transform: translate3d(0, -15px, 0); 1025 | -ms-transform: translate3d(0, -15px, 0); 1026 | transform: translate3d(0, -15px, 0); 1027 | } 1028 | .popover:before { 1029 | position: absolute; 1030 | top: -15px; 1031 | left: 50%; 1032 | width: 0; 1033 | height: 0; 1034 | margin-left: -15px; 1035 | content: ''; 1036 | border-right: 15px solid transparent; 1037 | border-bottom: 15px solid white; 1038 | border-left: 15px solid transparent; 1039 | } 1040 | .popover.visible { 1041 | opacity: 1; 1042 | -webkit-transform: translate3d(0, 0, 0); 1043 | -ms-transform: translate3d(0, 0, 0); 1044 | transform: translate3d(0, 0, 0); 1045 | } 1046 | .popover .bar ~ .table-view { 1047 | padding-top: 44px; 1048 | } 1049 | 1050 | .backdrop { 1051 | position: fixed; 1052 | top: 0; 1053 | right: 0; 1054 | bottom: 0; 1055 | left: 0; 1056 | z-index: 15; 1057 | background-color: rgba(0, 0, 0, .3); 1058 | } 1059 | 1060 | .popover .btn-block { 1061 | margin-bottom: 5px; 1062 | } 1063 | .popover .btn-block:last-child { 1064 | margin-bottom: 0; 1065 | } 1066 | 1067 | .popover .bar-nav { 1068 | border-bottom: 1px solid #ddd; 1069 | border-top-left-radius: 12px; 1070 | border-top-right-radius: 12px; 1071 | -webkit-box-shadow: none; 1072 | box-shadow: none; 1073 | } 1074 | 1075 | .popover .table-view { 1076 | max-height: 300px; 1077 | margin-bottom: 0; 1078 | overflow: auto; 1079 | -webkit-overflow-scrolling: touch; 1080 | background-color: #fff; 1081 | border-top: 0; 1082 | border-bottom: 0; 1083 | border-radius: 6px; 1084 | } 1085 | 1086 | .modal { 1087 | position: fixed; 1088 | top: 0; 1089 | z-index: 11; 1090 | width: 100%; 1091 | min-height: 100%; 1092 | overflow: hidden; 1093 | background-color: #fff; 1094 | opacity: 0; 1095 | -webkit-transition: -webkit-transform .25s, opacity 1ms .25s; 1096 | -moz-transition: -moz-transform .25s, opacity 1ms .25s; 1097 | transition: transform .25s, opacity 1ms .25s; 1098 | -webkit-transform: translate3d(0, 100%, 0); 1099 | -ms-transform: translate3d(0, 100%, 0); 1100 | transform: translate3d(0, 100%, 0); 1101 | } 1102 | .modal.active { 1103 | height: 100%; 1104 | opacity: 1; 1105 | -webkit-transition: -webkit-transform .25s; 1106 | -moz-transition: -moz-transform .25s; 1107 | transition: transform .25s; 1108 | -webkit-transform: translate3d(0, 0, 0); 1109 | -ms-transform: translate3d(0, 0, 0); 1110 | transform: translate3d(0, 0, 0); 1111 | } 1112 | 1113 | .slider { 1114 | width: 100%; 1115 | } 1116 | 1117 | .slider { 1118 | overflow: hidden; 1119 | background-color: #000; 1120 | } 1121 | .slider .slide-group { 1122 | position: relative; 1123 | font-size: 0; 1124 | white-space: nowrap; 1125 | -webkit-transition: all 0s linear; 1126 | -moz-transition: all 0s linear; 1127 | transition: all 0s linear; 1128 | } 1129 | .slider .slide-group .slide { 1130 | display: inline-block; 1131 | width: 100%; 1132 | height: 100%; 1133 | font-size: 14px; 1134 | vertical-align: top; 1135 | } 1136 | 1137 | .toggle { 1138 | position: relative; 1139 | display: block; 1140 | width: 74px; 1141 | height: 30px; 1142 | background-color: #fff; 1143 | border: 2px solid #ddd; 1144 | border-radius: 20px; 1145 | -webkit-transition-duration: .2s; 1146 | -moz-transition-duration: .2s; 1147 | transition-duration: .2s; 1148 | -webkit-transition-property: background-color, border; 1149 | -moz-transition-property: background-color, border; 1150 | transition-property: background-color, border; 1151 | } 1152 | .toggle .toggle-handle { 1153 | position: absolute; 1154 | top: -1px; 1155 | left: -1px; 1156 | z-index: 2; 1157 | width: 28px; 1158 | height: 28px; 1159 | background-color: #fff; 1160 | border: 1px solid #ddd; 1161 | border-radius: 100px; 1162 | -webkit-transition-duration: .2s; 1163 | -moz-transition-duration: .2s; 1164 | transition-duration: .2s; 1165 | -webkit-transition-property: -webkit-transform, border, width; 1166 | -moz-transition-property: -moz-transform, border, width; 1167 | transition-property: transform, border, width; 1168 | } 1169 | .toggle:before { 1170 | position: absolute; 1171 | top: 3px; 1172 | right: 11px; 1173 | font-size: 13px; 1174 | color: #999; 1175 | text-transform: uppercase; 1176 | content: "Off"; 1177 | } 1178 | .toggle.active { 1179 | background-color: #5cb85c; 1180 | border: 2px solid #5cb85c; 1181 | } 1182 | .toggle.active .toggle-handle { 1183 | border-color: #5cb85c; 1184 | -webkit-transform: translate3d(44px, 0, 0); 1185 | -ms-transform: translate3d(44px, 0, 0); 1186 | transform: translate3d(44px, 0, 0); 1187 | } 1188 | .toggle.active:before { 1189 | right: auto; 1190 | left: 15px; 1191 | color: #fff; 1192 | content: "On"; 1193 | } 1194 | .toggle input[type="checkbox"] { 1195 | display: none; 1196 | } 1197 | 1198 | .content.fade { 1199 | left: 0; 1200 | opacity: 0; 1201 | } 1202 | .content.fade.in { 1203 | opacity: 1; 1204 | } 1205 | .content.sliding { 1206 | z-index: 2; 1207 | -webkit-transition: -webkit-transform .4s; 1208 | -moz-transition: -moz-transform .4s; 1209 | transition: transform .4s; 1210 | -webkit-transform: translate3d(0, 0, 0); 1211 | -ms-transform: translate3d(0, 0, 0); 1212 | transform: translate3d(0, 0, 0); 1213 | } 1214 | .content.sliding.left { 1215 | z-index: 1; 1216 | -webkit-transform: translate3d(-100%, 0, 0); 1217 | -ms-transform: translate3d(-100%, 0, 0); 1218 | transform: translate3d(-100%, 0, 0); 1219 | } 1220 | .content.sliding.right { 1221 | z-index: 3; 1222 | -webkit-transform: translate3d(100%, 0, 0); 1223 | -ms-transform: translate3d(100%, 0, 0); 1224 | transform: translate3d(100%, 0, 0); 1225 | } 1226 | 1227 | .navigate-left:after, 1228 | .navigate-right:after, 1229 | .push-left:after, 1230 | .push-right:after { 1231 | position: absolute; 1232 | top: 50%; 1233 | display: inline-block; 1234 | font-family: Ratchicons; 1235 | font-size: inherit; 1236 | line-height: 1; 1237 | color: #bbb; 1238 | text-decoration: none; 1239 | -webkit-transform: translateY(-50%); 1240 | -ms-transform: translateY(-50%); 1241 | transform: translateY(-50%); 1242 | 1243 | -webkit-font-smoothing: antialiased; 1244 | } 1245 | 1246 | .navigate-left:after, 1247 | .push-left:after { 1248 | left: 15px; 1249 | content: '\e822'; 1250 | } 1251 | 1252 | .navigate-right:after, 1253 | .push-right:after { 1254 | right: 15px; 1255 | content: '\e826'; 1256 | } 1257 | 1258 | @font-face { 1259 | font-family: Ratchicons; 1260 | font-style: normal; 1261 | font-weight: normal; 1262 | 1263 | src: url("../fonts/ratchicons.eot"); 1264 | src: url("../fonts/ratchicons.eot?#iefix") format("embedded-opentype"), url("../fonts/ratchicons.woff") format("woff"), url("../fonts/ratchicons.ttf") format("truetype"), url("../fonts/ratchicons.svg#svgFontName") format("svg"); 1265 | } 1266 | .icon { 1267 | display: inline-block; 1268 | font-family: Ratchicons; 1269 | font-size: 24px; 1270 | line-height: 1; 1271 | text-decoration: none; 1272 | 1273 | -webkit-font-smoothing: antialiased; 1274 | } 1275 | 1276 | .icon-back:before { 1277 | content: '\e80a'; 1278 | } 1279 | 1280 | .icon-bars:before { 1281 | content: '\e80e'; 1282 | } 1283 | 1284 | .icon-caret:before { 1285 | content: '\e80f'; 1286 | } 1287 | 1288 | .icon-check:before { 1289 | content: '\e810'; 1290 | } 1291 | 1292 | .icon-close:before { 1293 | content: '\e811'; 1294 | } 1295 | 1296 | .icon-code:before { 1297 | content: '\e812'; 1298 | } 1299 | 1300 | .icon-compose:before { 1301 | content: '\e813'; 1302 | } 1303 | 1304 | .icon-download:before { 1305 | content: '\e815'; 1306 | } 1307 | 1308 | .icon-edit:before { 1309 | content: '\e829'; 1310 | } 1311 | 1312 | .icon-forward:before { 1313 | content: '\e82a'; 1314 | } 1315 | 1316 | .icon-gear:before { 1317 | content: '\e821'; 1318 | } 1319 | 1320 | .icon-home:before { 1321 | content: '\e82b'; 1322 | } 1323 | 1324 | .icon-info:before { 1325 | content: '\e82c'; 1326 | } 1327 | 1328 | .icon-list:before { 1329 | content: '\e823'; 1330 | } 1331 | 1332 | .icon-more-vertical:before { 1333 | content: '\e82e'; 1334 | } 1335 | 1336 | .icon-more:before { 1337 | content: '\e82f'; 1338 | } 1339 | 1340 | .icon-pages:before { 1341 | content: '\e824'; 1342 | } 1343 | 1344 | .icon-pause:before { 1345 | content: '\e830'; 1346 | } 1347 | 1348 | .icon-person:before { 1349 | content: '\e832'; 1350 | } 1351 | 1352 | .icon-play:before { 1353 | content: '\e816'; 1354 | } 1355 | 1356 | .icon-plus:before { 1357 | content: '\e817'; 1358 | } 1359 | 1360 | .icon-refresh:before { 1361 | content: '\e825'; 1362 | } 1363 | 1364 | .icon-search:before { 1365 | content: '\e819'; 1366 | } 1367 | 1368 | .icon-share:before { 1369 | content: '\e81a'; 1370 | } 1371 | 1372 | .icon-sound:before { 1373 | content: '\e827'; 1374 | } 1375 | 1376 | .icon-sound2:before { 1377 | content: '\e828'; 1378 | } 1379 | 1380 | .icon-sound3:before { 1381 | content: '\e80b'; 1382 | } 1383 | 1384 | .icon-sound4:before { 1385 | content: '\e80c'; 1386 | } 1387 | 1388 | .icon-star-filled:before { 1389 | content: '\e81b'; 1390 | } 1391 | 1392 | .icon-star:before { 1393 | content: '\e81c'; 1394 | } 1395 | 1396 | .icon-stop:before { 1397 | content: '\e81d'; 1398 | } 1399 | 1400 | .icon-trash:before { 1401 | content: '\e81e'; 1402 | } 1403 | 1404 | .icon-up-nav:before { 1405 | content: '\e81f'; 1406 | } 1407 | 1408 | .icon-up:before { 1409 | content: '\e80d'; 1410 | } 1411 | 1412 | .icon-right-nav:before { 1413 | content: '\e818'; 1414 | } 1415 | 1416 | .icon-right:before { 1417 | content: '\e826'; 1418 | } 1419 | 1420 | .icon-down-nav:before { 1421 | content: '\e814'; 1422 | } 1423 | 1424 | .icon-down:before { 1425 | content: '\e820'; 1426 | } 1427 | 1428 | .icon-left-nav:before { 1429 | content: '\e82d'; 1430 | } 1431 | 1432 | .icon-left:before { 1433 | content: '\e822'; 1434 | } 1435 | -------------------------------------------------------------------------------- /css/ratchet.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Ratchet v2.0.2 (http://goratchet.com) 4 | * Copyright 2014 Connor Sears 5 | * Licensed under MIT (https://github.com/twbs/ratchet/blob/master/LICENSE) 6 | * 7 | * v2.0.2 designed by @connors. 8 | * ===================================================== 9 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{position:fixed;top:0;right:0;bottom:0;left:0;font-family:"Helvetica Neue",Helvetica,sans-serif;font-size:17px;line-height:21px;color:#000;background-color:#fff}a{color:#428bca;text-decoration:none;-webkit-tap-highlight-color:transparent}a:active{color:#3071a9}.content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:auto;-webkit-overflow-scrolling:touch;background-color:#fff}.content>*{-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.bar-nav~.content{padding-top:44px}.bar-header-secondary~.content{padding-top:88px}.bar-footer~.content{padding-bottom:44px}.bar-footer-secondary~.content{padding-bottom:88px}.bar-tab~.content{padding-bottom:50px}.bar-footer-secondary-tab~.content{padding-bottom:94px}.content-padded{margin:10px}.pull-left{float:left}.pull-right{float:right}.clearfix:after,.clearfix:before{display:table;content:" "}.clearfix:after{clear:both}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:10px;line-height:1}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{margin-top:20px;font-size:14px}.h6,h6{margin-top:20px;font-size:12px}p{margin-top:0;margin-bottom:10px;font-size:14px;color:#777}.btn{position:relative;display:inline-block;padding:6px 8px 7px;margin-bottom:0;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;white-space:nowrap;vertical-align:top;cursor:pointer;background-color:#fff;border:1px solid #ccc;border-radius:3px}.btn.active,.btn:active{color:inherit;background-color:#ccc}.btn.disabled,.btn:disabled{opacity:.6}.btn-primary{color:#fff;background-color:#428bca;border:1px solid #428bca}.btn-primary.active,.btn-primary:active{color:#fff;background-color:#3071a9;border:1px solid #3071a9}.btn-positive{color:#fff;background-color:#5cb85c;border:1px solid #5cb85c}.btn-positive.active,.btn-positive:active{color:#fff;background-color:#449d44;border:1px solid #449d44}.btn-negative{color:#fff;background-color:#d9534f;border:1px solid #d9534f}.btn-negative.active,.btn-negative:active{color:#fff;background-color:#c9302c;border:1px solid #c9302c}.btn-outlined{background-color:transparent}.btn-outlined.btn-primary{color:#428bca}.btn-outlined.btn-positive{color:#5cb85c}.btn-outlined.btn-negative{color:#d9534f}.btn-outlined.btn-negative:active,.btn-outlined.btn-positive:active,.btn-outlined.btn-primary:active{color:#fff}.btn-link{padding-top:6px;padding-bottom:6px;color:#428bca;background-color:transparent;border:0}.btn-link.active,.btn-link:active{color:#3071a9;background-color:transparent}.btn-block{display:block;width:100%;padding:15px 0;margin-bottom:10px;font-size:18px}input[type=button],input[type=reset],input[type=submit]{width:100%}.btn .badge{margin:-2px -4px -2px 4px;font-size:12px;background-color:rgba(0,0,0,.15)}.btn .badge-inverted,.btn:active .badge-inverted{background-color:transparent}.btn-negative:active .badge-inverted,.btn-positive:active .badge-inverted,.btn-primary:active .badge-inverted{color:#fff}.btn-block .badge{position:absolute;right:0;margin-right:10px}.btn .icon{font-size:inherit}.bar{position:fixed;right:0;left:0;z-index:10;height:44px;padding-right:10px;padding-left:10px;background-color:#fff;border-bottom:1px solid #ddd;-webkit-backface-visibility:hidden;backface-visibility:hidden}.bar-header-secondary{top:44px}.bar-footer{bottom:0}.bar-footer-secondary{bottom:44px}.bar-footer-secondary-tab{bottom:50px}.bar-footer,.bar-footer-secondary,.bar-footer-secondary-tab{border-top:1px solid #ddd;border-bottom:0}.bar-nav{top:0}.title{position:absolute;display:block;width:100%;padding:0;margin:0 -10px;font-size:17px;font-weight:500;line-height:44px;color:#000;text-align:center;white-space:nowrap}.title a{color:inherit}.bar-tab{bottom:0;display:table;width:100%;height:50px;padding:0;table-layout:fixed;border-top:1px solid #ddd;border-bottom:0}.bar-tab .tab-item{display:table-cell;width:1%;height:50px;color:#929292;text-align:center;vertical-align:middle}.bar-tab .tab-item.active,.bar-tab .tab-item:active{color:#428bca}.bar-tab .tab-item .icon{top:3px;width:24px;height:24px;padding-top:0;padding-bottom:0}.bar-tab .tab-item .icon~.tab-label{display:block;font-size:11px}.bar .btn{position:relative;top:7px;z-index:20;padding:6px 12px 7px;margin-top:0;font-weight:400}.bar .btn.pull-right{margin-left:10px}.bar .btn.pull-left{margin-right:10px}.bar .btn-link{top:0;padding:0;font-size:16px;line-height:44px;color:#428bca;border:0}.bar .btn-link.active,.bar .btn-link:active{color:#3071a9}.bar .btn-block{top:6px;padding:7px 0;margin-bottom:0;font-size:16px}.bar .btn-nav.pull-left{margin-left:-5px}.bar .btn-nav.pull-left .icon-left-nav{margin-right:-3px}.bar .btn-nav.pull-right{margin-right:-5px}.bar .btn-nav.pull-right .icon-right-nav{margin-left:-3px}.bar .icon{position:relative;z-index:20;padding-top:10px;padding-bottom:10px;font-size:24px}.bar .btn .icon{top:3px;padding:0}.bar .title .icon{padding:0}.bar .title .icon.icon-caret{top:4px;margin-left:-5px}.bar input[type=search]{height:29px;margin:6px 0}.bar .segmented-control{top:7px;margin:0 auto}.badge{display:inline-block;padding:2px 9px 3px;font-size:12px;line-height:1;color:#333;background-color:rgba(0,0,0,.15);border-radius:100px}.badge.badge-inverted{padding:0 5px 0 0;background-color:transparent}.badge-primary{color:#fff;background-color:#428bca}.badge-primary.badge-inverted{color:#428bca}.badge-positive{color:#fff;background-color:#5cb85c}.badge-positive.badge-inverted{color:#5cb85c}.badge-negative{color:#fff;background-color:#d9534f}.badge-negative.badge-inverted{color:#d9534f}.card{margin:10px;overflow:hidden;background-color:#fff;border:1px solid #ddd;border-radius:6px}.card .table-view{margin-bottom:0;border-top:0;border-bottom:0}.card .table-view .table-view-divider:first-child{top:0;border-top-left-radius:6px;border-top-right-radius:6px}.card .table-view .table-view-divider:last-child{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.card .table-view-cell:last-child{border-bottom:0}.table-view{padding-left:0;margin-top:0;margin-bottom:15px;list-style:none;background-color:#fff;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.table-view-cell{position:relative;padding:11px 65px 11px 15px;overflow:hidden;border-bottom:1px solid #ddd}.table-view-cell:last-child{border-bottom:0}.table-view-cell>a:not(.btn){position:relative;display:block;padding:inherit;margin:-11px -65px -11px -15px;overflow:hidden;color:inherit}.table-view-cell>a:not(.btn):active{background-color:#eee}.table-view-cell p{margin-bottom:0}.table-view-divider{padding-top:6px;padding-bottom:6px;padding-left:15px;margin-top:-1px;margin-left:0;font-weight:500;color:#999;background-color:#fafafa;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.table-view .media,.table-view .media-body{overflow:hidden}.table-view .media-object.pull-left{margin-right:10px}.table-view .media-object.pull-right{margin-left:10px}.table-view-cell>.badge,.table-view-cell>.btn,.table-view-cell>.toggle,.table-view-cell>a>.badge,.table-view-cell>a>.btn,.table-view-cell>a>.toggle{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.table-view-cell .navigate-left>.badge,.table-view-cell .navigate-left>.btn,.table-view-cell .navigate-left>.toggle,.table-view-cell .navigate-right>.badge,.table-view-cell .navigate-right>.btn,.table-view-cell .navigate-right>.toggle,.table-view-cell .push-left>.badge,.table-view-cell .push-left>.btn,.table-view-cell .push-left>.toggle,.table-view-cell .push-right>.badge,.table-view-cell .push-right>.btn,.table-view-cell .push-right>.toggle,.table-view-cell>a .navigate-left>.badge,.table-view-cell>a .navigate-left>.btn,.table-view-cell>a .navigate-left>.toggle,.table-view-cell>a .navigate-right>.badge,.table-view-cell>a .navigate-right>.btn,.table-view-cell>a .navigate-right>.toggle,.table-view-cell>a .push-left>.badge,.table-view-cell>a .push-left>.btn,.table-view-cell>a .push-left>.toggle,.table-view-cell>a .push-right>.badge,.table-view-cell>a .push-right>.btn,.table-view-cell>a .push-right>.toggle{right:35px}.content>.table-view:first-child{margin-top:15px}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,sans-serif;font-size:17px}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{width:100%;height:35px;-webkit-appearance:none;padding:0 15px;margin-bottom:15px;line-height:21px;background-color:#fff;border:1px solid #ddd;border-radius:3px;outline:0}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 10px;font-size:16px;border-radius:20px}input[type=search]:focus{text-align:left}textarea{height:auto}select{height:auto;font-size:14px;background-color:#f8f8f8;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.input-group{background-color:#fff}.input-group input,.input-group textarea{margin-bottom:0;background-color:transparent;border-top:0;border-right:0;border-left:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.input-row{height:35px;overflow:hidden;border-bottom:1px solid #ddd}.input-row label{float:left;width:35%;padding:8px 15px;font-family:"Helvetica Neue",Helvetica,sans-serif;line-height:1.1}.input-row input{float:right;width:65%;padding-left:0;margin-bottom:0;border:0}.segmented-control{position:relative;display:table;overflow:hidden;font-size:12px;font-weight:400;background-color:#fff;border:1px solid #ccc;border-radius:3px}.segmented-control .control-item{display:table-cell;width:1%;padding-top:6px;padding-bottom:7px;overflow:hidden;line-height:1;color:#333;text-align:center;text-overflow:ellipsis;white-space:nowrap;border-left:1px solid #ccc}.segmented-control .control-item:first-child{border-left-width:0}.segmented-control .control-item:active{background-color:#eee}.segmented-control .control-item.active{background-color:#ccc}.segmented-control-primary{border-color:#428bca}.segmented-control-primary .control-item{color:#428bca;border-color:inherit}.segmented-control-primary .control-item:active{background-color:#cde1f1}.segmented-control-primary .control-item.active{color:#fff;background-color:#428bca}.segmented-control-positive{border-color:#5cb85c}.segmented-control-positive .control-item{color:#5cb85c;border-color:inherit}.segmented-control-positive .control-item:active{background-color:#d8eed8}.segmented-control-positive .control-item.active{color:#fff;background-color:#5cb85c}.segmented-control-negative{border-color:#d9534f}.segmented-control-negative .control-item{color:#d9534f;border-color:inherit}.segmented-control-negative .control-item:active{background-color:#f9e2e2}.segmented-control-negative .control-item.active{color:#fff;background-color:#d9534f}.control-content{display:none}.control-content.active{display:block}.popover{position:fixed;top:55px;left:50%;z-index:20;display:none;width:280px;margin-left:-140px;background-color:#fff;border-radius:6px;-webkit-box-shadow:0 0 15px rgba(0,0,0,.1);box-shadow:0 0 15px rgba(0,0,0,.1);opacity:0;-webkit-transition:all .25s linear;-moz-transition:all .25s linear;transition:all .25s linear;-webkit-transform:translate3d(0,-15px,0);-ms-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}.popover:before{position:absolute;top:-15px;left:50%;width:0;height:0;margin-left:-15px;content:'';border-right:15px solid transparent;border-bottom:15px solid #fff;border-left:15px solid transparent}.popover.visible{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.popover .bar~.table-view{padding-top:44px}.backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:15;background-color:rgba(0,0,0,.3)}.popover .btn-block{margin-bottom:5px}.popover .btn-block:last-child{margin-bottom:0}.popover .bar-nav{border-bottom:1px solid #ddd;border-top-left-radius:12px;border-top-right-radius:12px;-webkit-box-shadow:none;box-shadow:none}.popover .table-view{max-height:300px;margin-bottom:0;overflow:auto;-webkit-overflow-scrolling:touch;background-color:#fff;border-top:0;border-bottom:0;border-radius:6px}.modal{position:fixed;top:0;z-index:11;width:100%;min-height:100%;overflow:hidden;background-color:#fff;opacity:0;-webkit-transition:-webkit-transform .25s,opacity 1ms .25s;-moz-transition:-moz-transform .25s,opacity 1ms .25s;transition:transform .25s,opacity 1ms .25s;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.modal.active{height:100%;opacity:1;-webkit-transition:-webkit-transform .25s;-moz-transition:-moz-transform .25s;transition:transform .25s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slider{width:100%;overflow:hidden;background-color:#000}.slider .slide-group{position:relative;font-size:0;white-space:nowrap;-webkit-transition:all 0s linear;-moz-transition:all 0s linear;transition:all 0s linear}.slider .slide-group .slide{display:inline-block;width:100%;height:100%;font-size:14px;vertical-align:top}.toggle{position:relative;display:block;width:74px;height:30px;background-color:#fff;border:2px solid #ddd;border-radius:20px;-webkit-transition-duration:.2s;-moz-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border;-moz-transition-property:background-color,border;transition-property:background-color,border}.toggle .toggle-handle{position:absolute;top:-1px;left:-1px;z-index:2;width:28px;height:28px;background-color:#fff;border:1px solid #ddd;border-radius:100px;-webkit-transition-duration:.2s;-moz-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:-webkit-transform,border,width;-moz-transition-property:-moz-transform,border,width;transition-property:transform,border,width}.toggle:before{position:absolute;top:3px;right:11px;font-size:13px;color:#999;text-transform:uppercase;content:"Off"}.toggle.active{background-color:#5cb85c;border:2px solid #5cb85c}.toggle.active .toggle-handle{border-color:#5cb85c;-webkit-transform:translate3d(44px,0,0);-ms-transform:translate3d(44px,0,0);transform:translate3d(44px,0,0)}.toggle.active:before{right:auto;left:15px;color:#fff;content:"On"}.toggle input[type=checkbox]{display:none}.content.fade{left:0;opacity:0}.content.fade.in{opacity:1}.content.sliding{z-index:2;-webkit-transition:-webkit-transform .4s;-moz-transition:-moz-transform .4s;transition:transform .4s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.content.sliding.left{z-index:1;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.content.sliding.right{z-index:3;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.navigate-left:after,.navigate-right:after,.push-left:after,.push-right:after{position:absolute;top:50%;display:inline-block;font-family:Ratchicons;font-size:inherit;line-height:1;color:#bbb;text-decoration:none;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-font-smoothing:antialiased}.navigate-left:after,.push-left:after{left:15px;content:'\e822'}.navigate-right:after,.push-right:after{right:15px;content:'\e826'}@font-face{font-family:Ratchicons;font-style:normal;font-weight:400;src:url(../fonts/ratchicons.eot);src:url(../fonts/ratchicons.eot?#iefix) format("embedded-opentype"),url(../fonts/ratchicons.woff) format("woff"),url(../fonts/ratchicons.ttf) format("truetype"),url(../fonts/ratchicons.svg#svgFontName) format("svg")}.icon{display:inline-block;font-family:Ratchicons;font-size:24px;line-height:1;text-decoration:none;-webkit-font-smoothing:antialiased}.icon-back:before{content:'\e80a'}.icon-bars:before{content:'\e80e'}.icon-caret:before{content:'\e80f'}.icon-check:before{content:'\e810'}.icon-close:before{content:'\e811'}.icon-code:before{content:'\e812'}.icon-compose:before{content:'\e813'}.icon-download:before{content:'\e815'}.icon-edit:before{content:'\e829'}.icon-forward:before{content:'\e82a'}.icon-gear:before{content:'\e821'}.icon-home:before{content:'\e82b'}.icon-info:before{content:'\e82c'}.icon-list:before{content:'\e823'}.icon-more-vertical:before{content:'\e82e'}.icon-more:before{content:'\e82f'}.icon-pages:before{content:'\e824'}.icon-pause:before{content:'\e830'}.icon-person:before{content:'\e832'}.icon-play:before{content:'\e816'}.icon-plus:before{content:'\e817'}.icon-refresh:before{content:'\e825'}.icon-search:before{content:'\e819'}.icon-share:before{content:'\e81a'}.icon-sound:before{content:'\e827'}.icon-sound2:before{content:'\e828'}.icon-sound3:before{content:'\e80b'}.icon-sound4:before{content:'\e80c'}.icon-star-filled:before{content:'\e81b'}.icon-star:before{content:'\e81c'}.icon-stop:before{content:'\e81d'}.icon-trash:before{content:'\e81e'}.icon-up-nav:before{content:'\e81f'}.icon-up:before{content:'\e80d'}.icon-right-nav:before{content:'\e818'}.icon-right:before{content:'\e826'}.icon-down-nav:before{content:'\e814'}.icon-down:before{content:'\e820'}.icon-left-nav:before{content:'\e82d'}.icon-left:before{content:'\e822'} -------------------------------------------------------------------------------- /detail.tmpl: -------------------------------------------------------------------------------- 1 |
2 | 3 | 7 | 8 |

{{name}}

9 | 12 |
13 |
14 | 48 |
49 | -------------------------------------------------------------------------------- /fonts/ratchicons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/fonts/ratchicons.eot -------------------------------------------------------------------------------- /fonts/ratchicons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Copyright (C) 2014 by original authors @ fontello.com 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /fonts/ratchicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/fonts/ratchicons.ttf -------------------------------------------------------------------------------- /fonts/ratchicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/fonts/ratchicons.woff -------------------------------------------------------------------------------- /images/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/images/Icon.png -------------------------------------------------------------------------------- /images/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/images/Icon@2x.png -------------------------------------------------------------------------------- /images/Monu.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/images/Monu.icns -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var fs = require('fs') 3 | 4 | var menubar = require('menubar') 5 | var ms = require('ms') 6 | var Mongroup = require('mongroup') 7 | var mkdir = require('mkdirp').sync 8 | var debug = require('debug')('monu') 9 | var shell = require('shell') 10 | var dialog = require('dialog') 11 | 12 | // try to fix the $PATH on OS X 13 | require('fix-path')() 14 | 15 | // use current user env (https://github.com/sindresorhus/shell-path/issues/7) 16 | try { 17 | process.env = require('user-env')() 18 | } catch (e) {} 19 | 20 | var Server = require('electron-rpc/server') 21 | var app = new Server() 22 | 23 | var opts = {dir: __dirname, icon: path.join(__dirname, 'images', 'Icon.png')} 24 | var menu = menubar(opts) 25 | var conf 26 | 27 | process.on('uncaughtException', function (err) { 28 | dialog.showErrorBox('Uncaught Exception: ' + err.message, err.stack || '') 29 | menu.app.quit() 30 | }) 31 | 32 | menu.on('ready', function ready () { 33 | conf = loadConfig() 34 | var canQuit = false 35 | menu.app.on('will-quit', function tryQuit (e) { 36 | if (canQuit) return true 37 | menu.window = undefined 38 | e.preventDefault() 39 | }) 40 | 41 | // start all once 42 | start([], function started (err) { 43 | if (err) return console.log('error starting processes: ' + err.message) 44 | console.log('started all processes') 45 | }) 46 | 47 | menu.on('show', function show () { 48 | app.configure(menu.window.webContents) 49 | app.send('show') 50 | }) 51 | 52 | app.on('terminate', function terminate (ev) { 53 | canQuit = true 54 | menu.app.terminate() 55 | }) 56 | 57 | app.on('open-dir', function openDir (ev) { 58 | shell.showItemInFolder(path.join(conf.exec.cwd, 'config.json')) 59 | }) 60 | 61 | app.on('open-logs-dir', function openLogsDir (req) { 62 | shell.showItemInFolder(path.join(conf.logs, req.body.name + '.log')) 63 | }) 64 | 65 | app.on('get-all', function getAll (req, next) { 66 | next(null, getProcessesStatus()) 67 | }) 68 | 69 | app.on('get-one', function getOne (req, next) { 70 | next(null, getProcessStatus(req.body.name)) 71 | }) 72 | 73 | app.on('task', function task (req, next) { 74 | if (req.body.task === 'startAll') start([], updateAll) 75 | if (req.body.task === 'stopAll') stop([], req.body.signal, updateAll) 76 | if (req.body.task === 'restartAll') restart([], updateAll) 77 | if (req.body.task === 'start') start([req.body.name], updateSingle) 78 | if (req.body.task === 'stop') stop([req.body.name], req.body.signal, updateSingle) 79 | if (req.body.task === 'restart') restart([req.body.name], updateSingle) 80 | 81 | function updateAll (err) { 82 | if (err) throw err 83 | next(null, getProcessesStatus()) 84 | } 85 | 86 | function updateSingle (err) { 87 | if (err) throw err 88 | next(null, getProcessStatus(req.body.name)) 89 | } 90 | }) 91 | }) 92 | 93 | function loadConfig () { 94 | var dir = path.join(menu.app.getPath('userData'), 'data') 95 | var configFile = dir + '/config.json' 96 | var conf, data 97 | 98 | try { 99 | data = fs.readFileSync(configFile) 100 | } catch (e) { 101 | if (e.code === 'ENOENT') { 102 | mkdir(dir) 103 | fs.writeFileSync(configFile, fs.readFileSync(__dirname + '/config.json')) 104 | return loadConfig() 105 | } else { 106 | throw e 107 | } 108 | } 109 | 110 | try { 111 | conf = JSON.parse(data.toString()) 112 | } catch (e) { 113 | var code = dialog.showMessageBox({ 114 | message: 'Invalid configuration file\nCould not parse JSON', 115 | detail: e.stack, 116 | buttons: ['Reload Config', 'Exit app'] 117 | }) 118 | if (code === 0) { 119 | return loadConfig() 120 | } else { 121 | menu.app.quit() 122 | return 123 | } 124 | } 125 | 126 | conf.exec = {cwd: dir} 127 | conf.logs = path.resolve(path.join(dir, conf.logs || 'logs')) 128 | conf.pids = path.resolve(path.join(dir, conf.pids || 'pids')) 129 | 130 | mkdir(conf.logs) 131 | mkdir(conf.pids) 132 | 133 | conf.mon = path.join(__dirname, 'mon') 134 | return conf 135 | } 136 | 137 | function getProcessStatus (procName) { 138 | var procs = getProcessesStatus() 139 | return procs.filter(function filter (proc) { 140 | return proc.name === procName 141 | })[0] 142 | } 143 | 144 | function getProcessesStatus () { 145 | debug('reload config, get proc status...') 146 | conf = loadConfig() 147 | var group = new Mongroup(conf) 148 | var procs = group.procs 149 | 150 | return procs.map(function each (proc) { 151 | var uptime, state = proc.state() 152 | if (state === 'alive') uptime = ms(Date.now() - proc.mtime(), { long: true }) 153 | var item = { 154 | cmd: proc.cmd, 155 | name: proc.name, 156 | state: state, 157 | pid: proc.pid, 158 | uptime: uptime ? uptime : undefined 159 | } 160 | 161 | return item 162 | }) 163 | } 164 | 165 | function restart (procs, cb) { 166 | stop(procs, 'SIGQUIT', function onstop (err1) { 167 | start(procs, function onstart (err2) { 168 | if (cb) cb(err1 || err2) 169 | }) 170 | }) 171 | } 172 | 173 | function start (procs, cb) { 174 | var group = new Mongroup(conf) 175 | group.start(procs, function onstart (err) { 176 | if (err) return cb(err) 177 | cb() 178 | }) 179 | } 180 | 181 | function stop (procs, signal, cb) { 182 | if (!signal) signal = 'SIGQUIT' 183 | var group = new Mongroup(conf) 184 | group.stop(procs, signal, function onstop (err) { 185 | if (!err || err.code === 'ENOENT') return cb() 186 | cb(err) 187 | }) 188 | } 189 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | publish: 2 | -rm -rf Monu.app Monu.zip # prevent duplicates in the final bundle 3 | npm run build 4 | @# ditto creates a much better compressed zip file compared to the zip command 5 | @# these flags come from ditto's man page on how to create an archive in the 6 | @# same manner as Finder's compress option 7 | ditto -c -k --sequesterRsrc --keepParent Monu.app Monu.zip 8 | npm run publish 9 | .PHONY: publish 10 | -------------------------------------------------------------------------------- /mon: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/mon -------------------------------------------------------------------------------- /notes.md: -------------------------------------------------------------------------------- 1 | Replace with release notes 2 | 3 | On first launch you will probably have to **Right Click > Open** Monu.app in order to bypass the Mac OS warning. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "monu", 3 | "productName": "Monu", 4 | "version": "1.3.0", 5 | "description": "menubar process monitor mac app", 6 | "main": "index.js", 7 | "scripts": { 8 | "test": "standard", 9 | "start": "electron ./", 10 | "build": "electron-packager . Monu --platform=darwin --arch=x64 --version=0.36.4 --icon=images/Monu.icns", 11 | "publish": "publish-release --template notes.md --assets Monu.zip" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/maxogden/monu" 16 | }, 17 | "author": "max ogden", 18 | "license": "BSD-2-Clause", 19 | "dependencies": { 20 | "debug": "^2.1.3", 21 | "electron-rpc": "^1.0.0", 22 | "fix-path": "^1.1.0", 23 | "menubar": "^2.0.0", 24 | "mkdirp": "^0.5.0", 25 | "mongroup": "maxogden/node-mongroup#monbin", 26 | "ms": "^0.7.0", 27 | "page": "^1.6.1", 28 | "ractive": "^0.7.1", 29 | "user-env": "^2.0.0" 30 | }, 31 | "devDependencies": { 32 | "electron-packager": "^4.0.0", 33 | "electron-prebuilt": "^0.36.4", 34 | "publish-release": "^1.0.1", 35 | "standard": "^3.2.1" 36 | }, 37 | "standard": { 38 | "ignore": [ 39 | "Monu.app/**" 40 | ] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ### Monu 2 | 3 | ![app.png](app.png) 4 | 5 | Monu is an open source process monitoring menu bar application for Mac OS. You can configure Monu to launch programs, and when Monu starts up it will start them. Additionally, it will monitor the processes and restart them if they crash. 6 | 7 | Monu is a portmanteau of 'monitor' and 'menu'. It has two C/C++ dependencies, [Electron](https://github.com/atom/electron) (which includes iojs) and the [mon](https://github.com/tj/mon) process monitor. 8 | 9 | Monu is currently **ALPHA STATUS** and is intended for developers/early adopters. 10 | 11 | To download the latest version visit the [releases page](https://github.com/maxogden/monu/releases) 12 | 13 | [![js-standard-style](https://raw.githubusercontent.com/feross/standard/master/badge.png)](https://github.com/feross/standard) 14 | 15 | [![Build Status](https://travis-ci.org/maxogden/monu.svg?branch=master)](https://travis-ci.org/maxogden/monu) 16 | 17 | ![screenshot.png](screenshot.png) 18 | 19 | ##### How to use Monu 20 | 21 | To configure Monu, click 'Open Config Folder' and open 'config.json' in a text editor. When you save and return to Monu your new configuration will be automatically loaded. 22 | 23 | Be sure your JSON syntax is valid when editing the configuration. Here are supported options. These should be added as top level key/value pairs to 'config.json': 24 | 25 | 35 | 36 | ##### Adding Processes 37 | 38 | In the 'config.json' file add processes to the 'processes' key. The key must be a name (lowercase letters and hypens) and the value must be the launch command. For example: 39 | 40 | ```json 41 | { 42 | "logs": "./logs", 43 | "pids": "./pids", 44 | "processes": { 45 | "web-1": "http-server . -p 8081", 46 | "web-2": "http-server . -p 8082", 47 | "web-3": "http-server . -p 8083" 48 | } 49 | } 50 | ``` 51 | 52 | ##### Launch on Startup 53 | 54 | When you open Monu.app, it will start all configured processes. 55 | 56 | If you would like Monu.app to start when your Mac starts up, got to System Preferences > Users and Groups and add Monu.app to Login Items for your User. 57 | 58 | ##### Developing 59 | 60 | ```bash 61 | npm install # installs electron and all the deps needed for monu 62 | npm start # runs the app in the electron wrapper 63 | npm run build # builds the mac app 64 | ``` 65 | 66 | ##### Publishing 67 | 68 | Before publishing, make sure that your repo is clean, and that you've created a tag for the latest commit. `npm version [major|minor|patch]` will do this for you, increasing the package.json version, creating a commit and adding a tag. 69 | 70 | You should see something like this: 71 | 72 | ``` 73 | 🐈 make publish 74 | rm -rf Monu.app Monu.zip # prevent duplicates in the final bundle 75 | npm run build 76 | 77 | > monu@1.0.4 build /Users/maxogden/src/js/monu 78 | > electron-packager . Monu --platform=darwin --arch=x64 --version=0.26.0 --ignore=node_modules/electron 79 | 80 | Wrote new app to /Users/maxogden/src/js/monu/Monu.app 81 | ditto -c -k --sequesterRsrc --keepParent Monu.app Monu.zip 82 | npm run publish 83 | 84 | > monu@1.0.4 publish /Users/maxogden/src/js/monu 85 | > publish-release --template notes.md --assets Monu.zip 86 | 87 | ? Git Tag: v1.0.4 88 | ? Github repository owner: maxogden 89 | ? Github repository name: monu 90 | ? Release Name: Monu v1.0.4 Alpha 91 | 92 | Uploading Monu.zip 93 | [=================================================>] 100.0% (1.17 MB/s) 94 | Done! Published at: https://github.com/maxogden/monu/releases/tag/v1.0.4 95 | ``` 96 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-mapper/monu/b04718c3516842875251c126df4f8983f4e264ff/screenshot.png --------------------------------------------------------------------------------