├── .gitignore ├── README.md ├── app ├── bower_components │ ├── angular │ │ ├── .bower.json │ │ ├── angular.js │ │ ├── angular.min.js │ │ └── bower.json │ ├── bootstrap │ │ ├── .bower.json │ │ ├── CNAME │ │ ├── CONTRIBUTING.md │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── _config.yml │ │ ├── _includes │ │ │ ├── ads.html │ │ │ ├── footer.html │ │ │ ├── header.html │ │ │ ├── nav-components.html │ │ │ ├── nav-css.html │ │ │ ├── nav-customize.html │ │ │ ├── nav-getting-started.html │ │ │ ├── nav-javascript.html │ │ │ ├── nav-main.html │ │ │ ├── old-bs-docs.html │ │ │ └── social-buttons.html │ │ ├── _layouts │ │ │ ├── default.html │ │ │ └── home.html │ │ ├── assets │ │ │ ├── css │ │ │ │ ├── docs.css │ │ │ │ └── pygments-manni.css │ │ │ ├── ico │ │ │ │ ├── apple-touch-icon-114-precomposed.png │ │ │ │ ├── apple-touch-icon-144-precomposed.png │ │ │ │ ├── apple-touch-icon-57-precomposed.png │ │ │ │ ├── apple-touch-icon-72-precomposed.png │ │ │ │ └── favicon.png │ │ │ └── js │ │ │ │ ├── application.js │ │ │ │ ├── customizer.js │ │ │ │ ├── filesaver.js │ │ │ │ ├── holder.js │ │ │ │ ├── html5shiv.js │ │ │ │ ├── jquery.js │ │ │ │ ├── jszip.js │ │ │ │ ├── less.js │ │ │ │ ├── raw-files.js │ │ │ │ ├── respond.min.js │ │ │ │ └── uglify.js │ │ ├── bower.json │ │ ├── browserstack.json │ │ ├── components.html │ │ ├── composer.json │ │ ├── css.html │ │ ├── customize.html │ │ ├── dist │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap.css │ │ │ │ └── bootstrap.min.css │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── js │ │ │ │ ├── bootstrap.js │ │ │ │ └── bootstrap.min.js │ │ ├── examples │ │ │ ├── carousel │ │ │ │ ├── carousel.css │ │ │ │ └── index.html │ │ │ ├── grid │ │ │ │ ├── grid.css │ │ │ │ └── index.html │ │ │ ├── jumbotron-narrow │ │ │ │ ├── index.html │ │ │ │ └── jumbotron-narrow.css │ │ │ ├── jumbotron │ │ │ │ ├── index.html │ │ │ │ └── jumbotron.css │ │ │ ├── justified-nav │ │ │ │ ├── index.html │ │ │ │ └── justified-nav.css │ │ │ ├── navbar-fixed-top │ │ │ │ ├── index.html │ │ │ │ └── navbar-fixed-top.css │ │ │ ├── navbar-static-top │ │ │ │ ├── index.html │ │ │ │ └── navbar-static-top.css │ │ │ ├── navbar │ │ │ │ ├── index.html │ │ │ │ └── navbar.css │ │ │ ├── non-responsive │ │ │ │ ├── index.html │ │ │ │ └── non-responsive.css │ │ │ ├── offcanvas │ │ │ │ ├── index.html │ │ │ │ ├── offcanvas.css │ │ │ │ └── offcanvas.js │ │ │ ├── screenshots │ │ │ │ ├── carousel.jpg │ │ │ │ ├── grid.jpg │ │ │ │ ├── jumbotron-narrow.jpg │ │ │ │ ├── jumbotron.jpg │ │ │ │ ├── justified-nav.jpg │ │ │ │ ├── navbar-fixed.jpg │ │ │ │ ├── navbar-static.jpg │ │ │ │ ├── navbar.jpg │ │ │ │ ├── non-responsive.jpg │ │ │ │ ├── offcanvas.jpg │ │ │ │ ├── sign-in.jpg │ │ │ │ ├── starter-template.jpg │ │ │ │ ├── sticky-footer-navbar.jpg │ │ │ │ ├── sticky-footer.jpg │ │ │ │ └── theme.jpg │ │ │ ├── signin │ │ │ │ ├── index.html │ │ │ │ └── signin.css │ │ │ ├── starter-template │ │ │ │ ├── index.html │ │ │ │ └── starter-template.css │ │ │ ├── sticky-footer-navbar │ │ │ │ ├── index.html │ │ │ │ └── sticky-footer-navbar.css │ │ │ ├── sticky-footer │ │ │ │ ├── index.html │ │ │ │ └── sticky-footer.css │ │ │ └── theme │ │ │ │ ├── index.html │ │ │ │ └── theme.css │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ ├── getting-started.html │ │ ├── index.html │ │ ├── javascript.html │ │ ├── js │ │ │ ├── affix.js │ │ │ ├── alert.js │ │ │ ├── button.js │ │ │ ├── carousel.js │ │ │ ├── collapse.js │ │ │ ├── dropdown.js │ │ │ ├── modal.js │ │ │ ├── popover.js │ │ │ ├── scrollspy.js │ │ │ ├── tab.js │ │ │ ├── tests │ │ │ │ ├── index.html │ │ │ │ ├── phantom.js │ │ │ │ ├── server.js │ │ │ │ ├── unit │ │ │ │ │ ├── affix.js │ │ │ │ │ ├── alert.js │ │ │ │ │ ├── button.js │ │ │ │ │ ├── carousel.js │ │ │ │ │ ├── collapse.js │ │ │ │ │ ├── dropdown.js │ │ │ │ │ ├── modal.js │ │ │ │ │ ├── phantom.js │ │ │ │ │ ├── popover.js │ │ │ │ │ ├── scrollspy.js │ │ │ │ │ ├── tab.js │ │ │ │ │ ├── tooltip.js │ │ │ │ │ └── transition.js │ │ │ │ └── vendor │ │ │ │ │ ├── jquery.js │ │ │ │ │ ├── qunit.css │ │ │ │ │ └── qunit.js │ │ │ ├── tooltip.js │ │ │ └── transition.js │ │ ├── less │ │ │ ├── alerts.less │ │ │ ├── badges.less │ │ │ ├── bootstrap.less │ │ │ ├── breadcrumbs.less │ │ │ ├── button-groups.less │ │ │ ├── buttons.less │ │ │ ├── carousel.less │ │ │ ├── close.less │ │ │ ├── code.less │ │ │ ├── component-animations.less │ │ │ ├── dropdowns.less │ │ │ ├── forms.less │ │ │ ├── glyphicons.less │ │ │ ├── grid.less │ │ │ ├── input-groups.less │ │ │ ├── jumbotron.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── media.less │ │ │ ├── mixins.less │ │ │ ├── modals.less │ │ │ ├── navbar.less │ │ │ ├── navs.less │ │ │ ├── normalize.less │ │ │ ├── pager.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── popovers.less │ │ │ ├── print.less │ │ │ ├── progress-bars.less │ │ │ ├── responsive-utilities.less │ │ │ ├── scaffolding.less │ │ │ ├── tables.less │ │ │ ├── theme.less │ │ │ ├── thumbnails.less │ │ │ ├── tooltip.less │ │ │ ├── type.less │ │ │ ├── utilities.less │ │ │ ├── variables.less │ │ │ └── wells.less │ │ └── package.json │ └── jquery │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── component.json │ │ ├── composer.json │ │ ├── jquery-migrate.js │ │ ├── jquery-migrate.min.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ └── package.json ├── index.html ├── scripts │ ├── app.js │ ├── controllers │ │ └── Main.js │ └── directives │ │ └── angular-better-placeholder.js └── views │ └── main.html ├── bower.json └── src ├── angular-better-placeholders.coffee ├── angular-better-placeholders.css ├── angular-better-placeholders.js └── angular-better-placeholders.styl /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Stories in Ready](https://badge.waffle.io/dmackerman/angular-better-placeholders.png?label=ready&title=Ready)](https://waffle.io/dmackerman/angular-better-placeholders) 2 | # Angular Better Placeholders 3 | 4 | An [AngularJS](http://angularjs.org/) directive to improve `input` placeholders. Based on a concept found on Dribble: 5 | http://dribbble.com/shots/1254439--GIF-Mobile-Form-Interaction?list=users 6 | 7 | ![Dribble GIF](http://dribbble.s3.amazonaws.com/users/6410/screenshots/1254439/form-animation-_gif_.gif) 8 | 9 | [Check out the website](http://dmackerman.github.io/angular-better-placeholders/#/) 10 | 11 | ## Installation 12 | ``` bash 13 | $ bower install angular-better-placeholders 14 | ``` 15 | 16 | 17 | ## Usage 18 | Simple include the `better-place-holder` directive as a class on your input fields. (if it doesn't look right make sure that it's container element has `position: relative` set on it) 19 | 20 | ``` html 21 | 22 | ``` 23 | 24 | Include the following CSS snipets: 25 | 26 | ``` css 27 | .better-placeholder { 28 | -webkit-transition: all 0.5s ease; 29 | transition: all 0.5s ease; 30 | } 31 | .better-placeholder::-webkit-input-placeholder { 32 | display: none; 33 | opacity: 0; 34 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 35 | filter: alpha(opacity=0); 36 | } 37 | .better-placeholder::-moz-placeholder { 38 | display: none; 39 | opacity: 0; 40 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 41 | filter: alpha(opacity=0); 42 | } 43 | .better-placeholder:-ms-input-placeholder { 44 | display: none; 45 | opacity: 0; 46 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 47 | filter: alpha(opacity=0); 48 | } 49 | .better-placeholder::placeholder { 50 | display: none; 51 | opacity: 0; 52 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 53 | filter: alpha(opacity=0); 54 | } 55 | .better-placeholder.better-placeholder-active { 56 | padding: 18px 12px 6px 12px; 57 | height: auto; 58 | } 59 | .has-error .better-placeholder-text { 60 | color: #a94442; 61 | } 62 | .has-error .better-placeholder-text.active { 63 | color: #a94442; 64 | } 65 | .has-success .better-placeholder-text { 66 | color: #3c763d; 67 | } 68 | .has-success .better-placeholder-text.active { 69 | color: #3c763d; 70 | } 71 | .has-warning .better-placeholder-text { 72 | color: #8a6d3b; 73 | } 74 | .has-warning .better-placeholder-text.active { 75 | color: #8a6d3b; 76 | } 77 | .better-placeholder-text { 78 | -webkit-transition: all 0.5s ease; 79 | transition: all 0.5s ease; 80 | position: absolute; 81 | top: 2px; 82 | margin-left: 12px; 83 | line-height: 20px; 84 | height: 20px; 85 | color: #888; 86 | -webkit-transform-origin: 0 0; 87 | -ms-transform-origin: 0 0; 88 | transform-origin: 0 0; 89 | max-width: 85%; 90 | /* You have to fiddle with this and it .active replacement depending on size of field */ 91 | margin-right: 12px; 92 | white-space: nowrap; 93 | overflow: hidden; 94 | -o-text-overflow: ellipsis; 95 | text-overflow: ellipsis; 96 | } 97 | .better-placeholder-text.active { 98 | max-width: 110%; 99 | visibility: visible; 100 | -webkit-transform: scale(0.8); 101 | -ms-transform: scale(0.8); 102 | transform: scale(0.8); 103 | -webkit-transform-origin: 0 0; 104 | -ms-transform-origin: 0 0; 105 | transform-origin: 0 0; 106 | color: #428bca; 107 | top: -2px; 108 | } 109 | ``` 110 | 111 | ## Example 112 | - http://dmackerman.github.io/angular-better-placeholders/ 113 | -------------------------------------------------------------------------------- /app/bower_components/angular/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.0.8", 4 | "main": "./angular.js", 5 | "dependencies": {}, 6 | "homepage": "https://github.com/angular/bower-angular", 7 | "_release": "1.0.8", 8 | "_resolution": { 9 | "type": "version", 10 | "tag": "v1.0.8", 11 | "commit": "b2006330eef656b8e89a883feff7d7d2f3e5afed" 12 | }, 13 | "_source": "git://github.com/angular/bower-angular.git", 14 | "_target": "~1.0.8", 15 | "_originalSource": "angular", 16 | "_direct": true 17 | } -------------------------------------------------------------------------------- /app/bower_components/angular/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "version": "1.0.8", 4 | "main": "./angular.js", 5 | "dependencies": { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "3.0.0", 4 | "main": [ 5 | "./dist/js/bootstrap.js", 6 | "./dist/css/bootstrap.css" 7 | ], 8 | "ignore": [ 9 | "**/.*" 10 | ], 11 | "dependencies": { 12 | "jquery": ">= 1.9.0" 13 | }, 14 | "homepage": "https://github.com/twbs/bootstrap", 15 | "_release": "3.0.0", 16 | "_resolution": { 17 | "type": "version", 18 | "tag": "v3.0.0", 19 | "commit": "e8a1df5f060bf7e6631554648e0abde150aedbe4" 20 | }, 21 | "_source": "git://github.com/twbs/bootstrap.git", 22 | "_target": "~3.0.0", 23 | "_originalSource": "bootstrap", 24 | "_direct": true 25 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/CNAME: -------------------------------------------------------------------------------- 1 | getbootstrap.com 2 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Bootstrap 2 | 3 | Looking to contribute something to Bootstrap? **Here's how you can help.** 4 | 5 | 6 | 7 | ## Reporting issues 8 | 9 | We only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Bootstrap core. Please read the following guidelines before opening any issue. 10 | 11 | 1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available. 12 | 2. **Create an isolated and reproducible test case.** Be sure the problem exists in Bootstrap's code with a [reduced test case](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report. 13 | 3. **Include a live example.** Make use of jsFiddle or jsBin to share your isolated test cases. 14 | 4. **Share as much information as possible.** Include operating system and version, browser and version, version of Bootstrap, customized or vanilla build, etc. where appropriate. Also include steps to reproduce the bug. 15 | 16 | 17 | 18 | ## Key branches 19 | 20 | - `master` is the latest, deployed version. 21 | - `gh-pages` is the hosted docs (not to be used for pull requests). 22 | - `*-wip` is the official work in progress branch for the next release. 23 | 24 | 25 | 26 | ## Pull requests 27 | 28 | - Try to submit pull requests against the latest `*-wip` branch for easier merging 29 | - CSS changes must be done in .less files first, never just the compiled files 30 | - If modifying the .less files, always recompile and commit the compiled files bootstrap.css and bootstrap.min.css 31 | - Try not to pollute your pull request with unintended changes--keep them simple and small 32 | - Try to share which browsers your code has been tested in before submitting a pull request 33 | 34 | 35 | 36 | ## Coding standards 37 | 38 | ### HTML 39 | 40 | - Two spaces for indentation, never tabs 41 | - Double quotes only, never single quotes 42 | - Always use proper indentation 43 | - Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags) 44 | 45 | ### CSS 46 | 47 | - Adhere to the [Recess CSS property order](http://markdotto.com/2011/11/29/css-property-order/) 48 | - Multiple-line approach (one property and value per line) 49 | - Always a space after a property's colon (.e.g, `display: block;` and not `display:block;`) 50 | - End all lines with a semi-colon 51 | - For multiple, comma-separated selectors, place each selector on its own line 52 | - Attribute selectors, like `input[type="text"]` should always wrap the attribute's value in double quotes, for consistency and safety (see this [blog post on unquoted attribute values](http://mathiasbynens.be/notes/unquoted-attribute-values) that can lead to XSS attacks). 53 | 54 | ### JS 55 | 56 | - No semicolons 57 | - Comma first 58 | - 2 spaces (no tabs) 59 | - strict mode 60 | - "Attractive" 61 | 62 | 63 | 64 | ## License 65 | 66 | By contributing your code, you agree to license your contribution under the terms of the APLv2: https://github.com/twbs/bootstrap/blob/master/LICENSE 67 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_config.yml: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | markdown: rdiscount 3 | pygments: true 4 | 5 | # Permalinks 6 | permalink: pretty 7 | 8 | # Server 9 | destination: ./_gh_pages 10 | exclude: [".editorconfig", ".gitignore", ".ruby-version", "bower.json", "composer.json", "CONTRIBUTING.md", "CNAME", "LICENSE", "Gruntfile.js", "package.json", "node_modules", "README.md", "less"] 11 | port: 9001 12 | 13 | # Custom vars 14 | repo: https://github.com/twbs/bootstrap 15 | download: https://github.com/twbs/bootstrap/archive/v3.0.0.zip 16 | download_dist: https://github.com/twbs/bootstrap/releases/download/v3.0.0/bootstrap-3.0.0-dist.zip 17 | 18 | blog: http://blog.getbootstrap.com 19 | expo: http://expo.getbootstrap.com 20 | 21 | cdn_css: //netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css 22 | cdn_theme_css: //netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css 23 | cdn_js: //netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js 24 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/ads.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/footer.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% if page.slug == "customize" %} 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% endif %} 20 | 21 | 23 | 35 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% if page.title == "Bootstrap" %} 8 | {{ page.title }} 9 | {% else if %} 10 | {{ page.title }} · Bootstrap 11 | {% endif %} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 44 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/nav-css.html: -------------------------------------------------------------------------------- 1 |
  • 2 | Overview 3 | 11 |
  • 12 |
  • 13 | Grid system 14 | 26 |
  • 27 |
  • 28 | Typography 29 | 38 |
  • 39 |
  • Code
  • 40 |
  • 41 | Tables 42 | 51 |
  • 52 |
  • 53 | Forms 54 | 64 |
  • 65 |
  • 66 | Buttons 67 | 73 |
  • 74 |
  • 75 | Images 76 |
  • 77 |
  • 78 | Helper classes 79 |
  • 80 |
  • 81 | Responsive utilities 82 | 87 |
  • 88 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/nav-customize.html: -------------------------------------------------------------------------------- 1 |
  • 2 | LESS components 3 |
  • 4 |
  • 5 | jQuery plugins 6 |
  • 7 |
  • 8 | LESS variables 9 | 37 |
  • 38 |
  • 39 | Download 40 |
  • 41 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/nav-getting-started.html: -------------------------------------------------------------------------------- 1 |
  • 2 | Download Bootstrap 3 | 8 |
  • 9 |
  • 10 | What's included 11 |
  • 12 |
  • 13 | Basic template 14 |
  • 15 |
  • 16 | Examples 17 |
  • 18 |
  • 19 | Disabling responsiveness 20 |
  • 21 |
  • 22 | Migrating from 2.x to 3.0 23 | 29 |
  • 30 |
  • 31 | Browser support 32 |
  • 33 |
  • 34 | Third party support 35 |
  • 36 |
  • 37 | Accessibility 38 |
  • 39 |
  • 40 | License FAQs 41 |
  • 42 |
  • 43 | Customizing Bootstrap 44 |
  • 45 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/nav-javascript.html: -------------------------------------------------------------------------------- 1 |
  • 2 | Overview 3 | 10 |
  • 11 |
  • Transitions
  • 12 |
  • 13 | Modal 14 | 18 |
  • 19 |
  • 20 | Dropdown 21 | 25 |
  • 26 |
  • 27 | Scrollspy 28 | 32 |
  • 33 |
  • 34 | Tab 35 | 39 |
  • 40 |
  • 41 | Tooltip 42 | 46 |
  • 47 |
  • 48 | Popover 49 | 53 |
  • 54 |
  • 55 | Alert 56 | 60 |
  • 61 |
  • 62 | Button 63 | 67 |
  • 68 |
  • 69 | Collapse 70 | 74 |
  • 75 |
  • 76 | Carousel 77 | 81 |
  • 82 |
  • 83 | Affix 84 | 88 |
  • 89 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/nav-main.html: -------------------------------------------------------------------------------- 1 | 33 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/old-bs-docs.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 4 | Looking for Bootstrap 2.3.2 docs? 5 | 6 | We've moved it to a new home while we push forward with Bootstrap 3. Read the blog for details. 7 |
    8 |
    9 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_includes/social-buttons.html: -------------------------------------------------------------------------------- 1 |
    2 | 16 |
    17 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% include header.html %} 6 | 7 | 8 | 9 | Skip navigation 10 | 11 | 12 | {% include nav-main.html %} 13 | 14 | 15 |
    16 |
    17 |

    {{ page.title }}

    18 |

    {{ page.lead }}

    19 | {% include ads.html %} 20 |
    21 |
    22 | 23 | 24 | {% include old-bs-docs.html %} 25 | 26 |
    27 |
    28 |
    29 | 44 |
    45 |
    46 | {{ content }} 47 |
    48 |
    49 | 50 |
    51 | 52 | 54 | 71 | 72 | 73 | {% include footer.html %} 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/_layouts/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% include header.html %} 6 | 7 | 8 | 9 | Skip navigation 10 | 11 | 12 | {% include nav-main.html %} 13 | 14 | 15 | {{ content }} 16 | 17 | 41 | 42 | 43 | {% include footer.html %} 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/css/pygments-manni.css: -------------------------------------------------------------------------------- 1 | .hll { background-color: #ffffcc } 2 | /*{ background: #f0f3f3; }*/ 3 | .c { color: #999; } /* Comment */ 4 | .err { color: #AA0000; background-color: #FFAAAA } /* Error */ 5 | .k { color: #006699; } /* Keyword */ 6 | .o { color: #555555 } /* Operator */ 7 | .cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ 8 | .cp { color: #009999 } /* Comment.Preproc */ 9 | .c1 { color: #999; } /* Comment.Single */ 10 | .cs { color: #999; } /* Comment.Special */ 11 | .gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ 12 | .ge { font-style: italic } /* Generic.Emph */ 13 | .gr { color: #FF0000 } /* Generic.Error */ 14 | .gh { color: #003300; } /* Generic.Heading */ 15 | .gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ 16 | .go { color: #AAAAAA } /* Generic.Output */ 17 | .gp { color: #000099; } /* Generic.Prompt */ 18 | .gs { } /* Generic.Strong */ 19 | .gu { color: #003300; } /* Generic.Subheading */ 20 | .gt { color: #99CC66 } /* Generic.Traceback */ 21 | .kc { color: #006699; } /* Keyword.Constant */ 22 | .kd { color: #006699; } /* Keyword.Declaration */ 23 | .kn { color: #006699; } /* Keyword.Namespace */ 24 | .kp { color: #006699 } /* Keyword.Pseudo */ 25 | .kr { color: #006699; } /* Keyword.Reserved */ 26 | .kt { color: #007788; } /* Keyword.Type */ 27 | .m { color: #FF6600 } /* Literal.Number */ 28 | .s { color: #d44950 } /* Literal.String */ 29 | .na { color: #4f9fcf } /* Name.Attribute */ 30 | .nb { color: #336666 } /* Name.Builtin */ 31 | .nc { color: #00AA88; } /* Name.Class */ 32 | .no { color: #336600 } /* Name.Constant */ 33 | .nd { color: #9999FF } /* Name.Decorator */ 34 | .ni { color: #999999; } /* Name.Entity */ 35 | .ne { color: #CC0000; } /* Name.Exception */ 36 | .nf { color: #CC00FF } /* Name.Function */ 37 | .nl { color: #9999FF } /* Name.Label */ 38 | .nn { color: #00CCFF; } /* Name.Namespace */ 39 | .nt { color: #2f6f9f; } /* Name.Tag */ 40 | .nv { color: #003333 } /* Name.Variable */ 41 | .ow { color: #000000; } /* Operator.Word */ 42 | .w { color: #bbbbbb } /* Text.Whitespace */ 43 | .mf { color: #FF6600 } /* Literal.Number.Float */ 44 | .mh { color: #FF6600 } /* Literal.Number.Hex */ 45 | .mi { color: #FF6600 } /* Literal.Number.Integer */ 46 | .mo { color: #FF6600 } /* Literal.Number.Oct */ 47 | .sb { color: #CC3300 } /* Literal.String.Backtick */ 48 | .sc { color: #CC3300 } /* Literal.String.Char */ 49 | .sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ 50 | .s2 { color: #CC3300 } /* Literal.String.Double */ 51 | .se { color: #CC3300; } /* Literal.String.Escape */ 52 | .sh { color: #CC3300 } /* Literal.String.Heredoc */ 53 | .si { color: #AA0000 } /* Literal.String.Interpol */ 54 | .sx { color: #CC3300 } /* Literal.String.Other */ 55 | .sr { color: #33AAAA } /* Literal.String.Regex */ 56 | .s1 { color: #CC3300 } /* Literal.String.Single */ 57 | .ss { color: #FFCC33 } /* Literal.String.Symbol */ 58 | .bp { color: #336666 } /* Name.Builtin.Pseudo */ 59 | .vc { color: #003333 } /* Name.Variable.Class */ 60 | .vg { color: #003333 } /* Name.Variable.Global */ 61 | .vi { color: #003333 } /* Name.Variable.Instance */ 62 | .il { color: #FF6600 } /* Literal.Number.Integer.Long */ 63 | 64 | .css .o, 65 | .css .o + .nt, 66 | .css .nt + .nt { color: #999; } 67 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/ico/apple-touch-icon-114-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/assets/ico/apple-touch-icon-114-precomposed.png -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/ico/apple-touch-icon-144-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/assets/ico/apple-touch-icon-144-precomposed.png -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/ico/apple-touch-icon-57-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/assets/ico/apple-touch-icon-57-precomposed.png -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/ico/apple-touch-icon-72-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/assets/ico/apple-touch-icon-72-precomposed.png -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/ico/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/assets/ico/favicon.png -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/js/application.js: -------------------------------------------------------------------------------- 1 | // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT 2 | // IT'S ALL JUST JUNK FOR OUR DOCS! 3 | // ++++++++++++++++++++++++++++++++++++++++++ 4 | 5 | !function ($) { 6 | 7 | $(function(){ 8 | 9 | var $window = $(window) 10 | var $body = $(document.body) 11 | 12 | var navHeight = $('.navbar').outerHeight(true) + 10 13 | 14 | $body.scrollspy({ 15 | target: '.bs-sidebar', 16 | offset: navHeight 17 | }) 18 | 19 | $window.on('load', function () { 20 | $body.scrollspy('refresh') 21 | }) 22 | 23 | $('.bs-docs-container [href=#]').click(function (e) { 24 | e.preventDefault() 25 | }) 26 | 27 | // back to top 28 | setTimeout(function () { 29 | var $sideBar = $('.bs-sidebar') 30 | 31 | $sideBar.affix({ 32 | offset: { 33 | top: function () { 34 | var offsetTop = $sideBar.offset().top 35 | var sideBarMargin = parseInt($sideBar.children(0).css('margin-top'), 10) 36 | var navOuterHeight = $('.bs-docs-nav').height() 37 | 38 | return (this.top = offsetTop - navOuterHeight - sideBarMargin) 39 | } 40 | , bottom: function () { 41 | return (this.bottom = $('.bs-footer').outerHeight(true)) 42 | } 43 | } 44 | }) 45 | }, 100) 46 | 47 | setTimeout(function () { 48 | $('.bs-top').affix() 49 | }, 100) 50 | 51 | // tooltip demo 52 | $('.tooltip-demo').tooltip({ 53 | selector: "[data-toggle=tooltip]", 54 | container: "body" 55 | }) 56 | 57 | $('.tooltip-test').tooltip() 58 | $('.popover-test').popover() 59 | 60 | $('.bs-docs-navbar').tooltip({ 61 | selector: "a[data-toggle=tooltip]", 62 | container: ".bs-docs-navbar .nav" 63 | }) 64 | 65 | // popover demo 66 | $("[data-toggle=popover]") 67 | .popover() 68 | 69 | // button state demo 70 | $('#fat-btn') 71 | .click(function () { 72 | var btn = $(this) 73 | btn.button('loading') 74 | setTimeout(function () { 75 | btn.button('reset') 76 | }, 3000) 77 | }) 78 | 79 | // carousel demo 80 | $('.bs-docs-carousel-example').carousel() 81 | }) 82 | 83 | }(window.jQuery) 84 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/assets/js/html5shiv.js: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); 5 | a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; 6 | c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| 7 | "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); 8 | for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d #mq-test-1 { width: 42px; }',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document); 4 | 5 | /*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ 6 | (function(a){"use strict";function x(){u(!0)}var b={};a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,b.mediaQueriesSupported;var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var a=m.shift();v(a.href,function(b){p(b,a.href,a.media),h[a.href]=!0,setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(a){var b="clientWidth",h=d[b],k="CSS1Compat"===c.compatMode&&h||c.body[b]||h,m={},n=l[l.length-1],o=(new Date).getTime();if(a&&q&&i>o-q)return clearTimeout(r),r=setTimeout(u,i),void 0;q=o;for(var p in e)if(e.hasOwnProperty(p)){var v=e[p],w=v.minw,x=v.maxw,y=null===w,z=null===x,A="em";w&&(w=parseFloat(w)*(w.indexOf(A)>-1?t||s():1)),x&&(x=parseFloat(x)*(x.indexOf(A)>-1?t||s():1)),v.hasquery&&(y&&z||!(y||k>=w)||!(z||x>=k))||(m[v.media]||(m[v.media]=[]),m[v.media].push(f[v.rules]))}for(var B in g)g.hasOwnProperty(B)&&g[B]&&g[B].parentNode===j&&j.removeChild(g[B]);for(var C in m)if(m.hasOwnProperty(C)){var D=c.createElement("style"),E=m[C].join("\n");D.type="text/css",D.media=C,j.insertBefore(D,n.nextSibling),D.styleSheet?D.styleSheet.cssText=E:D.appendChild(c.createTextNode(E)),g.push(D)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)})(this); 7 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap", 3 | "version": "3.0.0", 4 | "main": ["./dist/js/bootstrap.js", "./dist/css/bootstrap.css"], 5 | "ignore": [ 6 | "**/.*" 7 | ], 8 | "dependencies": { 9 | "jquery": ">= 1.9.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/browserstack.json: -------------------------------------------------------------------------------- 1 | { 2 | "username": "--secure--", 3 | "key": "--secure--", 4 | "test_path": "js/tests/index.html", 5 | "browsers": [ 6 | { 7 | "browser": "firefox", 8 | "browser_version": "latest", 9 | "os": "OS X", 10 | "os_version": "Mountain Lion" 11 | }, 12 | { 13 | "browser": "safari", 14 | "browser_version": "latest", 15 | "os": "OS X", 16 | "os_version": "Mountain Lion" 17 | }, 18 | { 19 | "browser": "chrome", 20 | "browser_version": "latest", 21 | "os": "OS X", 22 | "os_version": "Mountain Lion" 23 | }, 24 | { 25 | "browser": "firefox", 26 | "browser_version": "latest", 27 | "os": "Windows", 28 | "os_version": "7" 29 | }, 30 | { 31 | "browser": "chrome", 32 | "browser_version": "latest", 33 | "os": "Windows", 34 | "os_version": "7" 35 | } 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twbs/bootstrap" 3 | , "description": "Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development." 4 | , "keywords": ["bootstrap", "css"] 5 | , "homepage": "http://getbootstrap.com" 6 | , "authors": [ 7 | { 8 | "name": "Mark Otto", 9 | "email": "markdotto@gmail.com" 10 | }, 11 | { 12 | "name": "Jacob Thornton", 13 | "email": "jacobthornton@gmail.com" 14 | } 15 | ] 16 | , "support": { 17 | "issues": "https://github.com/twbs/bootstrap/issues" 18 | } 19 | , "license": "Apache-2.0" 20 | } 21 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/carousel/carousel.css: -------------------------------------------------------------------------------- 1 | /* GLOBAL STYLES 2 | -------------------------------------------------- */ 3 | /* Padding below the footer and lighter body text */ 4 | 5 | body { 6 | padding-bottom: 40px; 7 | color: #5a5a5a; 8 | } 9 | 10 | 11 | 12 | /* CUSTOMIZE THE NAVBAR 13 | -------------------------------------------------- */ 14 | 15 | /* Special class on .container surrounding .navbar, used for positioning it into place. */ 16 | .navbar-wrapper { 17 | position: relative; 18 | z-index: 15; 19 | } 20 | 21 | 22 | /* CUSTOMIZE THE CAROUSEL 23 | -------------------------------------------------- */ 24 | 25 | /* Carousel base class */ 26 | .carousel { 27 | margin-bottom: 60px; 28 | 29 | /* Negative margin to pull up carousel. 90px is roughly margins and height of navbar. */ 30 | margin-top: -90px; 31 | } 32 | /* Since positioning the image, we need to help out the caption */ 33 | .carousel-caption { 34 | z-index: 10; 35 | } 36 | 37 | /* Declare heights because of positioning of img element */ 38 | .carousel .item { 39 | height: 500px; 40 | background-color: #777; 41 | } 42 | .carousel-inner > .item > img { 43 | position: absolute; 44 | top: 0; 45 | left: 0; 46 | min-width: 100%; 47 | height: 500px; 48 | } 49 | 50 | 51 | 52 | /* MARKETING CONTENT 53 | -------------------------------------------------- */ 54 | 55 | /* Pad the edges of the mobile views a bit */ 56 | .marketing { 57 | padding-left: 15px; 58 | padding-right: 15px; 59 | } 60 | 61 | /* Center align the text within the three columns below the carousel */ 62 | .marketing .col-lg-4 { 63 | text-align: center; 64 | margin-bottom: 20px; 65 | } 66 | .marketing h2 { 67 | font-weight: normal; 68 | } 69 | .marketing .col-lg-4 p { 70 | margin-left: 10px; 71 | margin-right: 10px; 72 | } 73 | 74 | 75 | /* Featurettes 76 | ------------------------- */ 77 | 78 | .featurette-divider { 79 | margin: 80px 0; /* Space out the Bootstrap
    more */ 80 | } 81 | 82 | /* Thin out the marketing headings */ 83 | .featurette-heading { 84 | font-weight: 300; 85 | line-height: 1; 86 | letter-spacing: -1px; 87 | } 88 | 89 | 90 | 91 | /* RESPONSIVE CSS 92 | -------------------------------------------------- */ 93 | 94 | @media (min-width: 768px) { 95 | 96 | /* Remove the edge padding needed for mobile */ 97 | .marketing { 98 | padding-left: 0; 99 | padding-right: 0; 100 | } 101 | 102 | /* Navbar positioning foo */ 103 | .navbar-wrapper { 104 | margin-top: 20px; 105 | } 106 | /* The navbar becomes detached from the top, so we round the corners */ 107 | .navbar-wrapper .navbar { 108 | border-radius: 4px; 109 | } 110 | 111 | /* Bump up size of carousel content */ 112 | .carousel-caption p { 113 | margin-bottom: 20px; 114 | font-size: 21px; 115 | line-height: 1.4; 116 | } 117 | 118 | .featurette-heading { 119 | font-size: 50px; 120 | } 121 | 122 | } 123 | 124 | @media (min-width: 992px) { 125 | .featurette-heading { 126 | margin-top: 120px; 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/grid/grid.css: -------------------------------------------------------------------------------- 1 | .container { 2 | padding-left: 15px; 3 | padding-right: 15px; 4 | } 5 | 6 | h4 { 7 | margin-top: 25px; 8 | } 9 | .row { 10 | margin-bottom: 20px; 11 | } 12 | .row .row { 13 | margin-top: 10px; 14 | margin-bottom: 0; 15 | } 16 | [class*="col-"] { 17 | padding-top: 15px; 18 | padding-bottom: 15px; 19 | background-color: #eee; 20 | border: 1px solid #ddd; 21 | background-color: rgba(86,61,124,.15); 22 | border: 1px solid rgba(86,61,124,.2); 23 | } 24 | 25 | hr { 26 | margin-top: 40px; 27 | margin-bottom: 40px; 28 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/jumbotron-narrow/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Narrow Jumbotron Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 |
    28 |
    29 | 34 |

    Project name

    35 |
    36 | 37 |
    38 |

    Jumbotron heading

    39 |

    Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

    40 |

    Sign up today

    41 |
    42 | 43 |
    44 |
    45 |

    Subheading

    46 |

    Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.

    47 | 48 |

    Subheading

    49 |

    Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.

    50 | 51 |

    Subheading

    52 |

    Maecenas sed diam eget risus varius blandit sit amet non magna.

    53 |
    54 | 55 |
    56 |

    Subheading

    57 |

    Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.

    58 | 59 |

    Subheading

    60 |

    Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.

    61 | 62 |

    Subheading

    63 |

    Maecenas sed diam eget risus varius blandit sit amet non magna.

    64 |
    65 |
    66 | 67 | 70 | 71 |
    72 | 73 | 74 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css: -------------------------------------------------------------------------------- 1 | /* Space out content a bit */ 2 | body { 3 | padding-top: 20px; 4 | padding-bottom: 20px; 5 | } 6 | 7 | /* Everything but the jumbotron gets side spacing for mobile first views */ 8 | .header, 9 | .marketing, 10 | .footer { 11 | padding-left: 15px; 12 | padding-right: 15px; 13 | } 14 | 15 | /* Custom page header */ 16 | .header { 17 | border-bottom: 1px solid #e5e5e5; 18 | } 19 | /* Make the masthead heading the same height as the navigation */ 20 | .header h3 { 21 | margin-top: 0; 22 | margin-bottom: 0; 23 | line-height: 40px; 24 | padding-bottom: 19px; 25 | } 26 | 27 | /* Custom page footer */ 28 | .footer { 29 | padding-top: 19px; 30 | color: #777; 31 | border-top: 1px solid #e5e5e5; 32 | } 33 | 34 | /* Customize container */ 35 | @media (min-width: 768px) { 36 | .container { 37 | max-width: 730px; 38 | } 39 | } 40 | .container-narrow > hr { 41 | margin: 30px 0; 42 | } 43 | 44 | /* Main marketing message and sign up button */ 45 | .jumbotron { 46 | text-align: center; 47 | border-bottom: 1px solid #e5e5e5; 48 | } 49 | .jumbotron .btn { 50 | font-size: 21px; 51 | padding: 14px 24px; 52 | } 53 | 54 | /* Supporting marketing content */ 55 | .marketing { 56 | margin: 40px 0; 57 | } 58 | .marketing p + h4 { 59 | margin-top: 28px; 60 | } 61 | 62 | /* Responsive: Portrait tablets and up */ 63 | @media screen and (min-width: 768px) { 64 | /* Remove the padding we set earlier */ 65 | .header, 66 | .marketing, 67 | .footer { 68 | padding-left: 0; 69 | padding-right: 0; 70 | } 71 | /* Space out the masthead */ 72 | .header { 73 | margin-bottom: 30px; 74 | } 75 | /* Remove the bottom border on the jumbotron for visual effect */ 76 | .jumbotron { 77 | border-bottom: 0; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/jumbotron/jumbotron.css: -------------------------------------------------------------------------------- 1 | /* Move down content because we have a fixed navbar that is 50px tall */ 2 | body { 3 | padding-top: 50px; 4 | padding-bottom: 20px; 5 | } 6 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/justified-nav/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Justified Nav Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 |
    28 | 29 |
    30 |

    Project name

    31 | 39 |
    40 | 41 | 42 |
    43 |

    Marketing stuff!

    44 |

    Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet.

    45 |

    Get started today

    46 |
    47 | 48 | 49 |
    50 |
    51 |

    Heading

    52 |

    Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.

    53 |

    View details »

    54 |
    55 |
    56 |

    Heading

    57 |

    Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.

    58 |

    View details »

    59 |
    60 |
    61 |

    Heading

    62 |

    Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.

    63 |

    View details »

    64 |
    65 |
    66 | 67 | 68 | 71 | 72 |
    73 | 74 | 75 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/justified-nav/justified-nav.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 20px; 3 | } 4 | 5 | .footer { 6 | border-top: 1px solid #eee; 7 | margin-top: 40px; 8 | padding-top: 40px; 9 | padding-bottom: 40px; 10 | } 11 | 12 | /* Main marketing message and sign up button */ 13 | .jumbotron { 14 | text-align: center; 15 | background-color: transparent; 16 | } 17 | .jumbotron .btn { 18 | font-size: 21px; 19 | padding: 14px 24px; 20 | } 21 | 22 | /* Customize the nav-justified links to be fill the entire space of the .navbar */ 23 | 24 | .nav-justified { 25 | background-color: #eee; 26 | border-radius: 5px; 27 | border: 1px solid #ccc; 28 | } 29 | .nav-justified > li > a { 30 | padding-top: 15px; 31 | padding-bottom: 15px; 32 | color: #777; 33 | font-weight: bold; 34 | text-align: center; 35 | border-bottom: 1px solid #d5d5d5; 36 | background-color: #e5e5e5; /* Old browsers */ 37 | background-repeat: repeat-x; /* Repeat the gradient */ 38 | background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%); /* FF3.6+ */ 39 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#e5e5e5)); /* Chrome,Safari4+ */ 40 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* Chrome 10+,Safari 5.1+ */ 41 | background-image: -ms-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* IE10+ */ 42 | background-image: -o-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* Opera 11.10+ */ 43 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ 44 | background-image: linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* W3C */ 45 | } 46 | .nav-justified > .active > a, 47 | .nav-justified > .active > a:hover, 48 | .nav-justified > .active > a:focus { 49 | background-color: #ddd; 50 | background-image: none; 51 | box-shadow: inset 0 3px 7px rgba(0,0,0,.15); 52 | } 53 | .nav-justified > li:first-child > a { 54 | border-radius: 5px 5px 0 0; 55 | } 56 | .nav-justified > li:last-child > a { 57 | border-bottom: 0; 58 | border-radius: 0 0 5px 5px; 59 | } 60 | 61 | @media (min-width: 768px) { 62 | .nav-justified { 63 | max-height: 52px; 64 | } 65 | .nav-justified > li > a { 66 | border-left: 1px solid #fff; 67 | border-right: 1px solid #d5d5d5; 68 | } 69 | .nav-justified > li:first-child > a { 70 | border-left: 0; 71 | border-radius: 5px 0 0 5px; 72 | } 73 | .nav-justified > li:last-child > a { 74 | border-radius: 0 5px 5px 0; 75 | border-right: 0; 76 | } 77 | } 78 | 79 | /* Responsive: Portrait tablets and up */ 80 | @media screen and (min-width: 768px) { 81 | /* Remove the padding we set earlier */ 82 | .masthead, 83 | .marketing, 84 | .footer { 85 | padding-left: 0; 86 | padding-right: 0; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/navbar-fixed-top/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Fixed Top Navbar Example for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 64 | 65 |
    66 | 67 | 68 |
    69 |

    Navbar example

    70 |

    This example is a quick exercise to illustrate how the default, static and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.

    71 |

    To see the difference between static and fixed top navbars, just scroll.

    72 |

    73 | View navbar docs » 74 |

    75 |
    76 | 77 |
    78 | 79 | 80 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css: -------------------------------------------------------------------------------- 1 | body { 2 | min-height: 2000px; 3 | padding-top: 70px; 4 | } 5 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/navbar-static-top/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Static Top Navbar Example for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 64 | 65 | 66 |
    67 | 68 | 69 |
    70 |

    Navbar example

    71 |

    This example is a quick exercise to illustrate how the default, static and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.

    72 |

    To see the difference between static and fixed top navbars, just scroll.

    73 |

    74 | View navbar docs » 75 |

    76 |
    77 | 78 |
    79 | 80 | 81 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/navbar-static-top/navbar-static-top.css: -------------------------------------------------------------------------------- 1 | body { 2 | min-height: 2000px; 3 | } 4 | 5 | .navbar-static-top { 6 | margin-bottom: 19px; 7 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/navbar/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Navbar Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 |
    28 | 29 | 30 | 64 | 65 | 66 |
    67 |

    Navbar example

    68 |

    This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.

    69 |

    70 | View navbar docs » 71 |

    72 |
    73 | 74 |
    75 | 76 | 77 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/navbar/navbar.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 30px; 3 | } 4 | 5 | .navbar { 6 | margin-bottom: 30px; 7 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/non-responsive/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Non-responsive Template for Bootstrap 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 66 | 67 |
    68 | 69 | 73 | 74 |

    What changes

    75 |

    Note the lack of the <meta name="viewport" content="width=device-width, initial-scale=1.0">, which disables the zooming aspect of sites in mobile devices. In addition, we reset our container's width and are basically good to go.

    76 | 77 |

    Regarding navbars

    78 |

    As a heads up, the navbar component is rather tricky here in that the styles for displaying it are rather specific and detailed. Overrides to ensure desktop styles display are not as performant or sleek as one would like. Just be aware there may be potential gotchas as you build on top of this example when using the navbar.

    79 | 80 |

    Non-responsive grid system

    81 |
    82 |
    One third
    83 |
    One third
    84 |
    One third
    85 |
    86 | 87 |
    88 | 89 | 90 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/non-responsive/non-responsive.css: -------------------------------------------------------------------------------- 1 | 2 | /* Template-specific stuff 3 | * 4 | * Customizations just for the template—these are not necessary for anything 5 | * with disabling the responsiveness. 6 | */ 7 | 8 | /* Account for fixed navbar */ 9 | body { 10 | padding-top: 70px; 11 | padding-bottom: 30px; 12 | } 13 | 14 | /* Finesse the page header spacing */ 15 | .page-header { 16 | margin-bottom: 30px; 17 | } 18 | .page-header .lead { 19 | margin-bottom: 10px; 20 | } 21 | 22 | 23 | /* Non-responsive overrides 24 | * 25 | * Utilitze the following CSS to disable the responsive-ness of the container, 26 | * grid system, and navbar. 27 | */ 28 | 29 | /* Reset the container */ 30 | .container { 31 | max-width: none !important; 32 | width: 970px; 33 | } 34 | 35 | /* Demonstrate the grids */ 36 | .col-xs-4 { 37 | padding-top: 15px; 38 | padding-bottom: 15px; 39 | background-color: #eee; 40 | border: 1px solid #ddd; 41 | background-color: rgba(86,61,124,.15); 42 | border: 1px solid rgba(86,61,124,.2); 43 | } 44 | 45 | .container .navbar-header, 46 | .container .navbar-collapse { 47 | margin-right: 0; 48 | margin-left: 0; 49 | } 50 | 51 | /* Always float the navbar header */ 52 | .navbar-header { 53 | float: left; 54 | } 55 | 56 | /* Undo the collapsing navbar */ 57 | .navbar-collapse { 58 | display: block !important; 59 | height: auto !important; 60 | padding-bottom: 0; 61 | overflow: visible !important; 62 | } 63 | 64 | .navbar-toggle { 65 | display: none; 66 | } 67 | 68 | .navbar-brand { 69 | margin-left: -15px; 70 | } 71 | 72 | /* Always apply the floated nav */ 73 | .navbar-nav { 74 | float: left; 75 | margin: 0; 76 | } 77 | .navbar-nav > li { 78 | float: left; 79 | } 80 | .navbar-nav > li > a { 81 | padding: 15px; 82 | } 83 | 84 | /* Redeclare since we override the float above */ 85 | .navbar-nav.navbar-right { 86 | float: right; 87 | } 88 | 89 | /* Undo custom dropdowns */ 90 | .navbar .open .dropdown-menu { 91 | position: absolute; 92 | float: left; 93 | background-color: #fff; 94 | border: 1px solid #cccccc; 95 | border: 1px solid rgba(0, 0, 0, 0.15); 96 | border-width: 0 1px 1px; 97 | border-radius: 0 0 4px 4px; 98 | -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 99 | box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 100 | } 101 | .navbar .open .dropdown-menu > li > a { 102 | color: #333; 103 | } 104 | .navbar .open .dropdown-menu > li > a:hover, 105 | .navbar .open .dropdown-menu > li > a:focus, 106 | .navbar .open .dropdown-menu > .active > a, 107 | .navbar .open .dropdown-menu > .active > a:hover, 108 | .navbar .open .dropdown-menu > .active > a:focus { 109 | color: #fff !important; 110 | background-color: #428bca !important; 111 | } 112 | .navbar .open .dropdown-menu > .disabled > a, 113 | .navbar .open .dropdown-menu > .disabled > a:hover, 114 | .navbar .open .dropdown-menu > .disabled > a:focus { 115 | color: #999 !important; 116 | background-color: transparent !important; 117 | } 118 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/offcanvas/offcanvas.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Style twaks 3 | * -------------------------------------------------- 4 | */ 5 | body { 6 | padding-top: 70px; 7 | } 8 | footer { 9 | padding-left: 15px; 10 | padding-right: 15px; 11 | } 12 | 13 | /* 14 | * Off Canvas 15 | * -------------------------------------------------- 16 | */ 17 | @media screen and (max-width: 768px) { 18 | .row-offcanvas { 19 | position: relative; 20 | -webkit-transition: all 0.25s ease-out; 21 | -moz-transition: all 0.25s ease-out; 22 | transition: all 0.25s ease-out; 23 | } 24 | 25 | .row-offcanvas-right 26 | .sidebar-offcanvas { 27 | right: -50%; /* 6 columns */ 28 | } 29 | 30 | .row-offcanvas-left 31 | .sidebar-offcanvas { 32 | left: -50%; /* 6 columns */ 33 | } 34 | 35 | .row-offcanvas-right.active { 36 | right: 50%; /* 6 columns */ 37 | } 38 | 39 | .row-offcanvas-left.active { 40 | left: 50%; /* 6 columns */ 41 | } 42 | 43 | .sidebar-offcanvas { 44 | position: absolute; 45 | top: 0; 46 | width: 50%; /* 6 columns */ 47 | } 48 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/offcanvas/offcanvas.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | $('[data-toggle=offcanvas]').click(function() { 3 | $('.row-offcanvas').toggleClass('active'); 4 | }); 5 | }); -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/carousel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/carousel.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/grid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/grid.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/jumbotron-narrow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/jumbotron-narrow.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/jumbotron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/jumbotron.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/justified-nav.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/justified-nav.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/navbar-fixed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/navbar-fixed.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/navbar-static.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/navbar-static.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/navbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/navbar.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/non-responsive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/non-responsive.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/offcanvas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/offcanvas.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/sign-in.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/sign-in.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/starter-template.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/starter-template.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/sticky-footer-navbar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/sticky-footer-navbar.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/sticky-footer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/sticky-footer.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/screenshots/theme.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/examples/screenshots/theme.jpg -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/signin/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Signin Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 |
    28 | 29 | 38 | 39 |
    40 | 41 | 42 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/signin/signin.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 40px; 3 | padding-bottom: 40px; 4 | background-color: #eee; 5 | } 6 | 7 | .form-signin { 8 | max-width: 330px; 9 | padding: 15px; 10 | margin: 0 auto; 11 | } 12 | .form-signin .form-signin-heading, 13 | .form-signin .checkbox { 14 | margin-bottom: 10px; 15 | } 16 | .form-signin .checkbox { 17 | font-weight: normal; 18 | } 19 | .form-signin .form-control { 20 | position: relative; 21 | font-size: 16px; 22 | height: auto; 23 | padding: 10px; 24 | -webkit-box-sizing: border-box; 25 | -moz-box-sizing: border-box; 26 | box-sizing: border-box; 27 | } 28 | .form-signin .form-control:focus { 29 | z-index: 2; 30 | } 31 | .form-signin input[type="text"] { 32 | margin-bottom: -1px; 33 | border-bottom-left-radius: 0; 34 | border-bottom-right-radius: 0; 35 | } 36 | .form-signin input[type="password"] { 37 | margin-bottom: 10px; 38 | border-top-left-radius: 0; 39 | border-top-right-radius: 0; 40 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/starter-template/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Starter Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 46 | 47 |
    48 | 49 |
    50 |

    Bootstrap starter template

    51 |

    Use this document as a way to quickly start any new project.
    All you get is this text and a mostly barebones HTML document.

    52 |
    53 | 54 |
    55 | 56 | 57 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/starter-template/starter-template.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | } 4 | .starter-template { 5 | padding: 40px 15px; 6 | text-align: center; 7 | } 8 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/sticky-footer-navbar/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Sticky Footer Navbar Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 |
    29 | 30 | 31 | 62 | 63 | 64 |
    65 | 68 |

    Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS. A fixed navbar has been added within #wrap with padding-top: 60px; on the .container.

    69 |

    Back to the default sticky footer minus the navbar.

    70 |
    71 |
    72 | 73 | 78 | 79 | 80 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css: -------------------------------------------------------------------------------- 1 | /* Sticky footer styles 2 | -------------------------------------------------- */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | /* The html and body elements cannot have any padding or margin. */ 8 | } 9 | 10 | /* Wrapper for page content to push down footer */ 11 | #wrap { 12 | min-height: 100%; 13 | height: auto !important; 14 | height: 100%; 15 | /* Negative indent footer by its height */ 16 | margin: 0 auto -60px; 17 | /* Pad bottom by footer height */ 18 | padding: 0 0 60px; 19 | } 20 | 21 | /* Set the fixed height of the footer here */ 22 | #footer { 23 | height: 60px; 24 | background-color: #f5f5f5; 25 | } 26 | 27 | 28 | /* Custom page CSS 29 | -------------------------------------------------- */ 30 | /* Not required for template or sticky footer method. */ 31 | 32 | #wrap > .container { 33 | padding: 60px 15px 0; 34 | } 35 | .container .credit { 36 | margin: 20px 0; 37 | } 38 | 39 | #footer > .container { 40 | padding-left: 15px; 41 | padding-right: 15px; 42 | } 43 | 44 | code { 45 | font-size: 80%; 46 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/sticky-footer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Sticky Footer Template for Bootstrap 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 |
    29 | 30 | 31 |
    32 | 35 |

    Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.

    36 |

    Use the sticky footer with a fixed navbar if need be, too.

    37 |
    38 |
    39 | 40 | 45 | 46 | 47 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/sticky-footer/sticky-footer.css: -------------------------------------------------------------------------------- 1 | /* Sticky footer styles 2 | -------------------------------------------------- */ 3 | 4 | html, 5 | body { 6 | height: 100%; 7 | /* The html and body elements cannot have any padding or margin. */ 8 | } 9 | 10 | /* Wrapper for page content to push down footer */ 11 | #wrap { 12 | min-height: 100%; 13 | height: auto !important; 14 | height: 100%; 15 | /* Negative indent footer by its height */ 16 | margin: 0 auto -60px; 17 | /* Pad bottom by footer height */ 18 | padding: 0 0 60px; 19 | } 20 | 21 | /* Set the fixed height of the footer here */ 22 | #footer { 23 | height: 60px; 24 | background-color: #f5f5f5; 25 | } 26 | 27 | 28 | /* Custom page CSS 29 | -------------------------------------------------- */ 30 | /* Not required for template or sticky footer method. */ 31 | 32 | .container { 33 | width: auto; 34 | max-width: 680px; 35 | padding: 0 15px; 36 | } 37 | .container .credit { 38 | margin: 20px 0; 39 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/examples/theme/theme.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 70px; 3 | padding-bottom: 30px; 4 | } 5 | 6 | .theme-dropdown .dropdown-menu { 7 | display: block; 8 | position: static; 9 | margin-bottom: 20px; 10 | } 11 | 12 | .theme-showcase > p > .btn { 13 | margin: 5px 0; 14 | } -------------------------------------------------------------------------------- /app/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /app/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /app/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmackerman/angular-better-placeholders/c79dbcbf0c033bea28c82e13d8efebd5bc31e0d5/app/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /app/bower_components/bootstrap/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | title: Bootstrap 4 | base_url: "./" 5 | --- 6 | 7 |
    8 |
    9 |

    Bootstrap

    10 |

    Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development.

    11 |

    12 | Download Bootstrap 13 |

    14 |
    15 |
    16 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/affix.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: affix.js v3.0.0 3 | * http://twbs.github.com/bootstrap/javascript.html#affix 4 | * ======================================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // AFFIX CLASS DEFINITION 24 | // ====================== 25 | 26 | var Affix = function (element, options) { 27 | this.options = $.extend({}, Affix.DEFAULTS, options) 28 | this.$window = $(window) 29 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) 30 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) 31 | 32 | this.$element = $(element) 33 | this.affixed = 34 | this.unpin = null 35 | 36 | this.checkPosition() 37 | } 38 | 39 | Affix.RESET = 'affix affix-top affix-bottom' 40 | 41 | Affix.DEFAULTS = { 42 | offset: 0 43 | } 44 | 45 | Affix.prototype.checkPositionWithEventLoop = function () { 46 | setTimeout($.proxy(this.checkPosition, this), 1) 47 | } 48 | 49 | Affix.prototype.checkPosition = function () { 50 | if (!this.$element.is(':visible')) return 51 | 52 | var scrollHeight = $(document).height() 53 | var scrollTop = this.$window.scrollTop() 54 | var position = this.$element.offset() 55 | var offset = this.options.offset 56 | var offsetTop = offset.top 57 | var offsetBottom = offset.bottom 58 | 59 | if (typeof offset != 'object') offsetBottom = offsetTop = offset 60 | if (typeof offsetTop == 'function') offsetTop = offset.top() 61 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() 62 | 63 | var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : 64 | offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : 65 | offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false 66 | 67 | if (this.affixed === affix) return 68 | if (this.unpin) this.$element.css('top', '') 69 | 70 | this.affixed = affix 71 | this.unpin = affix == 'bottom' ? position.top - scrollTop : null 72 | 73 | this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : '')) 74 | 75 | if (affix == 'bottom') { 76 | this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() }) 77 | } 78 | } 79 | 80 | 81 | // AFFIX PLUGIN DEFINITION 82 | // ======================= 83 | 84 | var old = $.fn.affix 85 | 86 | $.fn.affix = function (option) { 87 | return this.each(function () { 88 | var $this = $(this) 89 | var data = $this.data('bs.affix') 90 | var options = typeof option == 'object' && option 91 | 92 | if (!data) $this.data('bs.affix', (data = new Affix(this, options))) 93 | if (typeof option == 'string') data[option]() 94 | }) 95 | } 96 | 97 | $.fn.affix.Constructor = Affix 98 | 99 | 100 | // AFFIX NO CONFLICT 101 | // ================= 102 | 103 | $.fn.affix.noConflict = function () { 104 | $.fn.affix = old 105 | return this 106 | } 107 | 108 | 109 | // AFFIX DATA-API 110 | // ============== 111 | 112 | $(window).on('load', function () { 113 | $('[data-spy="affix"]').each(function () { 114 | var $spy = $(this) 115 | var data = $spy.data() 116 | 117 | data.offset = data.offset || {} 118 | 119 | if (data.offsetBottom) data.offset.bottom = data.offsetBottom 120 | if (data.offsetTop) data.offset.top = data.offsetTop 121 | 122 | $spy.affix(data) 123 | }) 124 | }) 125 | 126 | }(window.jQuery); 127 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/alert.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: alert.js v3.0.0 3 | * http://twbs.github.com/bootstrap/javascript.html#alerts 4 | * ======================================================================== 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // ALERT CLASS DEFINITION 24 | // ====================== 25 | 26 | var dismiss = '[data-dismiss="alert"]' 27 | var Alert = function (el) { 28 | $(el).on('click', dismiss, this.close) 29 | } 30 | 31 | Alert.prototype.close = function (e) { 32 | var $this = $(this) 33 | var selector = $this.attr('data-target') 34 | 35 | if (!selector) { 36 | selector = $this.attr('href') 37 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 38 | } 39 | 40 | var $parent = $(selector) 41 | 42 | if (e) e.preventDefault() 43 | 44 | if (!$parent.length) { 45 | $parent = $this.hasClass('alert') ? $this : $this.parent() 46 | } 47 | 48 | $parent.trigger(e = $.Event('close.bs.alert')) 49 | 50 | if (e.isDefaultPrevented()) return 51 | 52 | $parent.removeClass('in') 53 | 54 | function removeElement() { 55 | $parent.trigger('closed.bs.alert').remove() 56 | } 57 | 58 | $.support.transition && $parent.hasClass('fade') ? 59 | $parent 60 | .one($.support.transition.end, removeElement) 61 | .emulateTransitionEnd(150) : 62 | removeElement() 63 | } 64 | 65 | 66 | // ALERT PLUGIN DEFINITION 67 | // ======================= 68 | 69 | var old = $.fn.alert 70 | 71 | $.fn.alert = function (option) { 72 | return this.each(function () { 73 | var $this = $(this) 74 | var data = $this.data('bs.alert') 75 | 76 | if (!data) $this.data('bs.alert', (data = new Alert(this))) 77 | if (typeof option == 'string') data[option].call($this) 78 | }) 79 | } 80 | 81 | $.fn.alert.Constructor = Alert 82 | 83 | 84 | // ALERT NO CONFLICT 85 | // ================= 86 | 87 | $.fn.alert.noConflict = function () { 88 | $.fn.alert = old 89 | return this 90 | } 91 | 92 | 93 | // ALERT DATA-API 94 | // ============== 95 | 96 | $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) 97 | 98 | }(window.jQuery); 99 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/button.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: button.js v3.0.0 3 | * http://twbs.github.com/bootstrap/javascript.html#buttons 4 | * ======================================================================== 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // BUTTON PUBLIC CLASS DEFINITION 24 | // ============================== 25 | 26 | var Button = function (element, options) { 27 | this.$element = $(element) 28 | this.options = $.extend({}, Button.DEFAULTS, options) 29 | } 30 | 31 | Button.DEFAULTS = { 32 | loadingText: 'loading...' 33 | } 34 | 35 | Button.prototype.setState = function (state) { 36 | var d = 'disabled' 37 | var $el = this.$element 38 | var val = $el.is('input') ? 'val' : 'html' 39 | var data = $el.data() 40 | 41 | state = state + 'Text' 42 | 43 | if (!data.resetText) $el.data('resetText', $el[val]()) 44 | 45 | $el[val](data[state] || this.options[state]) 46 | 47 | // push to event loop to allow forms to submit 48 | setTimeout(function () { 49 | state == 'loadingText' ? 50 | $el.addClass(d).attr(d, d) : 51 | $el.removeClass(d).removeAttr(d); 52 | }, 0) 53 | } 54 | 55 | Button.prototype.toggle = function () { 56 | var $parent = this.$element.closest('[data-toggle="buttons"]') 57 | 58 | if ($parent.length) { 59 | var $input = this.$element.find('input') 60 | .prop('checked', !this.$element.hasClass('active')) 61 | .trigger('change') 62 | if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') 63 | } 64 | 65 | this.$element.toggleClass('active') 66 | } 67 | 68 | 69 | // BUTTON PLUGIN DEFINITION 70 | // ======================== 71 | 72 | var old = $.fn.button 73 | 74 | $.fn.button = function (option) { 75 | return this.each(function () { 76 | var $this = $(this) 77 | var data = $this.data('bs.button') 78 | var options = typeof option == 'object' && option 79 | 80 | if (!data) $this.data('bs.button', (data = new Button(this, options))) 81 | 82 | if (option == 'toggle') data.toggle() 83 | else if (option) data.setState(option) 84 | }) 85 | } 86 | 87 | $.fn.button.Constructor = Button 88 | 89 | 90 | // BUTTON NO CONFLICT 91 | // ================== 92 | 93 | $.fn.button.noConflict = function () { 94 | $.fn.button = old 95 | return this 96 | } 97 | 98 | 99 | // BUTTON DATA-API 100 | // =============== 101 | 102 | $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { 103 | var $btn = $(e.target) 104 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') 105 | $btn.button('toggle') 106 | e.preventDefault() 107 | }) 108 | 109 | }(window.jQuery); 110 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/popover.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: popover.js v3.0.0 3 | * http://twbs.github.com/bootstrap/javascript.html#popovers 4 | * ======================================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // POPOVER PUBLIC CLASS DEFINITION 24 | // =============================== 25 | 26 | var Popover = function (element, options) { 27 | this.init('popover', element, options) 28 | } 29 | 30 | if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') 31 | 32 | Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, { 33 | placement: 'right' 34 | , trigger: 'click' 35 | , content: '' 36 | , template: '

    ' 37 | }) 38 | 39 | 40 | // NOTE: POPOVER EXTENDS tooltip.js 41 | // ================================ 42 | 43 | Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) 44 | 45 | Popover.prototype.constructor = Popover 46 | 47 | Popover.prototype.getDefaults = function () { 48 | return Popover.DEFAULTS 49 | } 50 | 51 | Popover.prototype.setContent = function () { 52 | var $tip = this.tip() 53 | var title = this.getTitle() 54 | var content = this.getContent() 55 | 56 | $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) 57 | $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) 58 | 59 | $tip.removeClass('fade top bottom left right in') 60 | 61 | // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do 62 | // this manually by checking the contents. 63 | if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() 64 | } 65 | 66 | Popover.prototype.hasContent = function () { 67 | return this.getTitle() || this.getContent() 68 | } 69 | 70 | Popover.prototype.getContent = function () { 71 | var $e = this.$element 72 | var o = this.options 73 | 74 | return $e.attr('data-content') 75 | || (typeof o.content == 'function' ? 76 | o.content.call($e[0]) : 77 | o.content) 78 | } 79 | 80 | Popover.prototype.arrow = function () { 81 | return this.$arrow = this.$arrow || this.tip().find('.arrow') 82 | } 83 | 84 | Popover.prototype.tip = function () { 85 | if (!this.$tip) this.$tip = $(this.options.template) 86 | return this.$tip 87 | } 88 | 89 | 90 | // POPOVER PLUGIN DEFINITION 91 | // ========================= 92 | 93 | var old = $.fn.popover 94 | 95 | $.fn.popover = function (option) { 96 | return this.each(function () { 97 | var $this = $(this) 98 | var data = $this.data('bs.popover') 99 | var options = typeof option == 'object' && option 100 | 101 | if (!data) $this.data('bs.popover', (data = new Popover(this, options))) 102 | if (typeof option == 'string') data[option]() 103 | }) 104 | } 105 | 106 | $.fn.popover.Constructor = Popover 107 | 108 | 109 | // POPOVER NO CONFLICT 110 | // =================== 111 | 112 | $.fn.popover.noConflict = function () { 113 | $.fn.popover = old 114 | return this 115 | } 116 | 117 | }(window.jQuery); 118 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tab.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: tab.js v3.0.0 3 | * http://twbs.github.com/bootstrap/javascript.html#tabs 4 | * ======================================================================== 5 | * Copyright 2012 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // TAB CLASS DEFINITION 24 | // ==================== 25 | 26 | var Tab = function (element) { 27 | this.element = $(element) 28 | } 29 | 30 | Tab.prototype.show = function () { 31 | var $this = this.element 32 | var $ul = $this.closest('ul:not(.dropdown-menu)') 33 | var selector = $this.attr('data-target') 34 | 35 | if (!selector) { 36 | selector = $this.attr('href') 37 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 38 | } 39 | 40 | if ($this.parent('li').hasClass('active')) return 41 | 42 | var previous = $ul.find('.active:last a')[0] 43 | var e = $.Event('show.bs.tab', { 44 | relatedTarget: previous 45 | }) 46 | 47 | $this.trigger(e) 48 | 49 | if (e.isDefaultPrevented()) return 50 | 51 | var $target = $(selector) 52 | 53 | this.activate($this.parent('li'), $ul) 54 | this.activate($target, $target.parent(), function () { 55 | $this.trigger({ 56 | type: 'shown.bs.tab' 57 | , relatedTarget: previous 58 | }) 59 | }) 60 | } 61 | 62 | Tab.prototype.activate = function (element, container, callback) { 63 | var $active = container.find('> .active') 64 | var transition = callback 65 | && $.support.transition 66 | && $active.hasClass('fade') 67 | 68 | function next() { 69 | $active 70 | .removeClass('active') 71 | .find('> .dropdown-menu > .active') 72 | .removeClass('active') 73 | 74 | element.addClass('active') 75 | 76 | if (transition) { 77 | element[0].offsetWidth // reflow for transition 78 | element.addClass('in') 79 | } else { 80 | element.removeClass('fade') 81 | } 82 | 83 | if (element.parent('.dropdown-menu')) { 84 | element.closest('li.dropdown').addClass('active') 85 | } 86 | 87 | callback && callback() 88 | } 89 | 90 | transition ? 91 | $active 92 | .one($.support.transition.end, next) 93 | .emulateTransitionEnd(150) : 94 | next() 95 | 96 | $active.removeClass('in') 97 | } 98 | 99 | 100 | // TAB PLUGIN DEFINITION 101 | // ===================== 102 | 103 | var old = $.fn.tab 104 | 105 | $.fn.tab = function ( option ) { 106 | return this.each(function () { 107 | var $this = $(this) 108 | var data = $this.data('bs.tab') 109 | 110 | if (!data) $this.data('bs.tab', (data = new Tab(this))) 111 | if (typeof option == 'string') data[option]() 112 | }) 113 | } 114 | 115 | $.fn.tab.Constructor = Tab 116 | 117 | 118 | // TAB NO CONFLICT 119 | // =============== 120 | 121 | $.fn.tab.noConflict = function () { 122 | $.fn.tab = old 123 | return this 124 | } 125 | 126 | 127 | // TAB DATA-API 128 | // ============ 129 | 130 | $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { 131 | e.preventDefault() 132 | $(this).tab('show') 133 | }) 134 | 135 | }(window.jQuery); 136 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Bootstrap Plugin Test Suite 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 |

    Bootstrap Plugin Test Suite

    46 |

    47 |

    48 |
      49 |
      50 |
      51 | 52 | 53 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/phantom.js: -------------------------------------------------------------------------------- 1 | // Simple phantom.js integration script 2 | // Adapted from Modernizr 3 | 4 | function waitFor(testFx, onReady, timeOutMillis) { 5 | var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s 6 | , start = new Date().getTime() 7 | , condition = false 8 | , interval = setInterval(function () { 9 | if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { 10 | // If not time-out yet and condition not yet fulfilled 11 | condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code 12 | } else { 13 | if (!condition) { 14 | // If condition still not fulfilled (timeout but condition is 'false') 15 | console.log("'waitFor()' timeout") 16 | phantom.exit(1) 17 | } else { 18 | // Condition fulfilled (timeout and/or condition is 'true') 19 | typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled 20 | clearInterval(interval) //< Stop this interval 21 | } 22 | } 23 | }, 100) //< repeat check every 100ms 24 | } 25 | 26 | 27 | if (phantom.args.length === 0 || phantom.args.length > 2) { 28 | console.log('Usage: phantom.js URL') 29 | phantom.exit() 30 | } 31 | 32 | var page = new WebPage() 33 | 34 | // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") 35 | page.onConsoleMessage = function(msg) { 36 | console.log(msg) 37 | }; 38 | 39 | page.open(phantom.args[0], function(status){ 40 | if (status !== "success") { 41 | console.log("Unable to access network") 42 | phantom.exit() 43 | } else { 44 | waitFor(function(){ 45 | return page.evaluate(function(){ 46 | var el = document.getElementById('qunit-testresult') 47 | if (el && el.innerText.match('completed')) { 48 | return true 49 | } 50 | return false 51 | }) 52 | }, function(){ 53 | var failedNum = page.evaluate(function(){ 54 | var el = document.getElementById('qunit-testresult') 55 | try { 56 | return el.getElementsByClassName('failed')[0].innerHTML 57 | } catch (e) { } 58 | return 10000 59 | }); 60 | phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0) 61 | }) 62 | } 63 | }) 64 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/server.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Simple connect server for phantom.js 3 | * Adapted from Modernizr 4 | */ 5 | 6 | var connect = require('connect') 7 | , http = require('http') 8 | , fs = require('fs') 9 | , app = connect() 10 | .use(connect.static(__dirname + '/../../')); 11 | 12 | http.createServer(app).listen(3000); 13 | 14 | fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8') 15 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/unit/affix.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("affix") 4 | 5 | test("should provide no conflict", function () { 6 | var affix = $.fn.affix.noConflict() 7 | ok(!$.fn.affix, 'affix was set back to undefined (org value)') 8 | $.fn.affix = affix 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).affix, 'affix method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).affix()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should exit early if element is not visible", function () { 20 | var $affix = $('
      ').affix() 21 | $affix.data('bs.affix').checkPosition() 22 | ok(!$affix.hasClass('affix'), 'affix class was not added') 23 | }) 24 | 25 | }) 26 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/unit/alert.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("alert") 4 | 5 | test("should provide no conflict", function () { 6 | var alert = $.fn.alert.noConflict() 7 | ok(!$.fn.alert, 'alert was set back to undefined (org value)') 8 | $.fn.alert = alert 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).alert, 'alert method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).alert()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should fade element out on clicking .close", function () { 20 | var alertHTML = '
      ' 21 | + '×' 22 | + '

      Holy guacamole! Best check yo self, you\'re not looking too good.

      ' 23 | + '
      ' 24 | , alert = $(alertHTML).alert() 25 | 26 | alert.find('.close').click() 27 | 28 | ok(!alert.hasClass('in'), 'remove .in class on .close click') 29 | }) 30 | 31 | test("should remove element when clicking .close", function () { 32 | $.support.transition = false 33 | 34 | var alertHTML = '
      ' 35 | + '×' 36 | + '

      Holy guacamole! Best check yo self, you\'re not looking too good.

      ' 37 | + '
      ' 38 | , alert = $(alertHTML).appendTo('#qunit-fixture').alert() 39 | 40 | ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom') 41 | 42 | alert.find('.close').click() 43 | 44 | ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom') 45 | }) 46 | 47 | test("should not fire closed when close is prevented", function () { 48 | $.support.transition = false 49 | stop(); 50 | $('
      ') 51 | .on('close.bs.alert', function (e) { 52 | e.preventDefault(); 53 | ok(true); 54 | start(); 55 | }) 56 | .on('closed.bs.alert', function () { 57 | ok(false); 58 | }) 59 | .alert('close') 60 | }) 61 | 62 | }) 63 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/unit/phantom.js: -------------------------------------------------------------------------------- 1 | /* 2 | * grunt-contrib-qunit 3 | * http://gruntjs.com/ 4 | * 5 | * Copyright (c) 2013 "Cowboy" Ben Alman, contributors 6 | * Licensed under the MIT license. 7 | */ 8 | 9 | /*global QUnit:true, alert:true*/ 10 | (function () { 11 | 'use strict'; 12 | 13 | // Don't re-order tests. 14 | QUnit.config.reorder = false 15 | // Run tests serially, not in parallel. 16 | QUnit.config.autorun = false 17 | 18 | // Send messages to the parent PhantomJS process via alert! Good times!! 19 | function sendMessage() { 20 | var args = [].slice.call(arguments) 21 | alert(JSON.stringify(args)) 22 | } 23 | 24 | // These methods connect QUnit to PhantomJS. 25 | QUnit.log = function(obj) { 26 | // What is this I don’t even 27 | if (obj.message === '[object Object], undefined:undefined') { return } 28 | // Parse some stuff before sending it. 29 | var actual = QUnit.jsDump.parse(obj.actual) 30 | var expected = QUnit.jsDump.parse(obj.expected) 31 | // Send it. 32 | sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source) 33 | } 34 | 35 | QUnit.testStart = function(obj) { 36 | sendMessage('qunit.testStart', obj.name) 37 | } 38 | 39 | QUnit.testDone = function(obj) { 40 | sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total) 41 | } 42 | 43 | QUnit.moduleStart = function(obj) { 44 | sendMessage('qunit.moduleStart', obj.name) 45 | } 46 | 47 | QUnit.begin = function () { 48 | sendMessage('qunit.begin') 49 | console.log("Starting test suite") 50 | console.log("================================================\n") 51 | } 52 | 53 | QUnit.moduleDone = function (opts) { 54 | if (opts.failed === 0) { 55 | console.log("\r\u2714 All tests passed in '" + opts.name + "' module") 56 | } else { 57 | console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module") 58 | } 59 | sendMessage('qunit.moduleDone', opts.name, opts.failed, opts.passed, opts.total) 60 | } 61 | 62 | QUnit.done = function (opts) { 63 | console.log("\n================================================") 64 | console.log("Tests completed in " + opts.runtime + " milliseconds") 65 | console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.") 66 | sendMessage('qunit.done', opts.failed, opts.passed, opts.total, opts.runtime) 67 | } 68 | 69 | }()) 70 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/unit/scrollspy.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("scrollspy") 4 | 5 | test("should provide no conflict", function () { 6 | var scrollspy = $.fn.scrollspy.noConflict() 7 | ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)') 8 | $.fn.scrollspy = scrollspy 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).scrollspy, 'scrollspy method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).scrollspy()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should switch active class on scroll", function () { 20 | var sectionHTML = '
      ' 21 | , $section = $(sectionHTML).append('#qunit-fixture') 22 | , topbarHTML ='
      ' 23 | + '
      ' 24 | + '
      ' 25 | + '

      Bootstrap

      ' 26 | + '' 29 | + '
      ' 30 | + '
      ' 31 | + '
      ' 32 | , $topbar = $(topbarHTML).scrollspy() 33 | 34 | ok($topbar.find('.active', true)) 35 | }) 36 | 37 | }) 38 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/unit/tab.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("tabs") 4 | 5 | test("should provide no conflict", function () { 6 | var tab = $.fn.tab.noConflict() 7 | ok(!$.fn.tab, 'tab was set back to undefined (org value)') 8 | $.fn.tab = tab 9 | }) 10 | 11 | test("should be defined on jquery object", function () { 12 | ok($(document.body).tab, 'tabs method is defined') 13 | }) 14 | 15 | test("should return element", function () { 16 | ok($(document.body).tab()[0] == document.body, 'document.body returned') 17 | }) 18 | 19 | test("should activate element by tab id", function () { 20 | var tabsHTML = 21 | '' 25 | 26 | $('').appendTo("#qunit-fixture") 27 | 28 | $(tabsHTML).find('li:last a').tab('show') 29 | equals($("#qunit-fixture").find('.active').attr('id'), "profile") 30 | 31 | $(tabsHTML).find('li:first a').tab('show') 32 | equals($("#qunit-fixture").find('.active').attr('id'), "home") 33 | }) 34 | 35 | test("should activate element by tab id", function () { 36 | var pillsHTML = 37 | '' 41 | 42 | $('').appendTo("#qunit-fixture") 43 | 44 | $(pillsHTML).find('li:last a').tab('show') 45 | equals($("#qunit-fixture").find('.active').attr('id'), "profile") 46 | 47 | $(pillsHTML).find('li:first a').tab('show') 48 | equals($("#qunit-fixture").find('.active').attr('id'), "home") 49 | }) 50 | 51 | 52 | test("should not fire closed when close is prevented", function () { 53 | $.support.transition = false 54 | stop(); 55 | $('
      ') 56 | .on('show.bs.tab', function (e) { 57 | e.preventDefault(); 58 | ok(true); 59 | start(); 60 | }) 61 | .on('shown.bs.tab', function () { 62 | ok(false); 63 | }) 64 | .tab('show') 65 | }) 66 | 67 | test("show and shown events should reference correct relatedTarget", function () { 68 | var dropHTML = 69 | '
        ' 70 | + '' 76 | + '
      ' 77 | 78 | $(dropHTML).find('ul>li:first a').tab('show').end() 79 | .find('ul>li:last a').on('show', function(event){ 80 | equals(event.relatedTarget.hash, "#1-1") 81 | }).on('shown', function(event){ 82 | equals(event.relatedTarget.hash, "#1-1") 83 | }).tab('show') 84 | }) 85 | 86 | }) 87 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/tests/unit/transition.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | module("transition") 4 | 5 | test("should be defined on jquery support object", function () { 6 | ok($.support.transition !== undefined, 'transition object is defined') 7 | }) 8 | 9 | test("should provide an end object", function () { 10 | ok($.support.transition ? $.support.transition.end : true, 'end string is defined') 11 | }) 12 | 13 | }) 14 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/js/transition.js: -------------------------------------------------------------------------------- 1 | /* ======================================================================== 2 | * Bootstrap: transition.js v3.0.0 3 | * http://twbs.github.com/bootstrap/javascript.html#transitions 4 | * ======================================================================== 5 | * Copyright 2013 Twitter, Inc. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ======================================================================== */ 19 | 20 | 21 | +function ($) { "use strict"; 22 | 23 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 24 | // ============================================================ 25 | 26 | function transitionEnd() { 27 | var el = document.createElement('bootstrap') 28 | 29 | var transEndEventNames = { 30 | 'WebkitTransition' : 'webkitTransitionEnd' 31 | , 'MozTransition' : 'transitionend' 32 | , 'OTransition' : 'oTransitionEnd otransitionend' 33 | , 'transition' : 'transitionend' 34 | } 35 | 36 | for (var name in transEndEventNames) { 37 | if (el.style[name] !== undefined) { 38 | return { end: transEndEventNames[name] } 39 | } 40 | } 41 | } 42 | 43 | // http://blog.alexmaccaw.com/css-transitions 44 | $.fn.emulateTransitionEnd = function (duration) { 45 | var called = false, $el = this 46 | $(this).one($.support.transition.end, function () { called = true }) 47 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 48 | setTimeout(callback, duration) 49 | return this 50 | } 51 | 52 | $(function () { 53 | $.support.transition = transitionEnd() 54 | }) 55 | 56 | }(window.jQuery); 57 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headingsColor 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissable alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable { 41 | padding-right: (@alert-padding + 20); 42 | 43 | // Adjust close link position 44 | .close { 45 | position: relative; 46 | top: -2px; 47 | right: -21px; 48 | color: inherit; 49 | } 50 | } 51 | 52 | // Alternate styles 53 | // 54 | // Generate contextual modifier classes for colorizing the alert. 55 | 56 | .alert-success { 57 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 58 | } 59 | .alert-info { 60 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 61 | } 62 | .alert-warning { 63 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 64 | } 65 | .alert-danger { 66 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 67 | } 68 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base classes 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | } 26 | 27 | // Hover state, but only for links 28 | a.badge { 29 | &:hover, 30 | &:focus { 31 | color: @badge-link-hover-color; 32 | text-decoration: none; 33 | cursor: pointer; 34 | } 35 | } 36 | 37 | // Quick fix for labels/badges in buttons 38 | .btn .badge { 39 | position: relative; 40 | top: -1px; 41 | } 42 | 43 | // Account for counters in navs 44 | a.list-group-item.active > .badge, 45 | .nav-pills > .active > a > .badge { 46 | color: @badge-active-color; 47 | background-color: @badge-active-bg; 48 | } 49 | .nav-pills > li > a > .badge { 50 | margin-left: 3px; 51 | } 52 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.0.0 3 | * 4 | * Copyright 2013 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world by @mdo and @fat. 9 | */ 10 | 11 | // Core variables and mixins 12 | @import "variables.less"; 13 | @import "mixins.less"; 14 | 15 | // Reset 16 | @import "normalize.less"; 17 | @import "print.less"; 18 | 19 | // Core CSS 20 | @import "scaffolding.less"; 21 | @import "type.less"; 22 | @import "code.less"; 23 | @import "grid.less"; 24 | @import "tables.less"; 25 | @import "forms.less"; 26 | @import "buttons.less"; 27 | 28 | // Components 29 | @import "component-animations.less"; 30 | @import "glyphicons.less"; 31 | @import "dropdowns.less"; 32 | @import "button-groups.less"; 33 | @import "input-groups.less"; 34 | @import "navs.less"; 35 | @import "navbar.less"; 36 | @import "breadcrumbs.less"; 37 | @import "pagination.less"; 38 | @import "pager.less"; 39 | @import "labels.less"; 40 | @import "badges.less"; 41 | @import "jumbotron.less"; 42 | @import "thumbnails.less"; 43 | @import "alerts.less"; 44 | @import "progress-bars.less"; 45 | @import "media.less"; 46 | @import "list-group.less"; 47 | @import "panels.less"; 48 | @import "wells.less"; 49 | @import "close.less"; 50 | 51 | // Components w/ JavaScript 52 | @import "modals.less"; 53 | @import "tooltip.less"; 54 | @import "popovers.less"; 55 | @import "carousel.less"; 56 | 57 | // Utility classes 58 | @import "utilities.less"; 59 | @import "responsive-utilities.less"; 60 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: 8px 15px; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | > li { 13 | display: inline-block; 14 | &+li:before { 15 | content: "/\00a0"; // Unicode space added since inline-block means non-collapsing white-space 16 | padding: 0 5px; 17 | color: @breadcrumb-color; 18 | } 19 | } 20 | > .active { 21 | color: @breadcrumb-active-color; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/buttons.less: -------------------------------------------------------------------------------- 1 | // 2 | // Buttons 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // -------------------------------------------------- 8 | 9 | // Core styles 10 | .btn { 11 | display: inline-block; 12 | padding: @padding-base-vertical @padding-base-horizontal; 13 | margin-bottom: 0; // For input.btn 14 | font-size: @font-size-base; 15 | font-weight: @btn-font-weight; 16 | line-height: @line-height-base; 17 | text-align: center; 18 | vertical-align: middle; 19 | cursor: pointer; 20 | border: 1px solid transparent; 21 | border-radius: @border-radius-base; 22 | white-space: nowrap; 23 | .user-select(none); 24 | 25 | &:focus { 26 | .tab-focus(); 27 | } 28 | 29 | &:hover, 30 | &:focus { 31 | color: @btn-default-color; 32 | text-decoration: none; 33 | } 34 | 35 | &:active, 36 | &.active { 37 | outline: 0; 38 | background-image: none; 39 | .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); 40 | } 41 | 42 | &.disabled, 43 | &[disabled], 44 | fieldset[disabled] & { 45 | cursor: not-allowed; 46 | pointer-events: none; // Future-proof disabling of clicks 47 | .opacity(.65); 48 | .box-shadow(none); 49 | } 50 | 51 | } 52 | 53 | 54 | // Alternate buttons 55 | // -------------------------------------------------- 56 | 57 | .btn-default { 58 | .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); 59 | } 60 | .btn-primary { 61 | .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); 62 | } 63 | // Warning appears as orange 64 | .btn-warning { 65 | .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); 66 | } 67 | // Danger and error appear as red 68 | .btn-danger { 69 | .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); 70 | } 71 | // Success appears as green 72 | .btn-success { 73 | .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); 74 | } 75 | // Info appears as blue-green 76 | .btn-info { 77 | .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); 78 | } 79 | 80 | 81 | // Link buttons 82 | // ------------------------- 83 | 84 | // Make a button look and behave like a link 85 | .btn-link { 86 | color: @link-color; 87 | font-weight: normal; 88 | cursor: pointer; 89 | border-radius: 0; 90 | 91 | &, 92 | &:active, 93 | &[disabled], 94 | fieldset[disabled] & { 95 | background-color: transparent; 96 | .box-shadow(none); 97 | } 98 | &, 99 | &:hover, 100 | &:focus, 101 | &:active { 102 | border-color: transparent; 103 | } 104 | &:hover, 105 | &:focus { 106 | color: @link-hover-color; 107 | text-decoration: underline; 108 | background-color: transparent; 109 | } 110 | &[disabled], 111 | fieldset[disabled] & { 112 | &:hover, 113 | &:focus { 114 | color: @btn-link-disabled-color; 115 | text-decoration: none; 116 | } 117 | } 118 | } 119 | 120 | 121 | // Button Sizes 122 | // -------------------------------------------------- 123 | 124 | .btn-lg { 125 | // line-height: ensure even-numbered height of button next to large input 126 | .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); 127 | } 128 | .btn-sm, 129 | .btn-xs { 130 | // line-height: ensure proper height of button next to small input 131 | .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); 132 | } 133 | .btn-xs { 134 | padding: 1px 5px; 135 | } 136 | 137 | 138 | // Block button 139 | // -------------------------------------------------- 140 | 141 | .btn-block { 142 | display: block; 143 | width: 100%; 144 | padding-left: 0; 145 | padding-right: 0; 146 | } 147 | 148 | // Vertically space out multiple block buttons 149 | .btn-block + .btn-block { 150 | margin-top: 5px; 151 | } 152 | 153 | // Specificity overrides 154 | input[type="submit"], 155 | input[type="reset"], 156 | input[type="button"] { 157 | &.btn-block { 158 | width: 100%; 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button& { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and blocK) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | pre { 9 | font-family: @font-family-monospace; 10 | } 11 | 12 | // Inline code 13 | code { 14 | padding: 2px 4px; 15 | font-size: 90%; 16 | color: @code-color; 17 | background-color: @code-bg; 18 | white-space: nowrap; 19 | border-radius: @border-radius-base; 20 | } 21 | 22 | // Blocks of code 23 | pre { 24 | display: block; 25 | padding: ((@line-height-computed - 1) / 2); 26 | margin: 0 0 (@line-height-computed / 2); 27 | font-size: (@font-size-base - 1); // 14px to 13px 28 | line-height: @line-height-base; 29 | word-break: break-all; 30 | word-wrap: break-word; 31 | color: @pre-color; 32 | background-color: @pre-bg; 33 | border: 1px solid @pre-border-color; 34 | border-radius: @border-radius-base; 35 | 36 | // Make prettyprint styles more spaced out for readability 37 | &.prettyprint { 38 | margin-bottom: @line-height-computed; 39 | } 40 | 41 | // Account for some code outputs that place code tags in pre tags 42 | code { 43 | padding: 0; 44 | font-size: inherit; 45 | color: inherit; 46 | white-space: pre-wrap; 47 | background-color: transparent; 48 | border: 0; 49 | } 50 | } 51 | 52 | // Enable scrollable blocks of code 53 | .pre-scrollable { 54 | max-height: @pre-scrollable-max-height; 55 | overflow-y: scroll; 56 | } 57 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | &.in { 21 | display: block; 22 | } 23 | } 24 | .collapsing { 25 | position: relative; 26 | height: 0; 27 | overflow: hidden; 28 | .transition(height .35s ease); 29 | } 30 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/input-groups.less: -------------------------------------------------------------------------------- 1 | // 2 | // Input groups 3 | // -------------------------------------------------- 4 | 5 | // Base styles 6 | // ------------------------- 7 | .input-group { 8 | position: relative; // For dropdowns 9 | display: table; 10 | border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table 11 | 12 | // Undo padding and float of grid classes 13 | &.col { 14 | float: none; 15 | padding-left: 0; 16 | padding-right: 0; 17 | } 18 | 19 | .form-control { 20 | width: 100%; 21 | margin-bottom: 0; 22 | } 23 | } 24 | 25 | // Sizing options 26 | // 27 | // Remix the default form control sizing classes into new ones for easier 28 | // manipulation. 29 | 30 | .input-group-lg > .form-control, 31 | .input-group-lg > .input-group-addon, 32 | .input-group-lg > .input-group-btn > .btn { .input-lg(); } 33 | .input-group-sm > .form-control, 34 | .input-group-sm > .input-group-addon, 35 | .input-group-sm > .input-group-btn > .btn { .input-sm(); } 36 | 37 | 38 | // Display as table-cell 39 | // ------------------------- 40 | .input-group-addon, 41 | .input-group-btn, 42 | .input-group .form-control { 43 | display: table-cell; 44 | 45 | &:not(:first-child):not(:last-child) { 46 | border-radius: 0; 47 | } 48 | } 49 | // Addon and addon wrapper for buttons 50 | .input-group-addon, 51 | .input-group-btn { 52 | width: 1%; 53 | white-space: nowrap; 54 | vertical-align: middle; // Match the inputs 55 | } 56 | 57 | // Text input groups 58 | // ------------------------- 59 | .input-group-addon { 60 | padding: @padding-base-vertical @padding-base-horizontal; 61 | font-size: @font-size-base; 62 | font-weight: normal; 63 | line-height: 1; 64 | text-align: center; 65 | background-color: @input-group-addon-bg; 66 | border: 1px solid @input-group-addon-border-color; 67 | border-radius: @border-radius-base; 68 | 69 | // Sizing 70 | &.input-sm { 71 | padding: @padding-small-vertical @padding-small-horizontal; 72 | font-size: @font-size-small; 73 | border-radius: @border-radius-small; 74 | } 75 | &.input-lg { 76 | padding: @padding-large-vertical @padding-large-horizontal; 77 | font-size: @font-size-large; 78 | border-radius: @border-radius-large; 79 | } 80 | 81 | // Nuke default margins from checkboxes and radios to vertically center within. 82 | input[type="radio"], 83 | input[type="checkbox"] { 84 | margin-top: 0; 85 | } 86 | } 87 | 88 | // Reset rounded corners 89 | .input-group .form-control:first-child, 90 | .input-group-addon:first-child, 91 | .input-group-btn:first-child > .btn, 92 | .input-group-btn:first-child > .dropdown-toggle, 93 | .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { 94 | .border-right-radius(0); 95 | } 96 | .input-group-addon:first-child { 97 | border-right: 0; 98 | } 99 | .input-group .form-control:last-child, 100 | .input-group-addon:last-child, 101 | .input-group-btn:last-child > .btn, 102 | .input-group-btn:last-child > .dropdown-toggle, 103 | .input-group-btn:first-child > .btn:not(:first-child) { 104 | .border-left-radius(0); 105 | } 106 | .input-group-addon:last-child { 107 | border-left: 0; 108 | } 109 | 110 | // Button input groups 111 | // ------------------------- 112 | .input-group-btn { 113 | position: relative; 114 | white-space: nowrap; 115 | } 116 | .input-group-btn > .btn { 117 | position: relative; 118 | // Jankily prevent input button groups from wrapping 119 | + .btn { 120 | margin-left: -4px; 121 | } 122 | // Bring the "active" button to the front 123 | &:hover, 124 | &:active { 125 | z-index: 2; 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding; 8 | margin-bottom: @jumbotron-padding; 9 | font-size: (@font-size-base * 1.5); 10 | font-weight: 200; 11 | line-height: (@line-height-base * 1.5); 12 | color: @jumbotron-color; 13 | background-color: @jumbotron-bg; 14 | 15 | h1 { 16 | line-height: 1; 17 | color: @jumbotron-heading-color; 18 | } 19 | p { 20 | line-height: 1.4; 21 | } 22 | 23 | .container & { 24 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 25 | } 26 | 27 | @media screen and (min-width: @screen-tablet) { 28 | padding-top: (@jumbotron-padding * 1.6); 29 | padding-bottom: (@jumbotron-padding * 1.6); 30 | 31 | .container & { 32 | padding-left: (@jumbotron-padding * 2); 33 | padding-right: (@jumbotron-padding * 2); 34 | } 35 | 36 | h1 { 37 | font-size: (@font-size-base * 4.5); 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | &[href] { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | } 32 | 33 | // Colors 34 | // Contextual variations (linked labels get darker on :hover) 35 | 36 | .label-default { 37 | .label-variant(@label-default-bg); 38 | } 39 | 40 | .label-primary { 41 | .label-variant(@label-primary-bg); 42 | } 43 | 44 | .label-success { 45 | .label-variant(@label-success-bg); 46 | } 47 | 48 | .label-info { 49 | .label-variant(@label-info-bg); 50 | } 51 | 52 | .label-warning { 53 | .label-variant(@label-warning-bg); 54 | } 55 | 56 | .label-danger { 57 | .label-variant(@label-danger-bg); 58 | } 59 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/list-group.less: -------------------------------------------------------------------------------- 1 | // 2 | // List groups 3 | // -------------------------------------------------- 4 | 5 | // Base class 6 | // 7 | // Easily usable on
        ,
          , or
          . 8 | .list-group { 9 | // No need to set list-style: none; since .list-group-item is block level 10 | margin-bottom: 20px; 11 | padding-left: 0; // reset padding because ul and ol 12 | } 13 | 14 | // Individual list items 15 | // ------------------------- 16 | 17 | .list-group-item { 18 | position: relative; 19 | display: block; 20 | padding: 10px 15px; 21 | // Place the border on the list items and negative margin up for better styling 22 | margin-bottom: -1px; 23 | background-color: @list-group-bg; 24 | border: 1px solid @list-group-border; 25 | 26 | // Round the first and last items 27 | &:first-child { 28 | .border-top-radius(@list-group-border-radius); 29 | } 30 | &:last-child { 31 | margin-bottom: 0; 32 | .border-bottom-radius(@list-group-border-radius); 33 | } 34 | 35 | // Align badges within list items 36 | > .badge { 37 | float: right; 38 | } 39 | > .badge + .badge { 40 | margin-right: 5px; 41 | } 42 | 43 | // Linked list items 44 | a& { 45 | color: @list-group-link-color; 46 | 47 | .list-group-item-heading { 48 | color: @list-group-link-heading-color; 49 | } 50 | 51 | // Hover state 52 | &:hover, 53 | &:focus { 54 | text-decoration: none; 55 | background-color: @list-group-hover-bg; 56 | } 57 | } 58 | 59 | // Active class on item itself, not parent 60 | &.active, 61 | &.active:hover, 62 | &.active:focus { 63 | z-index: 2; // Place active items above their siblings for proper border styling 64 | color: @list-group-active-color; 65 | background-color: @list-group-active-bg; 66 | border-color: @list-group-active-border; 67 | 68 | // Force color to inherit for custom content 69 | .list-group-item-heading { 70 | color: inherit; 71 | } 72 | .list-group-item-text { 73 | color: lighten(@list-group-active-bg, 40%); 74 | } 75 | } 76 | } 77 | 78 | // Custom content options 79 | // ------------------------- 80 | 81 | .list-group-item-heading { 82 | margin-top: 0; 83 | margin-bottom: 5px; 84 | } 85 | .list-group-item-text { 86 | margin-bottom: 0; 87 | line-height: 1.3; 88 | } 89 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | // Media objects 2 | // Source: http://stubbornella.org/content/?p=497 3 | // -------------------------------------------------- 4 | 5 | 6 | // Common styles 7 | // ------------------------- 8 | 9 | // Clear the floats 10 | .media, 11 | .media-body { 12 | overflow: hidden; 13 | zoom: 1; 14 | } 15 | 16 | // Proper spacing between instances of .media 17 | .media, 18 | .media .media { 19 | margin-top: 15px; 20 | } 21 | .media:first-child { 22 | margin-top: 0; 23 | } 24 | 25 | // For images and videos, set to block 26 | .media-object { 27 | display: block; 28 | } 29 | 30 | // Reset margins on headings for tighter default spacing 31 | .media-heading { 32 | margin: 0 0 5px; 33 | } 34 | 35 | 36 | // Media image alignment 37 | // ------------------------- 38 | 39 | .media { 40 | > .pull-left { 41 | margin-right: 10px; 42 | } 43 | > .pull-right { 44 | margin-left: 10px; 45 | } 46 | } 47 | 48 | 49 | // Media list variation 50 | // ------------------------- 51 | 52 | // Undo default ul/ol styles 53 | .media-list { 54 | padding-left: 0; 55 | list-style: none; 56 | } 57 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/modals.less: -------------------------------------------------------------------------------- 1 | // 2 | // Modals 3 | // -------------------------------------------------- 4 | 5 | // .modal-open - body class for killing the scroll 6 | // .modal - container to scroll within 7 | // .modal-dialog - positioning shell for the actual modal 8 | // .modal-content - actual modal w/ bg and corners and shit 9 | 10 | // Kill the scroll on the body 11 | .modal-open { 12 | overflow: hidden; 13 | 14 | 15 | // Account for hiding of scrollbar 16 | body&, 17 | .navbar-fixed-top, 18 | .navbar-fixed-bottom { 19 | margin-right: 15px 20 | } 21 | } 22 | 23 | // Container that the modal scrolls within 24 | .modal { 25 | display: none; 26 | overflow: auto; 27 | overflow-y: scroll; 28 | position: fixed; 29 | top: 0; 30 | right: 0; 31 | bottom: 0; 32 | left: 0; 33 | z-index: @zindex-modal-background; 34 | 35 | // When fading in the modal, animate it to slide down 36 | &.fade .modal-dialog { 37 | .translate(0, -25%); 38 | .transition-transform(~"0.3s ease-out"); 39 | } 40 | &.in .modal-dialog { .translate(0, 0)} 41 | } 42 | 43 | // Shell div to position the modal with bottom padding 44 | .modal-dialog { 45 | margin-left: auto; 46 | margin-right: auto; 47 | width: auto; 48 | padding: 10px; 49 | z-index: (@zindex-modal-background + 10); 50 | } 51 | 52 | // Actual modal 53 | .modal-content { 54 | position: relative; 55 | background-color: @modal-content-bg; 56 | border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) 57 | border: 1px solid @modal-content-border-color; 58 | border-radius: @border-radius-large; 59 | .box-shadow(0 3px 9px rgba(0,0,0,.5)); 60 | background-clip: padding-box; 61 | // Remove focus outline from opened modal 62 | outline: none; 63 | } 64 | 65 | // Modal background 66 | .modal-backdrop { 67 | position: fixed; 68 | top: 0; 69 | right: 0; 70 | bottom: 0; 71 | left: 0; 72 | z-index: (@zindex-modal-background - 10); 73 | background-color: @modal-backdrop-bg; 74 | // Fade for backdrop 75 | &.fade { .opacity(0); } 76 | &.in { .opacity(.5); } 77 | } 78 | 79 | // Modal header 80 | // Top section of the modal w/ title and dismiss 81 | .modal-header { 82 | padding: @modal-title-padding; 83 | border-bottom: 1px solid @modal-header-border-color; 84 | min-height: (@modal-title-padding + @modal-title-line-height); 85 | } 86 | // Close icon 87 | .modal-header .close { 88 | margin-top: -2px; 89 | } 90 | 91 | // Title text within header 92 | .modal-title { 93 | margin: 0; 94 | line-height: @modal-title-line-height; 95 | } 96 | 97 | // Modal body 98 | // Where all modal content resides (sibling of .modal-header and .modal-footer) 99 | .modal-body { 100 | position: relative; 101 | padding: @modal-inner-padding; 102 | } 103 | 104 | // Footer (for actions) 105 | .modal-footer { 106 | margin-top: 15px; 107 | padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding; 108 | text-align: right; // right align buttons 109 | border-top: 1px solid @modal-footer-border-color; 110 | .clearfix(); // clear it in case folks use .pull-* classes on buttons 111 | 112 | // Properly space out buttons 113 | .btn + .btn { 114 | margin-left: 5px; 115 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs 116 | } 117 | // but override that for button groups 118 | .btn-group .btn + .btn { 119 | margin-left: -1px; 120 | } 121 | // and override it for block buttons as well 122 | .btn-block + .btn-block { 123 | margin-left: 0; 124 | } 125 | } 126 | 127 | // Scale up the modal 128 | @media screen and (min-width: @screen-tablet) { 129 | 130 | .modal-dialog { 131 | left: 50%; 132 | right: auto; 133 | width: 600px; 134 | padding-top: 30px; 135 | padding-bottom: 30px; 136 | } 137 | .modal-content { 138 | .box-shadow(0 5px 15px rgba(0,0,0,.5)); 139 | } 140 | 141 | } 142 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | .clearfix(); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pagination-bg; 19 | border: 1px solid @pagination-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pagination-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pagination-bg; 51 | cursor: not-allowed; 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/pagination.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: @line-height-computed 0; 8 | border-radius: @border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: @padding-base-vertical @padding-base-horizontal; 17 | line-height: @line-height-base; 18 | text-decoration: none; 19 | background-color: @pagination-bg; 20 | border: 1px solid @pagination-border; 21 | margin-left: -1px; 22 | } 23 | &:first-child { 24 | > a, 25 | > span { 26 | margin-left: 0; 27 | .border-left-radius(@border-radius-base); 28 | } 29 | } 30 | &:last-child { 31 | > a, 32 | > span { 33 | .border-right-radius(@border-radius-base); 34 | } 35 | } 36 | } 37 | 38 | > li > a, 39 | > li > span { 40 | &:hover, 41 | &:focus { 42 | background-color: @pagination-hover-bg; 43 | } 44 | } 45 | 46 | > .active > a, 47 | > .active > span { 48 | &, 49 | &:hover, 50 | &:focus { 51 | z-index: 2; 52 | color: @pagination-active-color; 53 | background-color: @pagination-active-bg; 54 | border-color: @pagination-active-bg; 55 | cursor: default; 56 | } 57 | } 58 | 59 | > .disabled { 60 | > span, 61 | > a, 62 | > a:hover, 63 | > a:focus { 64 | color: @pagination-disabled-color; 65 | background-color: @pagination-bg; 66 | border-color: @pagination-border; 67 | cursor: not-allowed; 68 | } 69 | } 70 | } 71 | 72 | // Sizing 73 | // -------------------------------------------------- 74 | 75 | // Large 76 | .pagination-lg { 77 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large); 78 | } 79 | 80 | // Small 81 | .pagination-sm { 82 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small); 83 | } 84 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/panels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Panels 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .panel { 8 | margin-bottom: @line-height-computed; 9 | background-color: @panel-bg; 10 | border: 1px solid transparent; 11 | border-radius: @panel-border-radius; 12 | .box-shadow(0 1px 1px rgba(0,0,0,.05)); 13 | } 14 | 15 | // Panel contents 16 | .panel-body { 17 | padding: 15px; 18 | .clearfix(); 19 | } 20 | 21 | 22 | // List groups in panels 23 | // 24 | // By default, space out list group content from panel headings to account for 25 | // any kind of custom content between the two. 26 | 27 | .panel { 28 | > .list-group { 29 | margin-bottom: 0; 30 | 31 | .list-group-item { 32 | border-width: 1px 0; 33 | 34 | // Remove border radius for top one 35 | &:first-child { 36 | .border-top-radius(0); 37 | } 38 | // But keep it for the last one 39 | &:last-child { 40 | border-bottom: 0; 41 | } 42 | } 43 | } 44 | } 45 | // Collapse space between when there's no additional content. 46 | .panel-heading + .list-group { 47 | .list-group-item:first-child { 48 | border-top-width: 0; 49 | } 50 | } 51 | 52 | 53 | // Tables in panels 54 | // 55 | // Place a non-bordered `.table` within a panel (not within a `.panel-body`) and 56 | // watch it go full width. 57 | 58 | .panel { 59 | > .table { 60 | margin-bottom: 0; 61 | } 62 | > .panel-body + .table { 63 | border-top: 1px solid @table-border-color; 64 | } 65 | } 66 | 67 | 68 | // Optional heading 69 | .panel-heading { 70 | padding: 10px 15px; 71 | border-bottom: 1px solid transparent; 72 | .border-top-radius(@panel-border-radius - 1); 73 | } 74 | 75 | // Within heading, strip any `h*` tag of it's default margins for spacing. 76 | .panel-title { 77 | margin-top: 0; 78 | margin-bottom: 0; 79 | font-size: ceil((@font-size-base * 1.125)); 80 | > a { 81 | color: inherit; 82 | } 83 | } 84 | 85 | // Optional footer (stays gray in every modifier class) 86 | .panel-footer { 87 | padding: 10px 15px; 88 | background-color: @panel-footer-bg; 89 | border-top: 1px solid @panel-inner-border; 90 | .border-bottom-radius(@panel-border-radius - 1); 91 | } 92 | 93 | 94 | // Collapsable panels (aka, accordion) 95 | // 96 | // Wrap a series of panels in `.panel-group` to turn them into an accordion with 97 | // the help of our collapse JavaScript plugin. 98 | 99 | .panel-group { 100 | // Tighten up margin so it's only between panels 101 | .panel { 102 | margin-bottom: 0; 103 | border-radius: @panel-border-radius; 104 | overflow: hidden; // crop contents when collapsed 105 | + .panel { 106 | margin-top: 5px; 107 | } 108 | } 109 | 110 | .panel-heading { 111 | border-bottom: 0; 112 | + .panel-collapse .panel-body { 113 | border-top: 1px solid @panel-inner-border; 114 | } 115 | } 116 | .panel-footer { 117 | border-top: 0; 118 | + .panel-collapse .panel-body { 119 | border-bottom: 1px solid @panel-inner-border; 120 | } 121 | } 122 | 123 | // New subcomponent for wrapping collapsable content for proper animations 124 | .panel-collapse { 125 | 126 | } 127 | } 128 | 129 | 130 | // Contextual variations 131 | .panel-default { 132 | .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border); 133 | } 134 | .panel-primary { 135 | .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border); 136 | } 137 | .panel-success { 138 | .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border); 139 | } 140 | .panel-warning { 141 | .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border); 142 | } 143 | .panel-danger { 144 | .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border); 145 | } 146 | .panel-info { 147 | .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border); 148 | } 149 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/popovers.less: -------------------------------------------------------------------------------- 1 | // 2 | // Popovers 3 | // -------------------------------------------------- 4 | 5 | 6 | .popover { 7 | position: absolute; 8 | top: 0; 9 | left: 0; 10 | z-index: @zindex-popover; 11 | display: none; 12 | max-width: @popover-max-width; 13 | padding: 1px; 14 | text-align: left; // Reset given new insertion method 15 | background-color: @popover-bg; 16 | background-clip: padding-box; 17 | border: 1px solid @popover-fallback-border-color; 18 | border: 1px solid @popover-border-color; 19 | border-radius: @border-radius-large; 20 | .box-shadow(0 5px 10px rgba(0,0,0,.2)); 21 | 22 | // Overrides for proper insertion 23 | white-space: normal; 24 | 25 | // Offset the popover to account for the popover arrow 26 | &.top { margin-top: -10px; } 27 | &.right { margin-left: 10px; } 28 | &.bottom { margin-top: 10px; } 29 | &.left { margin-left: -10px; } 30 | } 31 | 32 | .popover-title { 33 | margin: 0; // reset heading margin 34 | padding: 8px 14px; 35 | font-size: @font-size-base; 36 | font-weight: normal; 37 | line-height: 18px; 38 | background-color: @popover-title-bg; 39 | border-bottom: 1px solid darken(@popover-title-bg, 5%); 40 | border-radius: 5px 5px 0 0; 41 | } 42 | 43 | .popover-content { 44 | padding: 9px 14px; 45 | } 46 | 47 | // Arrows 48 | // 49 | // .arrow is outer, .arrow:after is inner 50 | 51 | .popover .arrow { 52 | &, 53 | &:after { 54 | position: absolute; 55 | display: block; 56 | width: 0; 57 | height: 0; 58 | border-color: transparent; 59 | border-style: solid; 60 | } 61 | } 62 | .popover .arrow { 63 | border-width: @popover-arrow-outer-width; 64 | } 65 | .popover .arrow:after { 66 | border-width: @popover-arrow-width; 67 | content: ""; 68 | } 69 | 70 | .popover { 71 | &.top .arrow { 72 | left: 50%; 73 | margin-left: -@popover-arrow-outer-width; 74 | border-bottom-width: 0; 75 | border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback 76 | border-top-color: @popover-arrow-outer-color; 77 | bottom: -@popover-arrow-outer-width; 78 | &:after { 79 | content: " "; 80 | bottom: 1px; 81 | margin-left: -@popover-arrow-width; 82 | border-bottom-width: 0; 83 | border-top-color: @popover-arrow-color; 84 | } 85 | } 86 | &.right .arrow { 87 | top: 50%; 88 | left: -@popover-arrow-outer-width; 89 | margin-top: -@popover-arrow-outer-width; 90 | border-left-width: 0; 91 | border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback 92 | border-right-color: @popover-arrow-outer-color; 93 | &:after { 94 | content: " "; 95 | left: 1px; 96 | bottom: -@popover-arrow-width; 97 | border-left-width: 0; 98 | border-right-color: @popover-arrow-color; 99 | } 100 | } 101 | &.bottom .arrow { 102 | left: 50%; 103 | margin-left: -@popover-arrow-outer-width; 104 | border-top-width: 0; 105 | border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback 106 | border-bottom-color: @popover-arrow-outer-color; 107 | top: -@popover-arrow-outer-width; 108 | &:after { 109 | content: " "; 110 | top: 1px; 111 | margin-left: -@popover-arrow-width; 112 | border-top-width: 0; 113 | border-bottom-color: @popover-arrow-color; 114 | } 115 | } 116 | 117 | &.left .arrow { 118 | top: 50%; 119 | right: -@popover-arrow-outer-width; 120 | margin-top: -@popover-arrow-outer-width; 121 | border-right-width: 0; 122 | border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback 123 | border-left-color: @popover-arrow-outer-color; 124 | &:after { 125 | content: " "; 126 | right: 1px; 127 | border-right-width: 0; 128 | border-left-color: @popover-arrow-color; 129 | bottom: -@popover-arrow-width; 130 | } 131 | } 132 | 133 | } 134 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/print.less: -------------------------------------------------------------------------------- 1 | // 2 | // Basic print styles 3 | // -------------------------------------------------- 4 | // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css 5 | 6 | @media print { 7 | 8 | * { 9 | text-shadow: none !important; 10 | color: #000 !important; // Black prints faster: h5bp.com/s 11 | background: transparent !important; 12 | box-shadow: none !important; 13 | } 14 | 15 | a, 16 | a:visited { 17 | text-decoration: underline; 18 | } 19 | 20 | a[href]:after { 21 | content: " (" attr(href) ")"; 22 | } 23 | 24 | abbr[title]:after { 25 | content: " (" attr(title) ")"; 26 | } 27 | 28 | // Don't show links for images, or javascript/internal links 29 | .ir a:after, 30 | a[href^="javascript:"]:after, 31 | a[href^="#"]:after { 32 | content: ""; 33 | } 34 | 35 | pre, 36 | blockquote { 37 | border: 1px solid #999; 38 | page-break-inside: avoid; 39 | } 40 | 41 | thead { 42 | display: table-header-group; // h5bp.com/t 43 | } 44 | 45 | tr, 46 | img { 47 | page-break-inside: avoid; 48 | } 49 | 50 | img { 51 | max-width: 100% !important; 52 | } 53 | 54 | @page { 55 | margin: 2cm .5cm; 56 | } 57 | 58 | p, 59 | h2, 60 | h3 { 61 | orphans: 3; 62 | widows: 3; 63 | } 64 | 65 | h2, 66 | h3 { 67 | page-break-after: avoid; 68 | } 69 | 70 | // Bootstrap components 71 | .navbar { 72 | display: none; 73 | } 74 | .table { 75 | td, 76 | th { 77 | background-color: #fff !important; 78 | } 79 | } 80 | .btn, 81 | .dropup > .btn { 82 | > .caret { 83 | border-top-color: #000 !important; 84 | } 85 | } 86 | .label { 87 | border: 1px solid #000; 88 | } 89 | 90 | .table { 91 | border-collapse: collapse !important; 92 | } 93 | .table-bordered { 94 | th, 95 | td { 96 | border: 1px solid #ddd !important; 97 | } 98 | } 99 | 100 | } 101 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // Webkit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Firefox 16 | @-moz-keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | // Opera 22 | @-o-keyframes progress-bar-stripes { 23 | from { background-position: 0 0; } 24 | to { background-position: 40px 0; } 25 | } 26 | 27 | // Spec and IE10+ 28 | @keyframes progress-bar-stripes { 29 | from { background-position: 40px 0; } 30 | to { background-position: 0 0; } 31 | } 32 | 33 | 34 | 35 | // Bar itself 36 | // ------------------------- 37 | 38 | // Outer container 39 | .progress { 40 | overflow: hidden; 41 | height: @line-height-computed; 42 | margin-bottom: @line-height-computed; 43 | background-color: @progress-bg; 44 | border-radius: @border-radius-base; 45 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 46 | } 47 | 48 | // Bar of progress 49 | .progress-bar { 50 | float: left; 51 | width: 0%; 52 | height: 100%; 53 | font-size: @font-size-small; 54 | color: @progress-bar-color; 55 | text-align: center; 56 | background-color: @progress-bar-bg; 57 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 58 | .transition(width .6s ease); 59 | } 60 | 61 | // Striped bars 62 | .progress-striped .progress-bar { 63 | #gradient > .striped(@progress-bar-bg); 64 | background-size: 40px 40px; 65 | } 66 | 67 | // Call animation for the active one 68 | .progress.active .progress-bar { 69 | -webkit-animation: progress-bar-stripes 2s linear infinite; 70 | -moz-animation: progress-bar-stripes 2s linear infinite; 71 | -ms-animation: progress-bar-stripes 2s linear infinite; 72 | -o-animation: progress-bar-stripes 2s linear infinite; 73 | animation: progress-bar-stripes 2s linear infinite; 74 | } 75 | 76 | 77 | 78 | // Variations 79 | // ------------------------- 80 | 81 | .progress-bar-success { 82 | .progress-bar-variant(@progress-bar-success-bg); 83 | } 84 | 85 | .progress-bar-info { 86 | .progress-bar-variant(@progress-bar-info-bg); 87 | } 88 | 89 | .progress-bar-warning { 90 | .progress-bar-variant(@progress-bar-warning-bg); 91 | } 92 | 93 | .progress-bar-danger { 94 | .progress-bar-variant(@progress-bar-danger-bg); 95 | } 96 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Reset the box-sizing 7 | 8 | *, 9 | *:before, 10 | *:after { 11 | .box-sizing(border-box); 12 | } 13 | 14 | 15 | // Body reset 16 | 17 | html { 18 | font-size: 62.5%; 19 | -webkit-tap-highlight-color: rgba(0,0,0,0); 20 | } 21 | 22 | body { 23 | font-family: @font-family-base; 24 | font-size: @font-size-base; 25 | line-height: @line-height-base; 26 | color: @text-color; 27 | background-color: @body-bg; 28 | } 29 | 30 | // Reset fonts for relevant elements 31 | input, 32 | button, 33 | select, 34 | textarea { 35 | font-family: inherit; 36 | font-size: inherit; 37 | line-height: inherit; 38 | } 39 | 40 | // Reset unusual Firefox-on-Android default style. 41 | // 42 | // See https://github.com/necolas/normalize.css/issues/214 43 | 44 | button, 45 | input, 46 | select[multiple], 47 | textarea { 48 | background-image: none; 49 | } 50 | 51 | 52 | // Links 53 | 54 | a { 55 | color: @link-color; 56 | text-decoration: none; 57 | 58 | &:hover, 59 | &:focus { 60 | color: @link-hover-color; 61 | text-decoration: underline; 62 | } 63 | 64 | &:focus { 65 | .tab-focus(); 66 | } 67 | } 68 | 69 | 70 | // Images 71 | 72 | img { 73 | vertical-align: middle; 74 | } 75 | 76 | // Responsive images (ensure images don't scale beyond their parents) 77 | .img-responsive { 78 | .img-responsive(); 79 | } 80 | 81 | // Rounded corners 82 | .img-rounded { 83 | border-radius: @border-radius-large; 84 | } 85 | 86 | // Image thumbnails 87 | // 88 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. 89 | .img-thumbnail { 90 | padding: @thumbnail-padding; 91 | line-height: @line-height-base; 92 | background-color: @thumbnail-bg; 93 | border: 1px solid @thumbnail-border; 94 | border-radius: @thumbnail-border-radius; 95 | .transition(all .2s ease-in-out); 96 | 97 | // Keep them at most 100% wide 98 | .img-responsive(inline-block); 99 | } 100 | 101 | // Perfect circle 102 | .img-circle { 103 | border-radius: 50%; // set radius in percents 104 | } 105 | 106 | 107 | // Horizontal rules 108 | 109 | hr { 110 | margin-top: @line-height-computed; 111 | margin-bottom: @line-height-computed; 112 | border: 0; 113 | border-top: 1px solid @hr-border; 114 | } 115 | 116 | 117 | // Only display content to screen readers 118 | // 119 | // See: http://a11yproject.com/posts/how-to-hide-content/ 120 | 121 | .sr-only { 122 | position: absolute; 123 | width: 1px; 124 | height: 1px; 125 | margin: -1px; 126 | padding: 0; 127 | overflow: hidden; 128 | clip: rect(0 0 0 0); 129 | border: 0; 130 | } 131 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | .img-thumbnail(); 9 | display: block; // Override the inline-block from `.img-thumbnail` 10 | 11 | > img { 12 | .img-responsive(); 13 | } 14 | } 15 | 16 | 17 | // Add a hover state for linked versions only 18 | a.thumbnail:hover, 19 | a.thumbnail:focus { 20 | border-color: @link-color; 21 | } 22 | 23 | // Images and captions 24 | .thumbnail > img { 25 | margin-left: auto; 26 | margin-right: auto; 27 | } 28 | .thumbnail .caption { 29 | padding: @thumbnail-caption-padding; 30 | color: @thumbnail-caption-color; 31 | } 32 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/tooltip.less: -------------------------------------------------------------------------------- 1 | // 2 | // Tooltips 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .tooltip { 8 | position: absolute; 9 | z-index: @zindex-tooltip; 10 | display: block; 11 | visibility: visible; 12 | font-size: @font-size-small; 13 | line-height: 1.4; 14 | .opacity(0); 15 | 16 | &.in { .opacity(.9); } 17 | &.top { margin-top: -3px; padding: 5px 0; } 18 | &.right { margin-left: 3px; padding: 0 5px; } 19 | &.bottom { margin-top: 3px; padding: 5px 0; } 20 | &.left { margin-left: -3px; padding: 0 5px; } 21 | } 22 | 23 | // Wrapper for the tooltip content 24 | .tooltip-inner { 25 | max-width: @tooltip-max-width; 26 | padding: 3px 8px; 27 | color: @tooltip-color; 28 | text-align: center; 29 | text-decoration: none; 30 | background-color: @tooltip-bg; 31 | border-radius: @border-radius-base; 32 | } 33 | 34 | // Arrows 35 | .tooltip-arrow { 36 | position: absolute; 37 | width: 0; 38 | height: 0; 39 | border-color: transparent; 40 | border-style: solid; 41 | } 42 | .tooltip { 43 | &.top .tooltip-arrow { 44 | bottom: 0; 45 | left: 50%; 46 | margin-left: -@tooltip-arrow-width; 47 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 48 | border-top-color: @tooltip-arrow-color; 49 | } 50 | &.top-left .tooltip-arrow { 51 | bottom: 0; 52 | left: 5px; 53 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 54 | border-top-color: @tooltip-arrow-color; 55 | } 56 | &.top-right .tooltip-arrow { 57 | bottom: 0; 58 | right: 5px; 59 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0; 60 | border-top-color: @tooltip-arrow-color; 61 | } 62 | &.right .tooltip-arrow { 63 | top: 50%; 64 | left: 0; 65 | margin-top: -@tooltip-arrow-width; 66 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; 67 | border-right-color: @tooltip-arrow-color; 68 | } 69 | &.left .tooltip-arrow { 70 | top: 50%; 71 | right: 0; 72 | margin-top: -@tooltip-arrow-width; 73 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; 74 | border-left-color: @tooltip-arrow-color; 75 | } 76 | &.bottom .tooltip-arrow { 77 | top: 0; 78 | left: 50%; 79 | margin-left: -@tooltip-arrow-width; 80 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 81 | border-bottom-color: @tooltip-arrow-color; 82 | } 83 | &.bottom-left .tooltip-arrow { 84 | top: 0; 85 | left: 5px; 86 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 87 | border-bottom-color: @tooltip-arrow-color; 88 | } 89 | &.bottom-right .tooltip-arrow { 90 | top: 0; 91 | right: 5px; 92 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; 93 | border-bottom-color: @tooltip-arrow-color; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .pull-right { 13 | float: right !important; 14 | } 15 | .pull-left { 16 | float: left !important; 17 | } 18 | 19 | 20 | // Toggling content 21 | // ------------------------- 22 | 23 | .hide { 24 | display: none !important; 25 | } 26 | .show { 27 | display: block !important; 28 | } 29 | .invisible { 30 | visibility: hidden; 31 | } 32 | .text-hide { 33 | .hide-text(); 34 | } 35 | 36 | 37 | // For Affix plugin 38 | // ------------------------- 39 | 40 | .affix { 41 | position: fixed; 42 | } 43 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/less/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid darken(@well-bg, 7%); 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /app/bower_components/bootstrap/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap" 3 | , "description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development." 4 | , "version": "3.0.0" 5 | , "keywords": ["bootstrap", "css"] 6 | , "homepage": "http://twbs.github.com/bootstrap/" 7 | , "author": "Twitter Inc." 8 | , "scripts": { "test": "grunt test" } 9 | , "repository": { 10 | "type": "git" 11 | , "url": "https://github.com/twbs/bootstrap.git" 12 | } 13 | , "licenses": [ 14 | { 15 | "type": "Apache-2.0" 16 | , "url": "http://www.apache.org/licenses/LICENSE-2.0" 17 | } 18 | ] 19 | , "devDependencies": { 20 | "grunt": "~0.4.1" 21 | , "grunt-contrib-clean": "~0.5.0" 22 | , "grunt-contrib-connect": "~0.3.0" 23 | , "grunt-contrib-concat": "~0.3.0" 24 | , "grunt-contrib-copy": "~0.4.0" 25 | , "grunt-contrib-jshint": "~0.6.0" 26 | , "grunt-contrib-uglify": "~0.2.2" 27 | , "grunt-contrib-qunit": "~0.2.2" 28 | , "grunt-contrib-watch": "~0.5.1" 29 | , "grunt-html-validation": "git://github.com/praveenvijayan/grunt-html-validation.git" 30 | , "grunt-jekyll": "~0.3.8" 31 | , "grunt-recess": "~0.3.3" 32 | , "browserstack-runner": "~0.0.11" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/bower_components/jquery/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "2.0.3", 4 | "description": "jQuery component", 5 | "keywords": [ 6 | "jquery", 7 | "component" 8 | ], 9 | "main": "jquery.js", 10 | "license": "MIT", 11 | "homepage": "https://github.com/components/jquery", 12 | "_release": "2.0.3", 13 | "_resolution": { 14 | "type": "version", 15 | "tag": "2.0.3", 16 | "commit": "452a56b52b8f4a032256cdb8b6838f25f0bdb3d2" 17 | }, 18 | "_source": "git://github.com/components/jquery.git", 19 | "_target": "~2.0.3", 20 | "_originalSource": "jquery", 21 | "_direct": true 22 | } -------------------------------------------------------------------------------- /app/bower_components/jquery/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /app/bower_components/jquery/README.md: -------------------------------------------------------------------------------- 1 | jQuery Component 2 | ================ 3 | 4 | Shim repository for the [jQuery](http://jquery.com). 5 | 6 | Package Managers 7 | ---------------- 8 | 9 | * [Bower](http://bower.io/): `jquery` 10 | * [Component](https://github.com/component/component): `components/jquery` 11 | * [Composer](http://packagist.org/packages/components/jquery): `components/jquery` 12 | -------------------------------------------------------------------------------- /app/bower_components/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "2.0.3", 4 | "description": "jQuery component", 5 | "keywords": [ 6 | "jquery", 7 | "component" 8 | ], 9 | "main": "jquery.js", 10 | "license": "MIT" 11 | } 12 | -------------------------------------------------------------------------------- /app/bower_components/jquery/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "repo": "components/jquery", 4 | "version": "2.0.3", 5 | "description": "jQuery component", 6 | "keywords": [ 7 | "jquery", 8 | "component" 9 | ], 10 | "main": "jquery.js", 11 | "scripts": [ 12 | "jquery.js" 13 | ], 14 | "license": "MIT" 15 | } 16 | -------------------------------------------------------------------------------- /app/bower_components/jquery/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "components/jquery", 3 | "description": "jQuery JavaScript Library", 4 | "type": "component", 5 | "homepage": "http://jquery.com", 6 | "license": "MIT", 7 | "support": { 8 | "irc": "irc://irc.freenode.org/jquery", 9 | "issues": "http://bugs.jquery.com", 10 | "forum": "http://forum.jquery.com", 11 | "wiki": "http://docs.jquery.com/", 12 | "source": "https://github.com/jquery/jquery" 13 | }, 14 | "authors": [ 15 | { 16 | "name": "John Resig", 17 | "email": "jeresig@gmail.com" 18 | } 19 | ], 20 | "require": { 21 | "robloach/component-installer": "*" 22 | }, 23 | "extra": { 24 | "component": { 25 | "scripts": [ 26 | "jquery.js" 27 | ], 28 | "files": [ 29 | "jquery.min.js", 30 | "jquery-migrate.js", 31 | "jquery-migrate.min.js" 32 | ] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/bower_components/jquery/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "components-jquery", 3 | "version": "2.0.3", 4 | "description": "jQuery component", 5 | "keywords": ["jquery"], 6 | "main": "./jquery.js" 7 | } 8 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | angular-better-placeholders 7 | 8 | 9 | 10 | 11 | 12 | 13 |
          14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/scripts/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var app = angular.module('PlaceholderDemoApp', ['angularBetterPlaceholder']) 4 | .config(function ($routeProvider) { 5 | $routeProvider 6 | .when('/', { 7 | templateUrl: 'views/main.html', 8 | controller: 'MainCtrl' 9 | }) 10 | }); -------------------------------------------------------------------------------- /app/scripts/controllers/Main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('PlaceholderDemoApp') 4 | .controller('MainCtrl', function MainCtrl($scope) { 5 | $scope.user = {} 6 | }) -------------------------------------------------------------------------------- /app/scripts/directives/angular-better-placeholder.js: -------------------------------------------------------------------------------- 1 | angular.module('angularBetterPlaceholder', []).directive('betterPlaceholder', function() { 2 | return { 3 | restrict: 'C', 4 | require: '?ngModel', 5 | scope: {}, 6 | link: function(scope, element, attrs, ngModel) { 7 | var activate, deactivate, isEmpty, placeholder; 8 | isEmpty = function(value) { 9 | if (value == null) { 10 | value = ngModel && (ngModel != null) ? ngModel.$viewValue : element.val(); 11 | } 12 | return !element[0].validity.badInput && (!value || value === ''); 13 | }; 14 | if (attrs.ngPlaceholder != null) { 15 | scope.placeholder = scope.$parent.$eval(attrs.ngPlaceholder); 16 | element.attr('placeholder', scope.placeholder); 17 | scope.$parent.$watch(attrs.ngPlaceholder, function(val) { 18 | element.attr('placeholder', val); 19 | return placeholder.html(val); 20 | }); 21 | } else if ((attrs.placeholder != null) && attrs.placeholder !== '') { 22 | scope.placeholder = attrs.placeholder; 23 | } else { 24 | throw "better-placeholder requires an ng-placeholder or placeholder attribute"; 25 | } 26 | placeholder = angular.element("" + scope.placeholder + ""); 27 | element.after(placeholder); 28 | placeholder.on('click', function() { 29 | return element[0].focus(); 30 | }); 31 | activate = function() { 32 | element.addClass('better-placeholder-active'); 33 | return placeholder.addClass('active'); 34 | }; 35 | deactivate = function() { 36 | if (isEmpty()) { 37 | element.removeClass('better-placeholder-active'); 38 | return placeholder.removeClass('active'); 39 | } 40 | }; 41 | element.on('focus', activate); 42 | element.on('blur', deactivate); 43 | element.on('change', function() { 44 | if (isEmpty()) { 45 | element.removeClass('better-placeholder-active'); 46 | return placeholder.removeClass('active'); 47 | } else { 48 | element.addClass('better-placeholder-active'); 49 | return placeholder.addClass('active'); 50 | } 51 | }); 52 | if (ngModel != null) { 53 | return ngModel.$formatters.push(function(value) { 54 | if (isEmpty(value)) { 55 | element.removeClass('better-placeholder-active'); 56 | placeholder.removeClass('active'); 57 | } else { 58 | element.addClass('better-placeholder-active'); 59 | placeholder.addClass('active'); 60 | } 61 | return value; 62 | }); 63 | } else if (!isEmpty()) { 64 | return activate(); 65 | } 66 | } 67 | }; 68 | }); 69 | -------------------------------------------------------------------------------- /app/views/main.html: -------------------------------------------------------------------------------- 1 |
          2 |
          3 |
          4 |

          angular-better-placeholders by @dmackerman

          5 |

          Better, more friendly implementation of placeholder for form fields inside of Bootstrap. and elsewhere
          6 | Inspired by a really cool Dribble concept.

          7 | Download 8 | View on Github 10 |
          11 |

          Demo

          12 |

          Begin typing in a field to trigger the placeholder text. If an input ever becomes unfocused and is empty, the placeholder should disapear.

          13 |
          14 |
          15 |
          16 |
          17 | 19 |
          20 |
          21 | 23 |
          24 |
          25 | 27 |
          28 |
          29 |
          30 |
          31 |
          32 |
          33 |
          34 |

          Usage

          35 |

          Simple include the better-placeholder directive as a class on your input fields.

          36 |
          37 | <input type="text" ng-model="user.firstName" class="form-control better-placeholder" placeholder="First Name" />
          38 |

          Include the following CSS snipets:

          39 |
          40 | .better-placeholder {
          41 |   transition: all .2s ease;
          42 | }
          43 | .better-placeholder.better-placeholder-active {
          44 |   padding: 34px 12px 16px 12px;
          45 | }
          46 | .better-placeholder-text {
          47 |   position: absolute;
          48 |   top: 5px; left: 28px;
          49 |   font-size: 10px;
          50 |   font-weight: bold;
          51 | }
          52 |     
          53 |
          54 |

          55 | Todo 56 |

          57 |
            58 |
          • Look into $templateCache
          • 59 |
          • Optimize terrible code
          • 60 |
          • Better CSS integration
          • 61 |
          • Include better transition for the actual placeholder label
          • 62 |
          63 |
          -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-better-placeholders", 3 | "version": "0.3.0", 4 | "authors": [ 5 | "Dave Ackerman ", 6 | "SimeonC " 7 | ], 8 | "main": "src/angular-better-placeholders.js", 9 | "description": "Angular directive for enhanced placeholders that integrate with Bootstrap form fields.", 10 | "keywords": [ 11 | "angular", 12 | "forms", 13 | "placeholder", 14 | "bootstrap" 15 | ], 16 | "license": "MIT", 17 | "ignore": [ 18 | "**/.*", 19 | "node_modules", 20 | "bower_components", 21 | "test", 22 | "tests" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /src/angular-better-placeholders.coffee: -------------------------------------------------------------------------------- 1 | # version 0.3.0 2 | # Compile with coffee -c -b --no-header angular-better-placeholders.coffee > angular-better-placeholders.js 3 | angular.module('angularBetterPlaceholder', []) 4 | .directive 'betterPlaceholder', -> 5 | restrict: 'C' 6 | require: '?ngModel' 7 | link: (scope, element, attrs, ngModel) -> 8 | if not element.prev then element.prev = -> 9 | p = element 10 | loop 11 | p = p.previousSibling 12 | break unless p and p.nodeType isnt 1 13 | return p 14 | # if ngModel is invalid then it can occur that the viewValue is empty 15 | isEmpty = (value= if ngModel and ngModel? then ngModel.$viewValue else element.val()) -> 16 | ( 17 | not element[0].validity.badInput and # empty if not badInput, if badinput model gets set to undefined but there IS content 18 | not ( # negate the following test which tests if it has content 19 | value? and #value is not null/undefined 20 | ( 21 | not angular.isString(value) or value isnt '' # if it's a string it's not the empty stryng 22 | ) and 23 | ( 24 | not angular.isArray(value) or not value.isEmpty() # if it's an array (case of using ng-list) it's more than length 0 25 | ) and 26 | ( 27 | angular.isString(value) or angular.isArray(value) or ( 28 | element.val().trim().length > 0 or # test if the actual content has length, to prevent false positives 29 | not isNaN(value) # otherwise check it is a number 30 | ) 31 | ) 32 | ) 33 | ) 34 | required = angular.element '' 35 | placeholder = angular.element "" 36 | if element.attr('id')? then placeholder.attr 'for', element.attr 'id' 37 | else 38 | customId = 'placeholderid_' + (Math.random() * 10000000000000000) 39 | element.attr 'id', customId 40 | placeholder.attr 'for', customId 41 | element.after placeholder 42 | 43 | placeholder.html attrs.placeholder 44 | if not attrs.placeholder? or attrs.placeholder.trim() is '' # if there is no placeholder then don't show the animations 45 | placeholder.addClass 'ng-hide' 46 | element.removeClass 'better-placeholder' 47 | if attrs.required then placeholder.append required 48 | attrs.$observe 'placeholder', (val) -> 49 | placeholder.html val 50 | if attrs.required then placeholder.append required 51 | if not val? or val.trim() is '' # if there is no placeholder then don't show the animations 52 | placeholder.addClass 'ng-hide' 53 | element.removeClass 'better-placeholder' 54 | else # if there is a placeholder then make sure the class for the animations is re-added if it's been removed 55 | placeholder.removeClass 'ng-hide' 56 | element.addClass 'better-placeholder' 57 | 58 | placeholder.on 'click', -> element[0].focus() 59 | 60 | attrs.$observe 'required', (val) -> 61 | if val then placeholder.append required 62 | else required.remove() 63 | 64 | activate = -> 65 | if attrs.placeholder? and attrs.placeholder.trim() isnt '' 66 | element.addClass 'better-placeholder-active' 67 | placeholder.addClass 'active' 68 | if element.prev()? and element.prev().hasClass 'input-group-btn' then element.prev().addClass 'better-placeholder-button-active' 69 | deactivate = -> 70 | element.removeClass 'better-placeholder-active' 71 | placeholder.removeClass 'active' 72 | if element.prev()? and element.prev().hasClass 'input-group-btn' then element.prev().removeClass 'better-placeholder-button-active' 73 | 74 | # catch changes from the DOM 75 | element.on 'blur', -> if isEmpty() then deactivate() 76 | element.on 'change input', -> 77 | if isEmpty() then deactivate() 78 | else activate() 79 | if element.prev()? and element.prev().hasClass 'input-group-btn' then element.prev().addClass 'better-placeholder-button' 80 | if ngModel? then ngModel.$formatters.push (value) -> 81 | if isEmpty value then deactivate() 82 | else activate() 83 | value 84 | else if not isEmpty() then activate() 85 | -------------------------------------------------------------------------------- /src/angular-better-placeholders.css: -------------------------------------------------------------------------------- 1 | .better-placeholder{-webkit-transition:all .2s ease;transition:all .2s ease;}.better-placeholder::-webkit-input-placeholder{opacity:0}.better-placeholder::-moz-placeholder{opacity:0}.better-placeholder:-ms-input-placeholder{opacity:0}.better-placeholder::placeholder{opacity:0}.better-placeholder::-webkit-datetime-edit{-webkit-transition:all .2s ease;transition:all .2s ease;opacity:0}.better-placeholder.fixed-height{padding-top:18px;height:auto;}.better-placeholder.fixed-height:not(.better-placeholder-active) ~ .better-placeholder-text:not(.active){top:14px}.better-placeholder-active,.ui-select-bootstrap.dropdown.open .better-placeholder{padding-top:18px;height:auto;}.better-placeholder-active::-webkit-datetime-edit,.ui-select-bootstrap.dropdown.open .better-placeholder::-webkit-datetime-edit{opacity:1}.better-placeholder-active::-webkit-input-placeholder,.ui-select-bootstrap.dropdown.open .better-placeholder::-webkit-input-placeholder{opacity:0}.better-placeholder-active::-moz-placeholder,.ui-select-bootstrap.dropdown.open .better-placeholder::-moz-placeholder{opacity:0}.better-placeholder-active:-ms-input-placeholder,.ui-select-bootstrap.dropdown.open .better-placeholder:-ms-input-placeholder{opacity:0}.better-placeholder-active::placeholder,.ui-select-bootstrap.dropdown.open .better-placeholder::placeholder{opacity:0}.input-group .better-placeholder ~ .input-group-btn .btn,.better-placeholder-button .btn{-webkit-transition:all .2s ease;transition:all .2s ease}.input-group .better-placeholder-active ~ .input-group-btn .btn,.better-placeholder-button-active .btn{padding:12px}.dropdown-menu .better-placeholder-text{z-index:1000}.better-placeholder-text,.help-block.better-placeholder-text{z-index:10;-webkit-transition:all .2s ease;transition:all .2s ease;position:absolute;top:2px;margin-left:12px;line-height:20px;height:20px;color:placeholder;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;max-width:85%;margin-right:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.better-placeholder-text.active,.better-placeholder-active ~ .better-placeholder-text{max-width:110%;visibility:visible;-webkit-transform:scale(.8);-ms-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;color:#428bca;top:-2px}.better-placeholder.disabled,.better-placeholder.disabled ~ .better-placeholder-text{color:#999}.fa-required{margin-left:6px;font-size:70%;vertical-align:super}td.input-group .better-placeholder-text,td.input-group .help-block.better-placeholder-text{top:11px}td.input-group .better-placeholder-text.active,td.input-group .better-placeholder-active ~ .better-placeholder-text{top:7px;}.ui-select-bootstrap.dropdown.open .better-placeholder.inverted,.better-placeholder-active.inverted{padding-bottom:18px;padding-top:6px}.better-placeholder.inverted ~ .better-placeholder-text.inverted,.better-placeholder.inverted ~ .help-block.better-placeholder-text.inverted,.better-placeholder-text.inverted,.help-block.better-placeholder-text.inverte{bottom:2px;top:auto}.better-placeholder-text.inverted.active,.better-placeholder-active.inverted ~ .better-placeholder-text{max-width:110%;visibility:visible;-webkit-transform:scale(.8);-ms-transform:scale(.8);transform:scale(.8);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;color:#428bca;bottom:-8px;top:auto}td.input-group .better-placeholder.inverted ~ .better-placeholder-text.inverted,td.input-group .better-placeholder.inverted ~ .help-block.better-placeholder-text.inverted,td.input-group .better-placeholder-text.inverted,td.input-group .help-block.better-placeholder-text.inverte{top:auto;bottom:11px}td.input-group .better-placeholder-text.inverted.active,td.input-group .better-placeholder-active.inverted ~ .better-placeholder-text{top:auto;bottom:1px} -------------------------------------------------------------------------------- /src/angular-better-placeholders.js: -------------------------------------------------------------------------------- 1 | // version 0.3.0 2 | angular.module('angularBetterPlaceholder', []).directive('betterPlaceholder', function() { 3 | return { 4 | restrict: 'C', 5 | require: '?ngModel', 6 | link: function(scope, element, attrs, ngModel) { 7 | var activate, customId, deactivate, isEmpty, placeholder, required; 8 | if (!element.prev) { 9 | element.prev = function() { 10 | var p; 11 | p = element; 12 | while (true) { 13 | p = p.previousSibling; 14 | if (!(p && p.nodeType !== 1)) { 15 | break; 16 | } 17 | } 18 | return p; 19 | }; 20 | } 21 | isEmpty = function(value) { 22 | if (value == null) { 23 | value = ngModel && (ngModel != null) ? ngModel.$viewValue : element.val(); 24 | } 25 | return !element[0].validity.badInput && !((value != null) && (!angular.isString(value) || value !== '') && (!angular.isArray(value) || !value.isEmpty()) && (angular.isString(value) || angular.isArray(value) || (element.val().trim().length > 0 || !isNaN(value)))); 26 | }; 27 | required = angular.element(''); 28 | placeholder = angular.element(""); 29 | if (element.attr('id') != null) { 30 | placeholder.attr('for', element.attr('id')); 31 | } else { 32 | customId = 'placeholderid_' + (Math.random() * 10000000000000000); 33 | element.attr('id', customId); 34 | placeholder.attr('for', customId); 35 | } 36 | element.after(placeholder); 37 | placeholder.html(attrs.placeholder); 38 | if ((attrs.placeholder == null) || attrs.placeholder.trim() === '') { 39 | placeholder.addClass('ng-hide'); 40 | element.removeClass('better-placeholder'); 41 | } 42 | if (attrs.required) { 43 | placeholder.append(required); 44 | } 45 | attrs.$observe('placeholder', function(val) { 46 | placeholder.html(val); 47 | if (attrs.required) { 48 | placeholder.append(required); 49 | } 50 | if ((val == null) || val.trim() === '') { 51 | placeholder.addClass('ng-hide'); 52 | return element.removeClass('better-placeholder'); 53 | } else { 54 | placeholder.removeClass('ng-hide'); 55 | return element.addClass('better-placeholder'); 56 | } 57 | }); 58 | placeholder.on('click', function() { 59 | return element[0].focus(); 60 | }); 61 | attrs.$observe('required', function(val) { 62 | if (val) { 63 | return placeholder.append(required); 64 | } else { 65 | return required.remove(); 66 | } 67 | }); 68 | activate = function() { 69 | if ((attrs.placeholder != null) && attrs.placeholder.trim() !== '') { 70 | element.addClass('better-placeholder-active'); 71 | placeholder.addClass('active'); 72 | if ((element.prev() != null) && element.prev().hasClass('input-group-btn')) { 73 | return element.prev().addClass('better-placeholder-button-active'); 74 | } 75 | } 76 | }; 77 | deactivate = function() { 78 | element.removeClass('better-placeholder-active'); 79 | placeholder.removeClass('active'); 80 | if ((element.prev() != null) && element.prev().hasClass('input-group-btn')) { 81 | return element.prev().removeClass('better-placeholder-button-active'); 82 | } 83 | }; 84 | element.on('blur', function() { 85 | if (isEmpty()) { 86 | return deactivate(); 87 | } 88 | }); 89 | element.on('change input', function() { 90 | if (isEmpty()) { 91 | return deactivate(); 92 | } else { 93 | return activate(); 94 | } 95 | }); 96 | if ((element.prev() != null) && element.prev().hasClass('input-group-btn')) { 97 | element.prev().addClass('better-placeholder-button'); 98 | } 99 | if (ngModel != null) { 100 | return ngModel.$formatters.push(function(value) { 101 | if (isEmpty(value)) { 102 | deactivate(); 103 | } else { 104 | activate(); 105 | } 106 | return value; 107 | }); 108 | } else if (!isEmpty()) { 109 | return activate(); 110 | } 111 | } 112 | }; 113 | }); 114 | -------------------------------------------------------------------------------- /src/angular-better-placeholders.styl: -------------------------------------------------------------------------------- 1 | // compile with stylus -u autoprefixer-stylus -c angular-better-placeholders.styl 2 | 3 | default-transition-duration = 0.2s 4 | 5 | .better-placeholder 6 | transition all default-transition-duration ease 7 | &::placeholder 8 | opacity 0 9 | &::-webkit-datetime-edit 10 | transition all default-transition-duration ease 11 | opacity 0 12 | &.fixed-height 13 | padding-top 18px 14 | height auto 15 | &:not(.better-placeholder-active) ~ .better-placeholder-text:not(.active) 16 | top 14px 17 | 18 | .better-placeholder-active, .ui-select-bootstrap.dropdown.open .better-placeholder 19 | padding-top 18px 20 | height auto 21 | &::-webkit-datetime-edit 22 | opacity 1 23 | &::placeholder 24 | opacity 0 25 | 26 | .input-group .better-placeholder ~ .input-group-btn .btn, .better-placeholder-button .btn 27 | transition all default-transition-duration ease 28 | .input-group .better-placeholder-active ~ .input-group-btn .btn, .better-placeholder-button-active .btn 29 | padding 12px 30 | 31 | .dropdown-menu .better-placeholder-text 32 | z-index 1000 33 | .better-placeholder-text, .help-block.better-placeholder-text 34 | z-index 10 35 | transition all default-transition-duration ease 36 | position absolute 37 | top 2px 38 | margin-left 12px 39 | line-height 20px 40 | height 20px 41 | color placeholder 42 | transform-origin 0 0 43 | max-width 85% 44 | margin-right 12px 45 | white-space nowrap 46 | overflow hidden 47 | text-overflow ellipsis 48 | .better-placeholder-text.active, .better-placeholder-active ~ .better-placeholder-text 49 | max-width 110% 50 | visibility visible 51 | transform scale(.8) 52 | transform-origin 0 0 53 | color #428bca 54 | top -2px 55 | 56 | .better-placeholder.disabled, .better-placeholder.disabled ~ .better-placeholder-text 57 | color #999 58 | 59 | .fa-required 60 | margin-left 6px 61 | font-size 70% 62 | vertical-align super 63 | 64 | td.input-group 65 | .better-placeholder-text, .help-block.better-placeholder-text 66 | top 11px 67 | .better-placeholder-text.active, .better-placeholder-active ~ .better-placeholder-text 68 | top 7px 69 | 70 | /* Inverted css */ 71 | 72 | .ui-select-bootstrap.dropdown.open .better-placeholder.inverted, .better-placeholder-active.inverted 73 | padding-bottom 18px 74 | padding-top 6px 75 | 76 | .better-placeholder.inverted ~ .better-placeholder-text.inverted, .better-placeholder.inverted ~ .help-block.better-placeholder-text.inverted, .better-placeholder-text.inverted, .help-block.better-placeholder-text.inverte 77 | bottom 2px 78 | top auto 79 | 80 | .better-placeholder-text.inverted.active, .better-placeholder-active.inverted ~ .better-placeholder-text 81 | max-width 110% 82 | visibility visible 83 | transform scale(.8) 84 | transform-origin 0 0 85 | color #428bca 86 | bottom -8px 87 | top auto 88 | 89 | td.input-group 90 | .better-placeholder.inverted ~ .better-placeholder-text.inverted, .better-placeholder.inverted ~ .help-block.better-placeholder-text.inverted, .better-placeholder-text.inverted, .help-block.better-placeholder-text.inverte 91 | top auto 92 | bottom 11px 93 | .better-placeholder-text.inverted.active, .better-placeholder-active.inverted ~ .better-placeholder-text 94 | top auto 95 | bottom 1px 96 | --------------------------------------------------------------------------------