git.fiddlerwoaroof.com
less/forms.less
489b3d20
 // Forms.less
 // Base styles for various input types, form layouts, and states
 // -------------------------------------------------------------
 
 
 // GENERAL STYLES
 // --------------
 
 // Make all forms have space below them
 form {
   margin: 0 0 @baseLineHeight;
 }
 
 fieldset {
   padding: 0;
   margin: 0;
   border: 0;
 }
 
 // Groups of fields with labels on top (legends)
 legend {
   display: block;
   width: 100%;
   padding: 0;
   margin-bottom: @baseLineHeight * 1.5;
   font-size: @baseFontSize * 1.5;
   line-height: @baseLineHeight * 2;
   color: @grayDark;
   border: 0;
   border-bottom: 1pt solid #eee;
 
   // Small
   small {
     font-size: @baseLineHeight * .75;
     color: @grayLight;
   }
 }
 
 // Set font for forms
 label,
 input,
 button,
 select,
 textarea {
   #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
 }
 input,
 button,
 select,
 textarea {
   font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
 }
 
 // Identify controls by their labels
 label {
   display: block;
   margin-bottom: 5pt;
   color: @grayDark;
 }
 
 // Inputs, Textareas, Selects
 input,
 textarea,
 select,
 .uneditable-input {
   display: inline-block;
   width: 210pt;
   height: @baseLineHeight;
   padding: 4pt;
   margin-bottom: 9pt;
   font-size: @baseFontSize;
   line-height: @baseLineHeight;
   color: @gray;
   background-color: @inputBackground;
   border: 1pt solid @inputBorder;
   .border-radius(@inputBorderRadius);
 }
 .uneditable-textarea {
   width: auto;
   height: auto;
 }
 
 // Inputs within a label
 label input,
 label textarea,
 label select {
   display: block;
 }
 
 // Mini reset for unique input types
 input[type="image"],
 input[type="checkbox"],
 input[type="radio"] {
   width: auto;
   height: auto;
   padding: 0;
   margin: 3pt 0;
   *margin-top: 0; /* IE7 */
   line-height: normal;
   cursor: pointer;
   background-color: transparent;
   border: 0 \9; /* IE9 and down */
   .border-radius(0);
 }
 input[type="image"] {
   border: 0;
 }
 
 // Reset the file input to browser defaults
 input[type="file"] {
   width: auto;
   padding: initial;
   line-height: initial;
   background-color: @inputBackground;
   background-color: initial;
   border: initial;
   .box-shadow(none);
 }
 
 // Help out input buttons
 input[type="button"],
 input[type="reset"],
 input[type="submit"] {
   width: auto;
   height: auto;
 }
 
 // Set the height of select and file controls to match text inputs
 select,
 input[type="file"] {
   height: 28pt; /* In IE7, the height of the select element cannot be changed by height, only font-size */
   *margin-top: 4pt; /* For IE7, add top margin to align select with labels */
   line-height: 28pt;
 }
 
 // Reset line-height for IE
 input[type="file"] {
   line-height: 18pt \9;
 }
 
 // Chrome on Linux and Mobile Safari need background-color
 select {
   width: 220pt; // default input width + 10pt of padding that doesn't get applied
   background-color: @inputBackground;
 }
 
 // Make multiple select elements height not fixed
 select[multiple],
 select[size] {
   height: auto;
 }
 
 // Remove shadow from image inputs
 input[type="image"] {
   .box-shadow(none);
 }
 
 // Make textarea height behave
 textarea {
   height: auto;
 }
 
 // Hidden inputs
 input[type="hidden"] {
   display: none;
 }
 
 
 
 // CHECKBOXES & RADIOS
 // -------------------
 
 // Indent the labels to position radios/checkboxes as hanging
 .radio,
 .checkbox {
   min-height: 18pt; // clear the floating input if there is no label text
   padding-left: 18pt;
 }
 .radio input[type="radio"],
 .checkbox input[type="checkbox"] {
   float: left;
   margin-left: -18pt;
 }
 
 // Move the options list down to align with labels
 .controls > .radio:first-child,
 .controls > .checkbox:first-child {
   padding-top: 5pt; // has to be padding because margin collaspes
 }
 
 // Radios and checkboxes on same line
 // TODO v3: Convert .inline to .control-inline
 .radio.inline,
 .checkbox.inline {
   display: inline-block;
   padding-top: 5pt;
   margin-bottom: 0;
   vertical-align: middle;
 }
 .radio.inline + .radio.inline,
 .checkbox.inline + .checkbox.inline {
   margin-left: 10pt; // space out consecutive inline controls
 }
 
 
 
 // FOCUS STATE
 // -----------
 
 input,
 textarea {
   .box-shadow(inset 0 1pt 1pt rgba(0,0,0,.075));
   @transition: border linear .2s, box-shadow linear .2s;
   .transition(@transition);
 }
 input:focus,
 textarea:focus {
   border-color: rgba(82,168,236,.8);
   outline: 0;
   outline: thin dotted \9; /* IE6-9 */
   .box-shadow(~"inset 0 1pt 1pt rgba(0,0,0,.075), 0 0 8pt rgba(82,168,236,.6)");
 }
 input[type="file"]:focus,
 input[type="radio"]:focus,
 input[type="checkbox"]:focus,
 select:focus {
   .tab-focus();
   .box-shadow(none); // override for file inputs
 }
 
 
 
 // INPUT SIZES
 // -----------
 
 // General classes for quick sizes
 .input-mini       { width: 60pt; }
 .input-small      { width: 90pt; }
 .input-medium     { width: 150pt; }
 .input-large      { width: 210pt; }
 .input-xlarge     { width: 270pt; }
 .input-xxlarge    { width: 530pt; }
 
 // Grid style input sizes
 input[class*="span"],
 select[class*="span"],
 textarea[class*="span"],
 .uneditable-input[class*="span"],
 // Redeclare since the fluid row class is more specific
 .row-fluid input[class*="span"],
 .row-fluid select[class*="span"],
 .row-fluid textarea[class*="span"],
 .row-fluid .uneditable-input[class*="span"] {
   float: none;
   margin-left: 0;
 }
 
 
 
 // GRID SIZING FOR INPUTS
 // ----------------------
 
 #grid > .input (@gridColumnWidth, @gridGutterWidth);
 
 
 
 
 // DISABLED STATE
 // --------------
 
 // Disabled and read-only inputs
 input[disabled],
 select[disabled],
 textarea[disabled],
 input[readonly],
 select[readonly],
 textarea[readonly] {
   cursor: not-allowed;
   background-color: @inputDisabledBackground;
   border-color: #ddd;
 }
 // Explicitly reset the colors here
 input[type="radio"][disabled],
 input[type="checkbox"][disabled],
 input[type="radio"][readonly],
 input[type="checkbox"][readonly] {
   background-color: transparent;
 }
 
 
 
 
 // FORM FIELD FEEDBACK STATES
 // --------------------------
 
 // Warning
 .control-group.warning {
   .formFieldState(@warningText, @warningText, @warningBackground);
 }
 // Error
 .control-group.error {
   .formFieldState(@errorText, @errorText, @errorBackground);
 }
 // Success
 .control-group.success {
   .formFieldState(@successText, @successText, @successBackground);
 }
 
 // HTML5 invalid states
 // Shares styles with the .control-group.error above
 input:focus:required:invalid,
 textarea:focus:required:invalid,
 select:focus:required:invalid {
   color: #b94a48;
   border-color: #ee5f5b;
   &:focus {
     border-color: darken(#ee5f5b, 10%);
     .box-shadow(0 0 6pt lighten(#ee5f5b, 20%));
   }
 }
 
 
 
 // FORM ACTIONS
 // ------------
 
 .form-actions {
   padding: (@baseLineHeight - 1) 20pt @baseLineHeight;
   margin-top: @baseLineHeight;
   margin-bottom: @baseLineHeight;
   background-color: @formActionsBackground;
   border-top: 1pt solid #ddd;
   .clearfix(); // Adding clearfix to allow for .pull-right button containers
 }
 
 // For text that needs to appear as an input but should not be an input
 .uneditable-input {
   overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
   white-space: nowrap;
   cursor: not-allowed;
   background-color: @inputBackground;
   border-color: #eee;
   .box-shadow(inset 0 1pt 2pt rgba(0,0,0,.025));
 }
 
 // Placeholder text gets special styles; can't be bundled together though for some reason
 .placeholder(@grayLight);
 
 
 
 // HELP TEXT
 // ---------
 
 .help-block,
 .help-inline {
   color: @gray; // lighten the text some for contrast
 }
 
 .help-block {
   display: block; // account for any element using help-block
   margin-bottom: @baseLineHeight / 2;
 }
 
 .help-inline {
   display: inline-block;
   .ie7-inline-block();
   vertical-align: middle;
   padding-left: 5pt;
 }
 
 
 
 // INPUT GROUPS
 // ------------
 
 // Allow us to put symbols and text within the input field for a cleaner look
 .input-prepend,
 .input-append {
   margin-bottom: 5pt;
   input,
   select,
   .uneditable-input {
     position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
     margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
     *margin-left: 0;
     vertical-align: middle;
     .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
     // Make input on top when focused so blue border and shadow always show
     &:focus {
       z-index: 2;
     }
   }
   .uneditable-input {
     border-left-color: #ccc;
   }
   .add-on {
     display: inline-block;
     width: auto;
     height: @baseLineHeight;
     min-width: 16pt;
     padding: 4pt 5pt;
     font-weight: normal;
     line-height: @baseLineHeight;
     text-align: center;
     text-shadow: 0 1pt 0 @white;
     vertical-align: middle;
     background-color: @grayLighter;
     border: 1pt solid #ccc;
   }
   .add-on,
   .btn {
     margin-left: -1pt;
     .border-radius(0);
   }
   .active {
     background-color: lighten(@green, 30);
     border-color: @green;
   }
 }
 .input-prepend {
   .add-on,
   .btn {
     margin-right: -1pt;
   }
   .add-on:first-child,
   .btn:first-child {
     .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
   }
 }
 .input-append {
   input,
   select,
   .uneditable-input {
     .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
   }
   .uneditable-input {
     border-right-color: #ccc;
     border-left-color: #eee;
   }
   .add-on:last-child,
   .btn:last-child {
     .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
   }
 }
 // Remove all border-radius for inputs with both prepend and append
 .input-prepend.input-append {
   input,
   select,
   .uneditable-input {
     .border-radius(0);
   }
   .add-on:first-child,
   .btn:first-child {
     margin-right: -1pt;
     .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
   }
   .add-on:last-child,
   .btn:last-child {
     margin-left: -1pt;
     .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
   }
 }
 
 
 
 // SEARCH FORM
 // -----------
 
 .form-search {
   margin: 3pt 0 0 0;
   padding: 0;
 }
 
 .search-query {
   padding: 3pt;
   margin-bottom: 0; // remove the default margin on all inputs
   .border-radius(4pt);
   font-size: 11pt;
 }
 
 
 
 // HORIZONTAL & VERTICAL FORMS
 // ---------------------------
 
 // Common properties
 // -----------------
 
 .form-search,
 .form-inline,
 .form-horizontal {
   input,
   textarea,
   select,
   .help-inline,
   .uneditable-input,
   .input-prepend,
   .input-append {
     display: inline-block;
     .ie7-inline-block();
     margin-bottom: 0;
   }
   // Re-hide hidden elements due to specifity
   .hide {
     display: none;
   }
 }
 .form-search label,
 .form-inline label {
   display: inline-block;
 }
 // Remove margin for input-prepend/-append
 .form-search .input-append,
 .form-inline .input-append,
 .form-search .input-prepend,
 .form-inline .input-prepend {
   margin-bottom: 0;
 }
 // Inline checkbox/radio labels (remove padding on left)
 .form-search .radio,
 .form-search .checkbox,
 .form-inline .radio,
 .form-inline .checkbox {
   padding-left: 0;
   margin-bottom: 0;
   vertical-align: middle;
 }
 // Remove float and margin, set to inline-block
 .form-search .radio input[type="radio"],
 .form-search .checkbox input[type="checkbox"],
 .form-inline .radio input[type="radio"],
 .form-inline .checkbox input[type="checkbox"] {
   float: left;
   margin-right: 3pt;
   margin-left: 0;
 }
 
 
 // Margin to space out fieldsets
 .control-group {
   margin-bottom: @baseLineHeight / 2;
 }
 
 // Legend collapses margin, so next element is responsible for spacing
 legend + .control-group {
   margin-top: @baseLineHeight;
   -webkit-margin-top-collapse: separate;
 }
 
 // Horizontal-specific styles
 // --------------------------
 
 .form-horizontal {
   // Increase spacing between groups
   .control-group {
     margin-bottom: @baseLineHeight;
     .clearfix();
   }
   // Float the labels left
   .control-label {
     float: left;
     width: 140pt;
     padding-top: 5pt;
     text-align: right;
   }
   // Move over all input controls and content
   .controls {
     // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
     // don't inherit the margin of the parent, in this case .controls
     *display: inline-block;
     *padding-left: 20pt;
     margin-left: 160pt;
     *margin-left: 0;
     &:first-child {
       *padding-left: 160pt;
     }
   }
   // Remove bottom margin on block level help text since that's accounted for on .control-group
   .help-block {
     margin-top: @baseLineHeight / 2;
     margin-bottom: 0;
   }
   // Move over buttons in .form-actions to align with .controls
   .form-actions {
     padding-left: 160pt;
   }
 }