mirror of
https://github.com/twbs/bootstrap.git
synced 2024-11-29 11:24:18 +01:00
568 lines
12 KiB
Plaintext
568 lines
12 KiB
Plaintext
//
|
|
// Forms
|
|
// --------------------------------------------------
|
|
|
|
|
|
// Non-controls
|
|
// -------------------------
|
|
|
|
form {
|
|
margin: 0;
|
|
}
|
|
|
|
fieldset {
|
|
padding: 0;
|
|
margin: 0;
|
|
border: 0;
|
|
}
|
|
|
|
legend {
|
|
display: block;
|
|
width: 100%;
|
|
padding: 0;
|
|
margin-bottom: @line-height-base;
|
|
font-size: @font-size-base * 1.5;
|
|
line-height: @line-height-base * 2;
|
|
color: @grayDark;
|
|
border: 0;
|
|
border-bottom: 1px solid #e5e5e5;
|
|
}
|
|
|
|
label {
|
|
display: inline-block;
|
|
margin-bottom: 5px;
|
|
font-weight: bold;
|
|
}
|
|
|
|
// Form controls
|
|
// -------------------------
|
|
|
|
// Shared size and type resets
|
|
select,
|
|
textarea,
|
|
input[type="text"],
|
|
input[type="password"],
|
|
input[type="datetime"],
|
|
input[type="datetime-local"],
|
|
input[type="date"],
|
|
input[type="month"],
|
|
input[type="time"],
|
|
input[type="week"],
|
|
input[type="number"],
|
|
input[type="email"],
|
|
input[type="url"],
|
|
input[type="search"],
|
|
input[type="tel"],
|
|
input[type="color"],
|
|
.uneditable-input {
|
|
display: inline-block;
|
|
.box-sizing(border-box); // Makes inputs behave like true block-level elements
|
|
min-height: @input-height; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
|
|
padding: 6px 9px;
|
|
// margin-bottom: @line-height-base / 2;
|
|
font-size: @font-size-base;
|
|
line-height: @line-height-base;
|
|
color: @gray;
|
|
vertical-align: middle;
|
|
background-color: @input-background;
|
|
border: 1px solid @input-border;
|
|
border-radius: @input-border-radius;
|
|
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
|
|
.transition(~"border linear .2s, box-shadow linear .2s");
|
|
}
|
|
|
|
// Reset appearance properties for textual inputs and textarea
|
|
// Can't be on input[type=*] selectors or it's too specific
|
|
input,
|
|
select,
|
|
textarea,
|
|
.uneditable-input {
|
|
width: 100%;
|
|
}
|
|
|
|
// Reset width of input images, buttons, radios, checkboxes
|
|
input[type="file"],
|
|
input[type="image"],
|
|
input[type="submit"],
|
|
input[type="reset"],
|
|
input[type="button"],
|
|
input[type="radio"],
|
|
input[type="checkbox"] {
|
|
width: auto; // Override of generic input selector
|
|
}
|
|
|
|
// Reset height since textareas have rows
|
|
textarea {
|
|
height: auto;
|
|
}
|
|
|
|
// Everything else
|
|
textarea,
|
|
input[type="text"],
|
|
input[type="password"],
|
|
input[type="datetime"],
|
|
input[type="datetime-local"],
|
|
input[type="date"],
|
|
input[type="month"],
|
|
input[type="time"],
|
|
input[type="week"],
|
|
input[type="number"],
|
|
input[type="email"],
|
|
input[type="url"],
|
|
input[type="search"],
|
|
input[type="tel"],
|
|
input[type="color"],
|
|
.uneditable-input {
|
|
// Focus state
|
|
&:focus {
|
|
border-color: rgba(82,168,236,.8);
|
|
outline: 0;
|
|
outline: thin dotted \9; /* IE6-9 */
|
|
//.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
|
|
.box-shadow(0 0 8px rgba(82,168,236,.6));
|
|
}
|
|
}
|
|
|
|
// Position radios and checkboxes better
|
|
input[type="radio"],
|
|
input[type="checkbox"] {
|
|
margin: 4px 0 0;
|
|
margin-top: 1px \9; /* IE8-9 */
|
|
line-height: normal;
|
|
}
|
|
|
|
// Set the height of select and file controls to match text inputs
|
|
select,
|
|
input[type="file"] {
|
|
height: @input-height; /* In IE7, the height of the select element cannot be changed by height, only font-size. TODO: Check if this is still needed when dropping IE7 support */
|
|
line-height: @input-height;
|
|
}
|
|
|
|
// Make select elements obey height by applying a border
|
|
// TODO: See if this can be part of the above selector stack
|
|
select {
|
|
border: 1px solid @input-border;
|
|
}
|
|
|
|
// Make multiple select elements height not fixed
|
|
select[multiple],
|
|
select[size] {
|
|
height: auto;
|
|
}
|
|
|
|
// Focus for select, file, radio, and checkbox
|
|
select:focus,
|
|
input[type="file"]:focus,
|
|
input[type="radio"]:focus,
|
|
input[type="checkbox"]:focus {
|
|
.tab-focus();
|
|
}
|
|
|
|
|
|
// Uneditable inputs
|
|
// -------------------------
|
|
|
|
// Make uneditable inputs look inactive
|
|
.uneditable-input,
|
|
.uneditable-textarea {
|
|
color: @grayLight;
|
|
background-color: darken(@input-background, 1%);
|
|
border-color: @input-border;
|
|
.box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
// Make uneditable textareas behave like a textarea
|
|
.uneditable-textarea {
|
|
width: auto;
|
|
height: auto;
|
|
}
|
|
|
|
|
|
// Placeholder
|
|
// -------------------------
|
|
|
|
// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector
|
|
input,
|
|
textarea {
|
|
.placeholder();
|
|
}
|
|
|
|
|
|
// CHECKBOXES & RADIOS
|
|
// -------------------
|
|
|
|
// Indent the labels to position radios/checkboxes as hanging
|
|
.radio,
|
|
.checkbox {
|
|
display: block;
|
|
min-height: @line-height-base; // clear the floating input if there is no label text
|
|
margin-bottom: @line-height-base / 2;
|
|
padding-left: 20px;
|
|
label {
|
|
display: inline;
|
|
margin-bottom: 0;
|
|
font-weight: normal;
|
|
}
|
|
}
|
|
|
|
.radio input[type="radio"],
|
|
.radio-inline input[type="radio"],
|
|
.checkbox input[type="checkbox"],
|
|
.checkbox-inline input[type="checkbox"] {
|
|
float: left;
|
|
margin-left: -20px;
|
|
}
|
|
.radio + .radio,
|
|
.checkbox + .checkbox {
|
|
margin-top: (@line-height-base / 4) * -1;
|
|
}
|
|
|
|
// Move the options list down to align with labels
|
|
.controls > .radio:first-child,
|
|
.controls > .checkbox:first-child {
|
|
padding-top: 5px; // 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: 5px;
|
|
padding-left: 20px;
|
|
margin-bottom: 0;
|
|
vertical-align: middle;
|
|
font-weight: normal;
|
|
}
|
|
.radio-inline + .radio-inline,
|
|
.checkbox-inline + .checkbox-inline {
|
|
margin-top: 0;
|
|
margin-left: 10px; // space out consecutive inline controls
|
|
}
|
|
|
|
|
|
|
|
// INPUT SIZES
|
|
// -----------
|
|
|
|
select,
|
|
textarea,
|
|
input[type="text"],
|
|
input[type="password"],
|
|
input[type="datetime"],
|
|
input[type="datetime-local"],
|
|
input[type="date"],
|
|
input[type="month"],
|
|
input[type="time"],
|
|
input[type="week"],
|
|
input[type="number"],
|
|
input[type="email"],
|
|
input[type="url"],
|
|
input[type="search"],
|
|
input[type="tel"],
|
|
input[type="color"],
|
|
.uneditable-input {
|
|
&.input-large {
|
|
padding: @padding-large;
|
|
padding-left: 14px;
|
|
padding-right: 14px; // TODO: Resolve this override
|
|
font-size: @font-size-large;
|
|
border-radius: @border-radius-large;
|
|
}
|
|
&.input-small {
|
|
padding: @padding-small;
|
|
font-size: @font-size-small;
|
|
border-radius: @border-radius-small;
|
|
}
|
|
&.input-mini {
|
|
padding: @padding-mini;
|
|
font-size: @font-size-mini;
|
|
border-radius: @border-radius-small;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// GRID SIZING FOR INPUTS
|
|
// ----------------------
|
|
|
|
// Grid style input sizes
|
|
input[class*="span"],
|
|
select[class*="span"],
|
|
textarea[class*="span"],
|
|
.uneditable-input[class*="span"] {
|
|
float: none;
|
|
margin-left: 0;
|
|
margin-right: 0;
|
|
}
|
|
|
|
// Ensure input-prepend/append never wraps
|
|
.input-append input[class*="span"],
|
|
.input-append .uneditable-input[class*="span"],
|
|
.input-prepend input[class*="span"],
|
|
.input-prepend .uneditable-input[class*="span"] {
|
|
display: inline-block;
|
|
}
|
|
|
|
input[class*="span"],
|
|
select[class*="span"],
|
|
textarea[class*="span"],
|
|
.uneditable-input[class*="span"] {
|
|
height: @input-height;
|
|
}
|
|
|
|
|
|
|
|
// DISABLED STATE
|
|
// --------------
|
|
|
|
// Disabled and read-only inputs
|
|
// Note: HTML5 says that inputs under a fieldset > legend:first-child won't be
|
|
// disabled if the fieldset is disabled. Due to implementation difficulty,
|
|
// we don't honor that edge case; we style them as disabled anyway.
|
|
input,
|
|
select,
|
|
textarea {
|
|
&[disabled],
|
|
&[readonly],
|
|
fieldset[disabled] & {
|
|
cursor: not-allowed;
|
|
background-color: @input-background-disabled;
|
|
}
|
|
}
|
|
// Explicitly reset the colors here
|
|
input[type="radio"],
|
|
input[type="checkbox"] {
|
|
&[disabled],
|
|
&[readonly],
|
|
fieldset[disabled] & {
|
|
background-color: transparent;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
// FORM FIELD FEEDBACK STATES
|
|
// --------------------------
|
|
|
|
// Warning
|
|
.has-warning {
|
|
.formFieldState(@state-warning-text, @state-warning-text, @state-warning-background);
|
|
}
|
|
// Error
|
|
.has-error {
|
|
.formFieldState(@state-error-text, @state-error-text, @state-error-background);
|
|
}
|
|
// Success
|
|
.has-success {
|
|
.formFieldState(@state-success-text, @state-success-text, @state-success-background);
|
|
}
|
|
|
|
// HTML5 invalid states
|
|
// Shares styles with the .control-group.error above
|
|
input:focus:invalid,
|
|
textarea:focus:invalid,
|
|
select:focus:invalid {
|
|
color: #b94a48;
|
|
border-color: #ee5f5b;
|
|
&:focus {
|
|
border-color: darken(#ee5f5b, 10%);
|
|
@shadow: 0 0 6px lighten(#ee5f5b, 20%);
|
|
.box-shadow(@shadow);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// FORM ACTIONS
|
|
// ------------
|
|
|
|
.form-actions {
|
|
padding: (@line-height-base - 1) 20px @line-height-base;
|
|
margin-top: @line-height-base;
|
|
margin-bottom: @line-height-base;
|
|
background-color: @form-actions-background;
|
|
border-top: 1px solid #e5e5e5;
|
|
.clear_float(); // Adding clearfix to allow for .pull-right button containers
|
|
}
|
|
|
|
|
|
|
|
// HELP TEXT
|
|
// ---------
|
|
|
|
.help-block,
|
|
.help-inline {
|
|
color: lighten(@text-color, 25%); // lighten the text some for contrast
|
|
}
|
|
|
|
.help-block {
|
|
display: block; // account for any element using help-block
|
|
margin-bottom: @line-height-base / 2;
|
|
}
|
|
|
|
.help-inline {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
padding-left: 5px;
|
|
}
|
|
|
|
|
|
|
|
// Input groups
|
|
// --------------------------------------------------
|
|
|
|
// Base styles
|
|
// -------------------------
|
|
.input-group {
|
|
display: table;
|
|
|
|
// Undo padding and float of grid classes
|
|
&[class*="span"] {
|
|
float: none;
|
|
padding: 0;
|
|
}
|
|
|
|
input,
|
|
select,
|
|
.uneditable-input {
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
// Display as table-cell
|
|
// -------------------------
|
|
.input-group-addon,
|
|
.input-group-btn,
|
|
.input-group input,
|
|
.input-group .uneditable-input {
|
|
display: table-cell;
|
|
margin: 0;
|
|
border-radius: 0;
|
|
}
|
|
// Addon and addon wrapper for buttons
|
|
.input-group-addon,
|
|
.input-group-btn {
|
|
width: 1%;
|
|
vertical-align: middle; // Match the inputs
|
|
}
|
|
|
|
// Text input groups
|
|
// -------------------------
|
|
.input-group-addon {
|
|
.box-sizing(border-box);
|
|
padding: 6px 8px;
|
|
font-size: @font-size-base;
|
|
font-weight: normal;
|
|
line-height: @line-height-base;
|
|
text-align: center;
|
|
text-shadow: 0 1px 0 #fff;
|
|
background-color: @grayLighter;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
// Reset rounded corners
|
|
.input-group input:first-child,
|
|
.input-group .uneditable-input:first-child,
|
|
.input-group-addon:first-child {
|
|
.border-left-radius(@border-radius-base);
|
|
}
|
|
.input-group-addon:first-child {
|
|
border-right: 0;
|
|
}
|
|
.input-group input:last-child,
|
|
.input-group .uneditable-input:last-child,
|
|
.input-group-addon:last-child {
|
|
.border-right-radius(@border-radius-base);
|
|
}
|
|
.input-group-addon:last-child {
|
|
border-left: 0;
|
|
}
|
|
|
|
// Button input groups
|
|
// -------------------------
|
|
.input-group-btn,
|
|
.input-group-btn .btn {
|
|
white-space: nowrap;
|
|
}
|
|
.input-group-btn > .btn {
|
|
float: left; // Collapse white-space
|
|
border-radius: 0;
|
|
+ .btn {
|
|
border-left: 0;
|
|
}
|
|
}
|
|
.input-group-btn.btn-group {
|
|
display: table-cell;
|
|
}
|
|
// Prepend
|
|
.input-group-btn {
|
|
&:first-child > .btn,
|
|
&.btn-group:first-child > .btn {
|
|
border-right: 0;
|
|
}
|
|
&:first-child > .btn,
|
|
&.btn-group:first-child > .btn {
|
|
border-radius: @border-radius-base 0 0 @border-radius-base;
|
|
}
|
|
}
|
|
// Append
|
|
.input-group-btn {
|
|
&:last-child > .btn,
|
|
&.btn-group:last-child > .btn:first-child {
|
|
border-left: 0;
|
|
}
|
|
&:last-child > .btn,
|
|
&.btn-group:last-child > .btn {
|
|
border-radius: 0 @border-radius-base @border-radius-base 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Horizontal forms
|
|
// --------------------------------------------------
|
|
|
|
|
|
@media screen and (min-width: 768px) {
|
|
|
|
.form-horizontal {
|
|
|
|
// Increase spacing between groups
|
|
.control-group {
|
|
position: relative;
|
|
margin-bottom: @line-height-base;
|
|
.clear_float();
|
|
|
|
input,
|
|
select,
|
|
textarea,
|
|
.uneditable-input {
|
|
margin-bottom: 0;
|
|
}
|
|
}
|
|
|
|
// Float the labels left
|
|
.control-group > .control-label {
|
|
float: left;
|
|
width: @component-offset-horizontal - 20;
|
|
padding-top: 6px;
|
|
text-align: right;
|
|
}
|
|
|
|
// Move over all input controls and content over
|
|
.control-group > .controls {
|
|
margin-left: @component-offset-horizontal;
|
|
}
|
|
|
|
}
|
|
}
|