// We use mixins instead of placeholders as placeholders would combine the selectors when @extend-ed @mixin form-floating-active-input-styles() { padding-top: $form-floating-input-padding-t; padding-bottom: $form-floating-input-padding-b; } @mixin form-floating-active-label-styles() { opacity: $form-floating-label-opacity; transform: $form-floating-label-transform; } .form-floating { position: relative; > .form-control, > .form-control-plaintext, > .form-select { height: $form-floating-height; line-height: $form-floating-line-height; } > label { position: absolute; top: 0; left: 0; height: 100%; // allow textareas padding: $form-floating-padding-y $form-floating-padding-x; pointer-events: none; border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model transform-origin: 0 0; @include transition($form-floating-transition); } > .form-control, > .form-control-plaintext { padding: $form-floating-padding-y $form-floating-padding-x; &::placeholder { color: transparent; } &:focus, &:not(:placeholder-shown) { @include form-floating-active-input-styles(); } // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped &:-webkit-autofill { @include form-floating-active-input-styles(); } } > .form-select { @include form-floating-active-input-styles(); } > .form-control:focus, > .form-control:not(:placeholder-shown), > .form-control-plaintext, > .form-select { ~ label { @include form-floating-active-label-styles(); } } // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped > .form-control:-webkit-autofill { ~ label { @include form-floating-active-label-styles(); } } > .form-control-plaintext { ~ label { border-width: $input-border-width 0; // Required to properly position label text - as explained above } } } // Todo in v6: Consider combining this with the .form-control-plaintext rules to reduce some CSS? .form-floating-always { > .form-control { @include form-floating-active-input-styles(); &::placeholder { color: $input-color; } &:focus::placeholder { color: $input-placeholder-color; } } > label { @include form-floating-active-label-styles(); } }