// stylelint-disable selector-no-qualifying-type // // Base styles // .input-group { position: relative; display: flex; flex-wrap: wrap; // For form validation feedback align-items: stretch; width: 100%; > .form-control, > .form-control-plaintext, > .custom-select, > .custom-file { position: relative; // For focus state's z-index flex: 1 1 auto; width: 1%; min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size margin-bottom: 0; + .form-control, + .custom-select, + .custom-file { margin-inline-start: -$input-border-width; } } // Bring the "active" form control to the top of surrounding elements > .form-control:focus, > .custom-select:focus, > .custom-file .custom-file-input:focus ~ .custom-file-label { z-index: 3; } // Bring the custom file input above the label > .custom-file .custom-file-input:focus { z-index: 4; } > .form-control, > .custom-select { &:not(:last-child) { @include border-inline-end-radius(0); } &:not(:first-child) { @include border-inline-start-radius(0); } } // Custom file inputs have more complex markup, thus requiring different // border-radius overrides. > .custom-file { display: flex; align-items: center; &:not(:last-child) .custom-file-label, &:not(:last-child) .custom-file-label::after { @include border-inline-end-radius(0); } &:not(:first-child) .custom-file-label { @include border-inline-start-radius(0); } } } // Prepend and append // // While it requires one extra layer of HTML for each, dedicated prepend and // append elements allow us to 1) be less clever, 2) simplify our selectors, and // 3) support HTML5 form validation. .input-group-prepend, .input-group-append { display: flex; // Ensure buttons are always above inputs for more visually pleasing borders. // This isn't needed for `.input-group-text` since it shares the same border-color // as our inputs. .btn { position: relative; z-index: 2; &:focus { z-index: 3; } } .btn + .btn, .btn + .input-group-text, .input-group-text + .input-group-text, .input-group-text + .btn { margin-inline-start: -$input-border-width; } } .input-group-prepend { margin-inline-end: -$input-border-width; } .input-group-append { margin-inline-start: -$input-border-width; } // Textual addons // // Serves as a catch-all element for any text or radio/checkbox input you wish // to prepend or append to an input. .input-group-text { display: flex; align-items: center; padding: $input-padding-y $input-padding-x; margin-bottom: 0; // Allow use of