uikit
Version:
UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.
899 lines (705 loc) • 23.7 kB
text/less
// Name: Form
// Description: Styles for forms
//
// Component: `uk-form-*`
// `uk-input`
// `uk-select`
// `uk-textarea`
// `uk-radio`
// `uk-checkbox`
// `uk-legend`
// `uk-fieldset`
//
// Sub-objects: `uk-form-custom`
// `uk-form-stacked`
// `uk-form-horizontal`
// `uk-form-label`
// `uk-form-controls`
// `uk-form-icon`
// `uk-form-icon-flip`
//
// Modifiers: `uk-form-small`
// `uk-form-large`
// `uk-form-danger`
// `uk-form-success`
// `uk-form-blank`
// `uk-form-width-xsmall`
// `uk-form-width-small`
// `uk-form-width-medium`
// `uk-form-width-large`
// `uk-form-controls-text`
//
// ========================================================================
// Variables
// ========================================================================
@form-height: @global-control-height;
@form-line-height: @form-height;
@form-padding-horizontal: 10px;
@form-padding-vertical: round(@form-padding-horizontal * 0.6);
@form-background: @global-muted-background;
@form-color: @global-color;
@form-focus-background: darken(@form-background, 5%);
@form-focus-color: @global-color;
@form-disabled-background: @global-muted-background;
@form-disabled-color: @global-muted-color;
@form-placeholder-color: @global-muted-color;
@form-small-height: @global-control-small-height;
@form-small-padding-horizontal: 8px;
@form-small-padding-vertical: round(@form-small-padding-horizontal * 0.6);
@form-small-line-height: @form-small-height;
@form-small-font-size: @global-small-font-size;
@form-large-height: @global-control-large-height;
@form-large-padding-horizontal: 12px;
@form-large-padding-vertical: round(@form-large-padding-horizontal * 0.6);
@form-large-line-height: @form-large-height;
@form-large-font-size: @global-medium-font-size;
@form-danger-color: @global-danger-background;
@form-success-color: @global-success-background;
@form-width-xsmall: 50px;
@form-width-small: 130px;
@form-width-medium: 200px;
@form-width-large: 500px;
@form-select-padding-right: 20px;
@form-select-icon-color: @global-color;
@form-select-option-color: @global-color;
@form-select-disabled-icon-color: @global-muted-color;
@form-datalist-padding-right: 20px;
@form-datalist-icon-color: @global-color;
@form-radio-size: 16px;
@form-radio-margin-top: -4px;
@form-radio-background: darken(@global-muted-background, 5%);
@form-radio-focus-background: darken(@form-radio-background, 5%);
@form-radio-checked-background: @global-primary-background;
@form-radio-checked-icon-color: @global-inverse-color;
@form-radio-checked-focus-background: darken(@global-primary-background, 10%);
@form-radio-disabled-background: @global-muted-background;
@form-radio-disabled-icon-color: @global-muted-color;
@form-legend-font-size: @global-large-font-size;
@form-legend-line-height: 1.4;
@form-stacked-margin-bottom: @global-small-margin;
@form-horizontal-label-width: 200px;
@form-horizontal-label-margin-top: 7px;
@form-horizontal-controls-margin-left: 215px;
@form-horizontal-controls-text-padding-top: 7px;
@form-icon-width: @form-height;
@form-icon-color: @global-muted-color;
@form-icon-hover-color: @global-color;
@internal-form-select-image: "../../images/backgrounds/form-select.svg";
@internal-form-datalist-image: "../../images/backgrounds/form-datalist.svg";
@internal-form-radio-image: "../../images/backgrounds/form-radio.svg";
@internal-form-checkbox-image: "../../images/backgrounds/form-checkbox.svg";
@internal-form-checkbox-indeterminate-image: "../../images/backgrounds/form-checkbox-indeterminate.svg";
/* ========================================================================
Component: Form
========================================================================== */
/*
* 1. Define consistent box sizing.
* Default is `content-box` with following exceptions set to `border-box`
* `select`, `input[type="checkbox"]` and `input[type="radio"]`
* `input[type="search"]` in Chrome, Safari and Opera
* `input[type="color"]` in Firefox
* 2. Address margins set differently in Firefox/IE and Chrome/Safari/Opera.
* 3. Remove `border-radius` in iOS.
* 4. Change font properties to `inherit` in all browsers.
*/
.uk-input,
.uk-select,
.uk-textarea,
.uk-radio,
.uk-checkbox {
/* 1 */
box-sizing: border-box;
/* 2 */
margin: 0;
/* 3 */
border-radius: 0;
/* 4 */
font: inherit;
}
/*
* Show the overflow in Edge.
*/
.uk-input { overflow: visible; }
/*
* Remove the inheritance of text transform in Firefox.
*/
.uk-select { text-transform: none; }
/*
* 1. Change font properties to `inherit` in all browsers
* 2. Don't inherit the `font-weight` and use `bold` instead.
* NOTE: Both declarations don't work in Chrome, Safari and Opera.
*/
.uk-select optgroup {
/* 1 */
font: inherit;
/* 2 */
font-weight: bold;
}
/*
* Remove the default vertical scrollbar in IE 10+.
*/
.uk-textarea { overflow: auto; }
/*
* Remove the inner padding and cancel buttons in Chrome on OS X and Safari on OS X.
*/
.uk-input[type="search"]::-webkit-search-cancel-button,
.uk-input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
/*
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
.uk-input[type="number"]::-webkit-inner-spin-button,
.uk-input[type="number"]::-webkit-outer-spin-button { height: auto; }
/*
* Removes placeholder transparency in Firefox.
*/
.uk-input::-moz-placeholder,
.uk-textarea::-moz-placeholder { opacity: 1; }
/*
* Improves consistency of cursor style for clickable elements
*/
.uk-radio:not(:disabled),
.uk-checkbox:not(:disabled) { cursor: pointer; }
/*
* Define consistent border, margin, and padding.
* 1. Reset `min-width`
*/
.uk-fieldset {
border: none;
margin: 0;
padding: 0;
/* 1 */
min-width: 0;
}
/* Input, select and textarea
* Allowed: `text`, `password`, `datetime-local`, `date`, `month`,
`time`, `week`, `number`, `email`, `url`, `search`, `tel`, `color`
* Disallowed: `range`, `radio`, `checkbox`, `file`, `submit`, `reset` and `image`
========================================================================== */
/*
* Remove default style in iOS.
*/
.uk-input,
.uk-textarea { -webkit-appearance: none; }
/*
* 1. Prevent content overflow if a fixed width is used
* 2. Take the full width
* 3. Reset default
* 4. Style
*/
.uk-input,
.uk-select,
.uk-textarea {
/* 1 */
max-width: 100%;
/* 2 */
width: 100%;
/* 3 */
border: 0 none;
/* 4 */
padding: 0 @form-padding-horizontal;
background: @form-background;
color: @form-color;
.hook-form();
}
/*
* Single-line
* 1. Allow any element to look like an `input` or `select` element
* 2. Make sure line-height is not larger than height
* Also needed to center the text vertically
*/
.uk-input,
.uk-select:not([multiple]):not([size]) {
height: @form-height;
vertical-align: middle;
/* 1 */
display: inline-block;
.hook-form-single-line();
}
/* 2 */
.uk-input:not(input),
.uk-select:not(select) { line-height: @form-line-height; }
/*
* Multi-line
*/
.uk-select[multiple],
.uk-select[size],
.uk-textarea {
padding-top: @form-padding-vertical;
padding-bottom: @form-padding-vertical;
vertical-align: top;
.hook-form-multi-line();
}
.uk-select[multiple],
.uk-select[size] { resize: vertical; }
/* Focus */
.uk-input:focus,
.uk-select:focus,
.uk-textarea:focus {
outline: none;
background-color: @form-focus-background;
color: @form-focus-color;
.hook-form-focus();
}
/* Disabled */
.uk-input:disabled,
.uk-select:disabled,
.uk-textarea:disabled {
background-color: @form-disabled-background;
color: @form-disabled-color;
.hook-form-disabled();
}
/*
* Placeholder
*/
.uk-input::placeholder { color: @form-placeholder-color; }
.uk-textarea::placeholder { color: @form-placeholder-color; }
/* Style modifier (`uk-input`, `uk-select` and `uk-textarea`)
========================================================================== */
/*
* Small
*/
.uk-form-small { font-size: @form-small-font-size; }
/* Single-line */
.uk-form-small:not(textarea):not([multiple]):not([size]) {
height: @form-small-height;
padding-left: @form-small-padding-horizontal;
padding-right: @form-small-padding-horizontal;
}
/* Multi-line */
textarea.uk-form-small,
[multiple].uk-form-small,
[size].uk-form-small { padding: @form-small-padding-vertical @form-small-padding-horizontal; }
.uk-form-small:not(select):not(input):not(textarea) { line-height: @form-small-line-height; }
/*
* Large
*/
.uk-form-large { font-size: @form-large-font-size; }
/* Single-line */
.uk-form-large:not(textarea):not([multiple]):not([size]) {
height: @form-large-height;
padding-left: @form-large-padding-horizontal;
padding-right: @form-large-padding-horizontal;
}
/* Multi-line */
textarea.uk-form-large,
[multiple].uk-form-large,
[size].uk-form-large { padding: @form-large-padding-vertical @form-large-padding-horizontal; }
.uk-form-large:not(select):not(input):not(textarea) { line-height: @form-large-line-height; }
/* Style modifier (`uk-input`, `uk-select` and `uk-textarea`)
========================================================================== */
/*
* Error
*/
.uk-form-danger,
.uk-form-danger:focus {
color: @form-danger-color;
.hook-form-danger();
}
/*
* Success
*/
.uk-form-success,
.uk-form-success:focus {
color: @form-success-color;
.hook-form-success();
}
/*
* Blank
*/
.uk-form-blank {
background: none;
.hook-form-blank();
}
.uk-form-blank:focus {
.hook-form-blank-focus();
}
/* Width modifiers (`uk-input`, `uk-select` and `uk-textarea`)
========================================================================== */
/*
* Fixed widths
* Different widths for mini sized `input` and `select` elements
*/
input.uk-form-width-xsmall { width: @form-width-xsmall; }
select.uk-form-width-xsmall { width: (@form-width-xsmall + 25px); }
.uk-form-width-small { width: @form-width-small; }
.uk-form-width-medium { width: @form-width-medium; }
.uk-form-width-large { width: @form-width-large; }
/* Select
========================================================================== */
/*
* 1. Remove default style. Also works in Firefox
* 2. Style
* 3. Set `color` for options in the select dropdown, because the inherited `color` might be too light.
*/
.uk-select:not([multiple]):not([size]) {
/* 1 */
-webkit-appearance: none;
-moz-appearance: none;
/* 2 */
padding-right: @form-select-padding-right;
.svg-fill(@internal-form-select-image, "#000", @form-select-icon-color);
background-repeat: no-repeat;
background-position: 100% 50%;
}
/* 3 */
.uk-select:not([multiple]):not([size]) option { color: @form-select-option-color; }
/*
* Disabled
*/
.uk-select:not([multiple]):not([size]):disabled { .svg-fill(@internal-form-select-image, "#000", @form-select-disabled-icon-color); }
/* Datalist
========================================================================== */
/*
* 1. Remove default style in Chrome
*/
.uk-input[list] {
padding-right: @form-datalist-padding-right;
background-repeat: no-repeat;
background-position: 100% 50%;
}
.uk-input[list]:hover,
.uk-input[list]:focus { .svg-fill(@internal-form-datalist-image, "#000", @form-datalist-icon-color); }
/* 1 */
.uk-input[list]::-webkit-calendar-picker-indicator { display: none ; }
/* Radio and checkbox
========================================================================== */
/*
* 1. Style
* 2. Make box more robust so it clips the child element
* 3. Vertical alignment
* 4. Remove default style
* 5. Fix black background on iOS
* 6. Center icons
*/
.uk-radio,
.uk-checkbox {
/* 1 */
display: inline-block;
height: @form-radio-size;
width: @form-radio-size;
/* 2 */
overflow: hidden;
/* 3 */
margin-top: @form-radio-margin-top;
vertical-align: middle;
/* 4 */
-webkit-appearance: none;
-moz-appearance: none;
/* 5 */
background-color: @form-radio-background;
/* 6 */
background-repeat: no-repeat;
background-position: 50% 50%;
.hook-form-radio();
}
.uk-radio { border-radius: 50%; }
/* Focus */
.uk-radio:focus,
.uk-checkbox:focus {
background-color: @form-radio-focus-background;
outline: none;
.hook-form-radio-focus();
}
/*
* Checked
*/
.uk-radio:checked,
.uk-checkbox:checked,
.uk-checkbox:indeterminate {
background-color: @form-radio-checked-background;
.hook-form-radio-checked();
}
/* Focus */
.uk-radio:checked:focus,
.uk-checkbox:checked:focus,
.uk-checkbox:indeterminate:focus {
background-color: @form-radio-checked-focus-background;
.hook-form-radio-checked-focus();
}
/*
* Icons
*/
.uk-radio:checked { .svg-fill(@internal-form-radio-image, "#000", @form-radio-checked-icon-color); }
.uk-checkbox:checked { .svg-fill(@internal-form-checkbox-image, "#000", @form-radio-checked-icon-color); }
.uk-checkbox:indeterminate { .svg-fill(@internal-form-checkbox-indeterminate-image, "#000", @form-radio-checked-icon-color); }
/*
* Disabled
*/
.uk-radio:disabled,
.uk-checkbox:disabled {
background-color: @form-radio-disabled-background;
.hook-form-radio-disabled();
}
.uk-radio:disabled:checked { .svg-fill(@internal-form-radio-image, "#000", @form-radio-disabled-icon-color); }
.uk-checkbox:disabled:checked { .svg-fill(@internal-form-checkbox-image, "#000", @form-radio-disabled-icon-color); }
.uk-checkbox:disabled:indeterminate { .svg-fill(@internal-form-checkbox-indeterminate-image, "#000", @form-radio-disabled-icon-color); }
/* Legend
========================================================================== */
/*
* Legend
* 1. Behave like block element
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove padding so people aren't caught out if they zero out fieldsets.
* 4. Style
*/
.uk-legend {
/* 1 */
width: 100%;
/* 2 */
color: inherit;
/* 3 */
padding: 0;
/* 4 */
font-size: @form-legend-font-size;
line-height: @form-legend-line-height;
.hook-form-legend();
}
/* Custom controls
========================================================================== */
/*
* 1. Container fits its content
* 2. Create position context
* 3. Prevent content overflow
* 4. Behave like most inline-block elements
*/
.uk-form-custom {
/* 1 */
display: inline-block;
/* 2 */
position: relative;
/* 3 */
max-width: 100%;
/* 4 */
vertical-align: middle;
}
/*
* 1. Position and resize the form control to always cover its container
* 2. Required for Firefox for positioning to the left
* 3. Required for Webkit to make `height` work
* 4. Hide controle and show cursor
* 5. Needed for the cursor
* 6. Clip height caused by 5. Needed for Webkit only
*/
.uk-form-custom select,
.uk-form-custom input[type="file"] {
/* 1 */
position: absolute;
top: 0;
z-index: 1;
width: 100%;
height: 100%;
/* 2 */
left: 0;
/* 3 */
-webkit-appearance: none;
/* 4 */
opacity: 0;
cursor: pointer;
}
.uk-form-custom input[type="file"] {
/* 5 */
font-size: 500px;
/* 6 */
overflow: hidden;
}
/* Label
========================================================================== */
.uk-form-label {
.hook-form-label();
}
/* Layout
========================================================================== */
/*
* Stacked
*/
.uk-form-stacked .uk-form-label {
display: block;
margin-bottom: @form-stacked-margin-bottom;
.hook-form-stacked-label();
}
/*
* Horizontal
*/
/* Tablet portrait and smaller */
@media (max-width: @breakpoint-small-max) {
/* Behave like `uk-form-stacked` */
.uk-form-horizontal .uk-form-label {
display: block;
margin-bottom: @form-stacked-margin-bottom;
.hook-form-stacked-label();
}
}
/* Tablet landscape and bigger */
@media (min-width: @breakpoint-medium) {
.uk-form-horizontal .uk-form-label {
width: @form-horizontal-label-width;
margin-top: @form-horizontal-label-margin-top;
float: left;
.hook-form-horizontal-label();
}
.uk-form-horizontal .uk-form-controls { margin-left: @form-horizontal-controls-margin-left; }
/* Better vertical alignment if controls are checkboxes and radio buttons with text */
.uk-form-horizontal .uk-form-controls-text { padding-top: @form-horizontal-controls-text-padding-top; }
}
/* Icons
========================================================================== */
/*
* 1. Set position
* 2. Set width
* 3. Center icon vertically and horizontally
* 4. Style
*/
.uk-form-icon {
/* 1 */
position: absolute;
top: 0;
bottom: 0;
left: 0;
/* 2 */
width: @form-icon-width;
/* 3 */
display: inline-flex;
justify-content: center;
align-items: center;
/* 4 */
color: @form-icon-color;
.hook-form-icon();
}
/*
* Required for `a`.
*/
.uk-form-icon:hover { color: @form-icon-hover-color; }
/*
* Make `input` element clickable through icon, e.g. if it's a `span`
*/
.uk-form-icon:not(a):not(button):not(input) { pointer-events: none; }
/*
* Input padding
*/
.uk-form-icon:not(.uk-form-icon-flip) ~ .uk-input { padding-left: @form-icon-width ; }
/*
* Position modifier
*/
.uk-form-icon-flip {
right: 0;
left: auto;
}
.uk-form-icon-flip ~ .uk-input { padding-right: @form-icon-width ; }
// Hooks
// ========================================================================
.hook-form-misc();
.hook-form() {}
.hook-form-single-line() {}
.hook-form-multi-line() {}
.hook-form-focus() {}
.hook-form-disabled() {}
.hook-form-danger() {}
.hook-form-success() {}
.hook-form-blank() {}
.hook-form-blank-focus() {}
.hook-form-radio() {}
.hook-form-radio-focus() {}
.hook-form-radio-checked() {}
.hook-form-radio-checked-focus() {}
.hook-form-radio-disabled() {}
.hook-form-legend() {}
.hook-form-label() {}
.hook-form-stacked-label() {}
.hook-form-horizontal-label() {}
.hook-form-icon() {}
.hook-form-misc() {}
// Inverse
// ========================================================================
@inverse-form-background: @inverse-global-muted-background;
@inverse-form-color: @inverse-global-color;
@inverse-form-focus-background: fadein(@inverse-form-background, 5%);
@inverse-form-focus-color: @inverse-global-color;
@inverse-form-placeholder-color: @inverse-global-muted-color;
@inverse-form-select-icon-color: @inverse-global-color;
@inverse-form-datalist-icon-color: @inverse-global-color;
@inverse-form-radio-background: @inverse-global-muted-background;
@inverse-form-radio-focus-background: fadein(@inverse-form-radio-background, 5%);
@inverse-form-radio-checked-background: @inverse-global-primary-background;
@inverse-form-radio-checked-icon-color: @inverse-global-inverse-color;
@inverse-form-radio-checked-focus-background: fadein(@inverse-global-primary-background, 10%);
@inverse-form-icon-color: @inverse-global-muted-color;
@inverse-form-icon-hover-color: @inverse-global-color;
.hook-inverse() {
.uk-input,
.uk-select,
.uk-textarea {
background-color: @inverse-form-background;
color: @inverse-form-color;
background-clip: padding-box;
.hook-inverse-form();
&:focus {
background-color: @inverse-form-focus-background;
color: @inverse-form-focus-color;
.hook-inverse-form-focus();
}
}
//
// Placeholder
//
.uk-input::placeholder { color: @inverse-form-placeholder-color; }
.uk-textarea::placeholder { color: @inverse-form-placeholder-color; }
//
// Select
//
.uk-select:not([multiple]):not([size]) { .svg-fill(@internal-form-select-image, "#000", @inverse-form-select-icon-color); }
//
// Datalist
//
.uk-input[list]:hover,
.uk-input[list]:focus { .svg-fill(@internal-form-datalist-image, "#000", @inverse-form-datalist-icon-color); }
//
// Radio and checkbox
//
.uk-radio,
.uk-checkbox {
background-color: @inverse-form-radio-background;
.hook-inverse-form-radio();
}
// Focus
.uk-radio:focus,
.uk-checkbox:focus {
background-color: @inverse-form-radio-focus-background;
.hook-inverse-form-radio-focus();
}
// Checked
.uk-radio:checked,
.uk-checkbox:checked,
.uk-checkbox:indeterminate {
background-color: @inverse-form-radio-checked-background;
.hook-inverse-form-radio-checked();
}
// Focus
.uk-radio:checked:focus,
.uk-checkbox:checked:focus,
.uk-checkbox:indeterminate:focus {
background-color: @inverse-form-radio-checked-focus-background;
.hook-inverse-form-radio-checked-focus();
}
// Icon
.uk-radio:checked { .svg-fill(@internal-form-radio-image, "#000", @inverse-form-radio-checked-icon-color); }
.uk-checkbox:checked { .svg-fill(@internal-form-checkbox-image, "#000", @inverse-form-radio-checked-icon-color); }
.uk-checkbox:indeterminate { .svg-fill(@internal-form-checkbox-indeterminate-image, "#000", @inverse-form-radio-checked-icon-color); }
// Label
.uk-form-label {
.hook-inverse-form-label();
}
// Icon
.uk-form-icon {
color: @inverse-form-icon-color;
.hook-inverse-form-icon();
}
.uk-form-icon:hover { color: @inverse-form-icon-hover-color; }
}
.hook-inverse-form() {}
.hook-inverse-form-focus() {}
.hook-inverse-form-radio() {}
.hook-inverse-form-radio-focus() {}
.hook-inverse-form-radio-checked() {}
.hook-inverse-form-radio-checked-focus() {}
.hook-inverse-form-label() {}
.hook-inverse-form-icon() {}