bootstrap-less-port
Version:
A Less port of Bootstrap v4
192 lines (171 loc) • 5.05 kB
text/less
// Form control focus state
//
// Generate a customized focus state and for any input with the specified color,
// which defaults to the `@input-focus-border-color` variable.
//
// We highly encourage you to not customize the default value, but instead use
// this to tweak colors on an as-needed basis. This aesthetic change is based on
// WebKit's default styles, but applicable to a wider range of browsers. Its
// usability and accessibility should be taken into account with any change.
//
// Example usage: change the default blue border and shadow to white for better
// contrast against a dark gray background.
#form-control-focus(@ignore-warning: false) {
&:focus {
color: @input-focus-color;
background-color: @input-focus-bg;
border-color: @input-focus-border-color;
outline: 0;
& when (@enable-shadows) {
#box-shadow(@input-box-shadow, @input-focus-box-shadow);
}
& when not (@enable-shadows) {
// Avoid using mixin so we can pass custom focus shadow properly
box-shadow: @input-focus-box-shadow;
}
}
#deprecate("The `#form-control-focus()` mixin", "v4.4.0", "v5", @ignore-warning);
}
// This mixin uses an `if()` technique to be compatible with Dart Sass
// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details
//@mixin form-validation-state-selector($state) {
// @if ($state == "valid" or $state == "invalid") {
// .was-validated #{if(&, "&", "")}:#{$state},
// #{if(&, "&", "")}.is-#{$state} {
// @content;
// }
// } @else {
// #{if(&, "&", "")}.is-#{$state} {
// @content;
// }
// }
//}
// LESS PORT: The `if` technique mentioned above is not used here because it’s unnecessary.
#form-validation-state-selector(@state, @content) {
& when ((@state = valid) or (@state = invalid)) {
.was-validated &:@{state},
&.is-@{state} {
@content();
}
}
& when not ((@state = valid) or (@state = invalid)) {
&.is-@{state} {
@content();
}
}
}
#form-validation-state(@state, @color, @icon) {
.@{state}-feedback {
display: none;
width: 100%;
margin-top: @form-feedback-margin-top;
#font-size(@form-feedback-font-size);
color: @color;
}
.@{state}-tooltip {
position: absolute;
top: 100%;
z-index: 5;
display: none;
max-width: 100%; // Contain to parent when possible
padding: @form-feedback-tooltip-padding-y @form-feedback-tooltip-padding-x;
margin-top: 0.1rem;
#font-size(@form-feedback-tooltip-font-size);
line-height: @form-feedback-tooltip-line-height;
color: color-yiq(@color);
background-color: fade(@color, (@form-feedback-tooltip-opacity * 100));
#border-radius(@form-feedback-tooltip-border-radius);
}
#form-validation-state-selector(@state, {
~ .@{state}-feedback,
~ .@{state}-tooltip {
display: block;
}
});
.form-control {
#form-validation-state-selector(@state, {
border-color: @color;
& when (@enable-validation-icons) {
padding-right: @input-height-inner;
background-image: escape-svg(@icon);
background-repeat: no-repeat;
background-position: right @input-height-inner-quarter center;
background-size: @input-height-inner-half @input-height-inner-half;
}
&:focus {
border-color: @color;
box-shadow: 0 0 0 @input-focus-width fade(@color, 25%);
}
});
}
textarea.form-control {
#form-validation-state-selector(@state, {
& when (@enable-validation-icons) {
padding-right: @input-height-inner;
background-position: top @input-height-inner-quarter right @input-height-inner-quarter;
}
});
}
.custom-select {
#form-validation-state-selector(@state, {
border-color: @color;
& when (@enable-validation-icons) {
padding-right: @custom-select-feedback-icon-padding-right;
background: @custom-select-background, escape-svg(@icon) @custom-select-bg no-repeat ~"@{custom-select-feedback-icon-position}/@{custom-select-feedback-icon-size}";
}
&:focus {
border-color: @color;
box-shadow: 0 0 0 @input-focus-width fade(@color, 25%);
}
});
}
.form-check-input {
#form-validation-state-selector(@state, {
~ .form-check-label {
color: @color;
}
~ .@{state}-feedback,
~ .@{state}-tooltip {
display: block;
}
});
}
.custom-control-input {
#form-validation-state-selector(@state, {
~ .custom-control-label {
color: @color;
&::before {
border-color: @color;
}
}
&:checked {
~ .custom-control-label::before {
border-color: lighten(@color, 10%);
#gradient-bg(lighten(@color, 10%));
}
}
&:focus {
~ .custom-control-label::before {
box-shadow: 0 0 0 @input-focus-width fade(@color, 25%);
}
&:not(:checked) ~ .custom-control-label::before {
border-color: @color;
}
}
});
}
// custom file
.custom-file-input {
#form-validation-state-selector(@state, {
~ .custom-file-label {
border-color: @color;
}
&:focus {
~ .custom-file-label {
border-color: @color;
box-shadow: 0 0 0 @input-focus-width fade(@color, 25%);
}
}
});
}
}