mirror of
https://github.com/twbs/bootstrap.git
synced 2024-11-29 11:24:18 +01:00
52d99a887e
1. move a couple of them before the more specific ones. 2. change nesting to be under the same parent selector 3. use the ampersand more
213 lines
4.7 KiB
SCSS
213 lines
4.7 KiB
SCSS
// stylelint-disable selector-no-qualifying-type
|
|
|
|
// Make the div behave like a button
|
|
.btn-group,
|
|
.btn-group-vertical {
|
|
position: relative;
|
|
display: inline-flex;
|
|
vertical-align: middle; // match .btn alignment given font-size hack above
|
|
|
|
> .btn {
|
|
position: relative;
|
|
flex: 0 1 auto;
|
|
|
|
// Bring the hover, focused, and "active" buttons to the front to overlay
|
|
// the borders properly
|
|
@include hover {
|
|
z-index: 1;
|
|
}
|
|
&:focus,
|
|
&:active,
|
|
&.active {
|
|
z-index: 1;
|
|
}
|
|
}
|
|
|
|
// Prevent double borders when buttons are next to each other
|
|
.btn + .btn,
|
|
.btn + .btn-group,
|
|
.btn-group + .btn,
|
|
.btn-group + .btn-group {
|
|
margin-left: -$input-btn-border-width;
|
|
}
|
|
}
|
|
|
|
// Optional: Group multiple button groups together for a toolbar
|
|
.btn-toolbar {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-start;
|
|
|
|
.input-group {
|
|
width: auto;
|
|
}
|
|
}
|
|
|
|
.btn-group {
|
|
> .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
|
|
border-radius: 0;
|
|
}
|
|
|
|
// Set corners individual because sometimes a single button can be in a .btn-group
|
|
// and we need :first-child and :last-child to both match
|
|
> .btn:first-child {
|
|
margin-left: 0;
|
|
|
|
&:not(:last-child):not(.dropdown-toggle) {
|
|
@include border-right-radius(0);
|
|
}
|
|
}
|
|
|
|
|
|
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu
|
|
// immediately after it
|
|
> .btn:last-child:not(:first-child),
|
|
> .dropdown-toggle:not(:first-child) {
|
|
@include border-left-radius(0);
|
|
}
|
|
|
|
// Custom edits for including btn-groups within btn-groups (useful for including
|
|
// dropdown buttons within a btn-group)
|
|
> .btn-group {
|
|
float: left;
|
|
}
|
|
|
|
> .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
border-radius: 0;
|
|
}
|
|
|
|
> .btn-group:first-child:not(:last-child) {
|
|
> .btn:last-child,
|
|
> .dropdown-toggle {
|
|
@include border-right-radius(0);
|
|
}
|
|
}
|
|
|
|
> .btn-group:last-child:not(:first-child) > .btn:first-child {
|
|
@include border-left-radius(0);
|
|
}
|
|
}
|
|
|
|
// Sizing
|
|
//
|
|
// Remix the default button sizing classes into new ones for easier manipulation.
|
|
|
|
.btn-group-sm > .btn { @extend .btn-sm; }
|
|
.btn-group-lg > .btn { @extend .btn-lg; }
|
|
|
|
|
|
//
|
|
// Split button dropdowns
|
|
//
|
|
|
|
.btn + .dropdown-toggle-split {
|
|
padding-right: $input-btn-padding-x * .75;
|
|
padding-left: $input-btn-padding-x * .75;
|
|
|
|
&::after {
|
|
margin-left: 0;
|
|
}
|
|
}
|
|
|
|
.btn-sm + .dropdown-toggle-split {
|
|
padding-right: $input-btn-padding-x-sm * .75;
|
|
padding-left: $input-btn-padding-x-sm * .75;
|
|
}
|
|
|
|
.btn-lg + .dropdown-toggle-split {
|
|
padding-right: $input-btn-padding-x-lg * .75;
|
|
padding-left: $input-btn-padding-x-lg * .75;
|
|
}
|
|
|
|
|
|
// The clickable button for toggling the menu
|
|
// Set the same inset shadow as the :active state
|
|
.btn-group.show .dropdown-toggle {
|
|
@include box-shadow($btn-active-box-shadow);
|
|
|
|
// Show no shadow for `.btn-link` since it has no other button styles.
|
|
&.btn-link {
|
|
@include box-shadow(none);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Vertical button groups
|
|
//
|
|
|
|
.btn-group-vertical {
|
|
flex-direction: column;
|
|
align-items: flex-start;
|
|
justify-content: center;
|
|
|
|
.btn,
|
|
.btn-group {
|
|
width: 100%;
|
|
}
|
|
|
|
> .btn + .btn,
|
|
> .btn + .btn-group,
|
|
> .btn-group + .btn,
|
|
> .btn-group + .btn-group {
|
|
margin-top: -$input-btn-border-width;
|
|
margin-left: 0;
|
|
}
|
|
|
|
> .btn {
|
|
&:not(:first-child):not(:last-child) {
|
|
border-radius: 0;
|
|
}
|
|
|
|
&:first-child:not(:last-child) {
|
|
@include border-bottom-radius(0);
|
|
}
|
|
|
|
&:last-child:not(:first-child) {
|
|
@include border-top-radius(0);
|
|
}
|
|
}
|
|
|
|
> .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
border-radius: 0;
|
|
}
|
|
|
|
> .btn-group:first-child:not(:last-child) {
|
|
> .btn:last-child,
|
|
> .dropdown-toggle {
|
|
@include border-bottom-radius(0);
|
|
}
|
|
}
|
|
|
|
> .btn-group:last-child:not(:first-child) > .btn:first-child {
|
|
@include border-top-radius(0);
|
|
}
|
|
}
|
|
|
|
|
|
// Checkbox and radio options
|
|
//
|
|
// In order to support the browser's form validation feedback, powered by the
|
|
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
|
|
// `display: none;` or `visibility: hidden;` as that also hides the popover.
|
|
// Simply visually hiding the inputs via `opacity` would leave them clickable in
|
|
// certain cases which is prevented by using `clip` and `pointer-events`.
|
|
// This way, we ensure a DOM element is visible to position the popover from.
|
|
//
|
|
// See https://github.com/twbs/bootstrap/pull/12794 and
|
|
// https://github.com/twbs/bootstrap/pull/14559 for more information.
|
|
|
|
[data-toggle="buttons"] {
|
|
> .btn,
|
|
> .btn-group > .btn {
|
|
margin-bottom: 0; // Override default `<label>` value
|
|
|
|
input[type="radio"],
|
|
input[type="checkbox"] {
|
|
position: absolute;
|
|
clip: rect(0, 0, 0, 0);
|
|
pointer-events: none;
|
|
}
|
|
}
|
|
}
|