282 lines
6.7 KiB
SCSS
282 lines
6.7 KiB
SCSS
// * Form controls
|
|
// *******************************************************************************
|
|
|
|
// Form control
|
|
@mixin template-form-control-theme($color) {
|
|
.form-control:focus,
|
|
.form-select:focus {
|
|
border-color: $color !important;
|
|
}
|
|
|
|
// Using :focus-within to apply focus border color to default and merged input-group
|
|
.input-group {
|
|
&:focus-within {
|
|
.form-control,
|
|
.input-group-text {
|
|
border-color: $color !important;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Float labels
|
|
@mixin template-float-label-theme($color) {
|
|
.form-floating {
|
|
> .form-control:focus,
|
|
> .form-control:not(:placeholder-shown),
|
|
> .form-select {
|
|
~ label {
|
|
color: $color;
|
|
}
|
|
}
|
|
|
|
> .form-control:-webkit-autofill {
|
|
~ label {
|
|
color: $color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Form Switch
|
|
@mixin template-form-switch-theme($background) {
|
|
$focus-color: $background;
|
|
$focus-bg-image: str-replace(
|
|
str-replace($form-switch-focus-bg-image, '#{$form-switch-focus-color}', $focus-color),
|
|
'#',
|
|
'%23'
|
|
);
|
|
|
|
$checked-color: $component-active-color;
|
|
$checked-bg-image: str-replace(
|
|
str-replace($form-switch-checked-bg-image, '#{$form-switch-checked-color}', $checked-color),
|
|
'#',
|
|
'%23'
|
|
);
|
|
|
|
.form-switch {
|
|
.form-check-input {
|
|
&:focus {
|
|
background-image: escape-svg($focus-bg-image);
|
|
}
|
|
|
|
&:checked {
|
|
@if $enable-gradients {
|
|
background-image: escape-svg($checked-bg-image), var(--#{$variable-prefix}gradient);
|
|
} @else {
|
|
background-image: escape-svg($checked-bg-image);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// File Input
|
|
@mixin template-file-input-theme($color) {
|
|
.form-control:focus ~ .form-label {
|
|
border-color: $color;
|
|
|
|
&::after {
|
|
border-color: inherit;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Form Check
|
|
@mixin template-form-check-variant($parent, $background, $color: null) {
|
|
$color: if($color, $color, color-contrast($background));
|
|
$focus-border: $background;
|
|
|
|
#{$parent} .form-check-input {
|
|
&:focus {
|
|
border-color: $focus-border;
|
|
box-shadow: 0 2px 4px 0 rgba($background, 0.4);
|
|
}
|
|
|
|
&:disabled {
|
|
background-color: $form-check-input-disabled-bg;
|
|
}
|
|
|
|
&:checked,
|
|
&[type='checkbox']:indeterminate {
|
|
background-color: $background;
|
|
border-color: $background;
|
|
box-shadow: 0 2px 4px 0 rgba($background, 0.4);
|
|
}
|
|
}
|
|
|
|
// Custom options
|
|
#{$parent}.custom-option {
|
|
&.checked {
|
|
border: 1px solid $background;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin template-form-check-theme($background, $color: null) {
|
|
@include template-form-check-variant('', $background, $color);
|
|
}
|
|
|
|
// Form Validation
|
|
|
|
@mixin form-validation-state(
|
|
$state: null,
|
|
$color: null,
|
|
$icon: null,
|
|
$tooltip-color: null,
|
|
$tooltip-bg-color: null,
|
|
$focus-box-shadow: null,
|
|
$border-color: null
|
|
) {
|
|
}
|
|
|
|
@mixin template-form-validation-state(
|
|
$state,
|
|
$color,
|
|
$icon,
|
|
$tooltip-color: color-contrast($color),
|
|
$tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
|
|
$focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),
|
|
$border-color: $color
|
|
) {
|
|
.#{$state}-feedback {
|
|
display: none;
|
|
width: 100%;
|
|
margin-top: $form-feedback-margin-top;
|
|
@include font-size($form-feedback-font-size);
|
|
font-style: $form-feedback-font-style;
|
|
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;
|
|
@include font-size($form-feedback-tooltip-font-size);
|
|
line-height: $form-feedback-tooltip-line-height;
|
|
color: $tooltip-color;
|
|
background-color: $tooltip-bg-color;
|
|
@include border-radius($form-feedback-tooltip-border-radius);
|
|
}
|
|
|
|
@include form-validation-state-selector($state) {
|
|
~ .#{$state}-feedback,
|
|
~ .#{$state}-tooltip {
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
.form-control {
|
|
@include form-validation-state-selector($state) {
|
|
border-color: $color !important;
|
|
|
|
.dark-style & {
|
|
border-color: $color !important;
|
|
}
|
|
|
|
@if $enable-validation-icons {
|
|
background-image: escape-svg($icon);
|
|
background-repeat: no-repeat;
|
|
background-size: $input-height-inner-half $input-height-inner-half;
|
|
|
|
@include ltr-style {
|
|
padding-right: $input-height-inner;
|
|
background-position: right $input-height-inner-quarter center;
|
|
}
|
|
}
|
|
|
|
&:focus {
|
|
border-color: $color !important;
|
|
box-shadow: $focus-box-shadow;
|
|
}
|
|
}
|
|
}
|
|
|
|
// stylelint-disable-next-line selector-no-qualifying-type
|
|
textarea.form-control {
|
|
@include form-validation-state-selector($state) {
|
|
@if $enable-validation-icons {
|
|
@include ltr-style {
|
|
padding-right: $input-height-inner;
|
|
background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.form-select {
|
|
@include form-validation-state-selector($state) {
|
|
border-color: $color !important;
|
|
@if $enable-validation-icons {
|
|
background-size: $form-select-bg-size, $form-select-feedback-icon-size;
|
|
@include ltr-style {
|
|
background-image: escape-svg($form-select-indicator), escape-svg($icon);
|
|
padding-right: $form-select-feedback-icon-padding-end;
|
|
background-position: $form-select-bg-position, $form-select-feedback-icon-position;
|
|
}
|
|
}
|
|
|
|
&:focus {
|
|
border-color: $color;
|
|
box-shadow: $focus-box-shadow;
|
|
}
|
|
}
|
|
}
|
|
|
|
.form-check-input {
|
|
@include form-validation-state-selector($state) {
|
|
border-color: $color;
|
|
|
|
&:checked {
|
|
background-color: $color;
|
|
border-color: $color;
|
|
}
|
|
|
|
&:focus {
|
|
box-shadow: $focus-box-shadow;
|
|
border-color: $color;
|
|
}
|
|
|
|
~ .form-check-label {
|
|
color: $color;
|
|
}
|
|
}
|
|
}
|
|
.form-check-inline .form-check-input {
|
|
~ .#{$state}-feedback {
|
|
@include ltr-style {
|
|
margin-left: 0.5em;
|
|
}
|
|
}
|
|
}
|
|
// On validation .input-group & .input-group-merged, setup proper border color & box-shadow
|
|
.input-group {
|
|
.form-control {
|
|
@include form-validation-state-selector($state) {
|
|
~ .input-group-text {
|
|
border-color: $color !important;
|
|
}
|
|
&:focus {
|
|
border-color: $color !important;
|
|
box-shadow: none;
|
|
// ? .input-group has .input-group-text last/sibling
|
|
~ .input-group-text {
|
|
border-color: $color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.input-group .form-control,
|
|
.input-group .form-select {
|
|
@include form-validation-state-selector($state) {
|
|
z-index: 3;
|
|
}
|
|
}
|
|
}
|