UNPKG

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
// 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 !important; } /* 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 !important; } /* * Position modifier */ .uk-form-icon-flip { right: 0; left: auto; } .uk-form-icon-flip ~ .uk-input { padding-right: @form-icon-width !important; } // 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() {}