/*!
 * Bootstrap Responsive v2.0.1
 *
 * Copyright 2012 Twitter, Inc
 * Licensed under the Apache License v2.0
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Designed and built with all the love in the world @twitter by @mdo and @fat.
 */

// Responsive.less
// For phone and tablet devices
// -------------------------------------------------------------


// REPEAT VARIABLES & MIXINS
// -------------------------
// Required since we compile the responsive stuff separately

@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";


// RESPONSIVE CLASSES
// ------------------

// Hide from screenreaders and browsers
// Credit: HTML5 Boilerplate
.hidden {
  display: none;
  visibility: hidden;
}



// UP TO LANDSCAPE PHONE
// ---------------------

@media (max-width: 480px) {

  // Smooth out the collapsing/expanding nav
  .nav-collapse {
    -webkit-transform: translate3d(0, 0, 0); // activate the GPU
  }

  // Block level the page header small tag for readability
  .page-header h1 small {
    display: block;
    line-height: @baseLineHeight;
  }

  // Make span* classes full width
  input[class*="span"],
  select[class*="span"],
  textarea[class*="span"],
  .uneditable-input {
    display: block;
    width: 100%;
    min-height: 28px; /* Make inputs at least the height of their button counterpart */
    /* Makes inputs behave like true block-level elements */
    -webkit-box-sizing: border-box; /* Older Webkit */
       -moz-box-sizing: border-box; /* Older FF */
        -ms-box-sizing: border-box; /* IE8 */
            box-sizing: border-box; /* CSS3 spec*/
  }
  // But don't let it screw up prepend/append inputs
  .input-prepend input[class*="span"],
  .input-append input[class*="span"] {
    width: auto;
  }

  // Update checkboxes for iOS
  input[type="checkbox"],
  input[type="radio"] {
    border: 1px solid #ccc;
  }

  // Remove the horizontal form styles
  .form-horizontal .control-group > label {
    float: none;
    width: auto;
    padding-top: 0;
    text-align: left;
  }
  // Move over all input controls and content
  .form-horizontal .controls {
    margin-left: 0;
  }
  // Move the options list down to align with labels
  .form-horizontal .control-list {
    padding-top: 0; // has to be padding because margin collaspes
  }
  // Move over buttons in .form-actions to align with .controls
  .form-horizontal .form-actions {
    padding-left: 10px;
    padding-right: 10px;
  }

  // Modals
  .modal {
    position: absolute;
    top:   10px;
    left:  10px;
    right: 10px;
    width: auto;
    margin: 0;
    &.fade.in { top: auto; }
  }
  .modal-header .close {
    padding: 10px;
    margin: -10px;
  }

  // Carousel
  .carousel-caption {
    position: static;
  }

}



// LANDSCAPE PHONE TO SMALL DESKTOP & PORTRAIT TABLET
// --------------------------------------------------

@media (max-width: 767px) {
  // GRID & CONTAINERS
  // -----------------
  // Remove width from containers
  .container {
    width: auto;
    padding: 0 20px;
  }
  // Fluid rows
  .row-fluid {
    width: 100%;
  }
  // Undo negative margin on rows
  .row {
    margin-left: 0;
  }
  // Make all columns even
  .row > [class*="span"],
  .row-fluid > [class*="span"] {
    float: none;
    display: block;
    width: auto;
    margin: 0;
  }
}



// PORTRAIT TABLET TO DEFAULT DESKTOP
// ----------------------------------

@media (min-width: 768px) and (max-width: 979px) {

  // Fixed grid
  #gridSystem > .generate(12, 42px, 20px);

  // Fluid grid
  #fluidGridSystem > .generate(12, 5.801104972%, 2.762430939%);

  // Input grid
  #inputGridSystem > .generate(12, 42px, 20px);

}



// TABLETS AND BELOW
// -----------------
@media (max-width: 979px) {

  // UNFIX THE TOPBAR
  // ----------------
  // Remove any padding from the body
  body {
    padding-top: 0;
  }
  // Unfix the navbar
  .navbar-fixed-top {
    position: static;
    margin-bottom: @baseLineHeight;
  }
  .navbar-fixed-top .navbar-inner {
    padding: 5px;
  }
  .navbar .container {
    width: auto;
    padding: 0;
  }
  // Account for brand name
  .navbar .brand {
    padding-left: 10px;
    padding-right: 10px;
    margin: 0 0 0 -5px;
  }
  // Nav collapse clears brand
  .navbar .nav-collapse {
    clear: left;
  }
  // Block-level the nav
  .navbar .nav {
    float: none;
    margin: 0 0 (@baseLineHeight / 2);
  }
  .navbar .nav > li {
    float: none;
  }
  .navbar .nav > li > a {
    margin-bottom: 2px;
  }
  .navbar .nav > .divider-vertical {
    display: none;
  }
  .navbar .nav .nav-header {
    color: @navbarText;
    text-shadow: none;
  }
  // Nav and dropdown links in navbar
  .navbar .nav > li > a,
  .navbar .dropdown-menu a {
    padding: 6px 15px;
    font-weight: bold;
    color: @navbarLinkColor;
    .border-radius(3px);
  }
  .navbar .dropdown-menu li + li a {
    margin-bottom: 2px;
  }
  .navbar .nav > li > a:hover,
  .navbar .dropdown-menu a:hover {
    background-color: @navbarBackground;
  }
  // Dropdowns in the navbar
  .navbar .dropdown-menu {
    position: static;
    top: auto;
    left: auto;
    float: none;
    display: block;
    max-width: none;
    margin: 0 15px;
    padding: 0;
    background-color: transparent;
    border: none;
    .border-radius(0);
    .box-shadow(none);
  }
  .navbar .dropdown-menu:before,
  .navbar .dropdown-menu:after {
    display: none;
  }
  .navbar .dropdown-menu .divider {
    display: none;
  }
  // Forms in navbar
  .navbar-form,
  .navbar-search {
    float: none;
    padding: (@baseLineHeight / 2) 15px;
    margin: (@baseLineHeight / 2) 0;
    border-top: 1px solid @navbarBackground;
    border-bottom: 1px solid @navbarBackground;
    @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
    .box-shadow(@shadow);
  }
  // Pull right (secondary) nav content
  .navbar .nav.pull-right {
    float: none;
    margin-left: 0;
  }
  // Static navbar
  .navbar-static .navbar-inner {
    padding-left:  10px;
    padding-right: 10px;
  }
  // Navbar button
  .btn-navbar {
    display: block;
  }

  // Hide everything in the navbar save .brand and toggle button */
  .nav-collapse {
    overflow: hidden;
    height: 0;
  }
}



// DEFAULT DESKTOP
// ---------------

@media (min-width: 980px) {
  .nav-collapse.collapse {
    height: auto !important;
  }
}



// LARGE DESKTOP & UP
// ------------------

@media (min-width: 1200px) {

  // Fixed grid
  #gridSystem > .generate(12, 70px, 30px);

  // Fluid grid
  #fluidGridSystem > .generate(12, 5.982905983%, 2.564102564%);

  // Input grid
  #inputGridSystem > .generate(12, 70px, 30px);

  // Thumbnails
  .thumbnails {
    margin-left: -30px;
  }
  .thumbnails > li {
    margin-left: 30px;
  }

}
