elemental
Version:
React UI Framework
294 lines (216 loc) • 4.8 kB
text/less
//
// Forms
// ==============================
// Labels
// ------------------------------
.FormLabel {
.transition( color @form-animation-duration );
color: @form-label-color;
display: inline-block;
margin-bottom: @spacing-sm;
}
// Groups
// ------------------------------
.FormField {
margin-bottom: @spacing-md;
position: relative;
}
// Form Rows
// ------------------------------
.FormRow {
&:extend(.u-clearfix all);
}
@media (min-width: @screen-sm) {
.FormRow {
margin: 0 -(@input-padding-horizontal / 2) @spacing-md;
min-width: 100%;
> .FormField {
display: block; // override .Form--horizontal styles inside .FormRow
float: left;
padding: 0 (@input-padding-horizontal / 2);
// sizes
&.one-half,
&.two-quarters,
&.three-sixths { width: 50%; }
&.one-quarter { width: 25%; }
&.three-quarters { width: 75%; }
&.one-third,
&.two-sixths { width: 33.333%; }
&.two-thirds,
&.four-sixths { width: 66.666%; }
&.one-fifth { width: 20%; }
&.two-fifths { width: 40%; }
&.three-fifths { width: 60%; }
&.four-fifths { width: 80%; }
&.one-sixth { width: 16.666%; }
&.five-sixths { width: 83.333%; }
}
}
// inside a form field
.FormField .FormRow {
margin-bottom: 0;
}
}
// Validation
// ------------------------------
// message
.form-validation {
.animation( formValidationMessage @form-animation-duration ease );
font-size: @font-size-xs;
margin-top: .5em;
overflow: hidden;
.is-invalid & {
color: @app-danger;
}
.is-valid & {
color: @app-success;
}
}
@-webkit-keyframes formValidationMessage {
from { max-height: 0; opacity: 0; }
to { max-height: @font-size-base; opacity: 1; }
}
@keyframes formValidationMessage {
from { max-height: 0; opacity: 0; }
to { max-height: @font-size-base; opacity: 1; }
}
// effects on other elements
.FormField.is-invalid {
.FormLabel {
color: @app-danger;
}
.FormInput {
border-color: @app-danger;
&:focus {
border-color: @app-danger;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px fade(@app-danger, 10%);
}
}
}
.FormField.is-valid {
.FormLabel {
color: @app-success;
}
.FormInput {
border-color: @app-success;
&:focus {
border-color: @app-success;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 0 3px fade(@app-success, 10%);
}
}
}
// ==============================
// Field Types
// ==============================
// Checkbox & Radio
// ------------------------------
.Checkbox,
.Radio {
display: block;
margin-bottom: .5em;
}
// fix alignment with checkbox label
// margin top is innefective on checkboxes
.Checkbox__input {
position: relative;
top: -1px;
}
.Checkbox__label,
.Radio__label {
margin-left: .5em;
}
.inline-controls > .Checkbox,
.inline-controls > .Radio,
.Checkbox--inline,
.Radio--inline {
display: inline-block;
margin-right: 1em;
}
.Checkbox--disabled,
.Radio--disabled {
color: @control-disabled-color;
}
@media (min-width: @screen-sm) {
.Checkbox,
.Radio {
line-height: @component-height;
}
}
// ==============================
// Form Types
// ==============================
// Horizontal Form
// ------------------------------
// 1. ensure stacking on mobile
// 2. add spacing above the element when it's stacked. no need to remove at
// higher break-points because it becomes a table cell, which aren't
// effected by margin
.Form--horizontal {
.FormLabel {
display: block; // 1
&:not(:first-child) {
margin-top: @spacing-md; // 2
}
}
}
@media (min-width: @screen-sm) {
.Form--horizontal {
// Make the wrapper behave like a table
.FormField {
display: table;
table-layout: fixed;
width: 100%;
&.offset-absent-label {
padding-left: @form-label-width;
}
}
// Fix the label width to allow the field to stretch
.FormLabel {
display: table-cell;
line-height: @component-height;
margin-bottom: 0;
vertical-align: top;
width: @form-label-width;
&:not(:first-child) {
padding-left: @grid-gutter-width;
}
}
// reset styles when using rows inside .Form--horizontal
.FormRow > .FormField {
display: block;
margin-bottom: 0;
min-width: 0;
> .FormLabel {
display: block;
}
.FormInput {
margin: 0;
width: 100%;
}
}
}
}
// Inline Form
// ------------------------------
@media (min-width: @screen-sm) {
.Form--inline {
.Checkbox,
.Radio,
.FormField {
display: inline-block;
padding-left: .25em;
padding-right: .25em;
vertical-align: top;
&:first-child { padding-left: 0; }
&:last-child { padding-right: 0; }
}
.Checkbox,
.Radio {
line-height: 2.4em;
margin: 0 @input-padding-horizontal;
}
.FormLabel {
.u-hidden-visually();
}
}
}