mirror of
https://github.com/twbs/bootstrap.git
synced 2024-11-29 11:24:18 +01:00
fda92d02a3
- Really we didn't need to do any of that strip units stuff to generate six new variables, two for each button size - Using sibling selectors, we can target those split button dropdown toggles using the .dropdown-toggle-split class, and adjust padding and margin as needed - Now, we nuke the margin-left from the ::after generated caret and tighten up the padding so that those split toggles don't look huge next to their main button
235 lines
5.3 KiB
SCSS
235 lines
5.3 KiB
SCSS
// scss-lint:disable QualifyingElement
|
|
|
|
// Make the div behave like a button
|
|
.btn-group,
|
|
.btn-group-vertical {
|
|
position: relative;
|
|
display: inline-block;
|
|
vertical-align: middle; // match .btn alignment given font-size hack above
|
|
|
|
> .btn {
|
|
position: relative;
|
|
float: left;
|
|
|
|
// Bring the "active" button to the front
|
|
&:focus,
|
|
&:active,
|
|
&.active {
|
|
z-index: 2;
|
|
}
|
|
@include hover {
|
|
z-index: 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Prevent double borders when buttons are next to each other
|
|
.btn-group {
|
|
.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 {
|
|
margin-left: -$btn-toolbar-margin; // Offset the first child's margin
|
|
@include clearfix();
|
|
|
|
.btn-group,
|
|
.input-group {
|
|
float: left;
|
|
}
|
|
|
|
> .btn,
|
|
> .btn-group,
|
|
> .input-group {
|
|
margin-left: $btn-toolbar-margin;
|
|
}
|
|
}
|
|
|
|
.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-group > .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-group > .btn:last-child:not(:first-child),
|
|
.btn-group > .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 > .btn-group {
|
|
float: left;
|
|
}
|
|
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
border-radius: 0;
|
|
}
|
|
.btn-group > .btn-group:first-child:not(:last-child) {
|
|
> .btn:last-child,
|
|
> .dropdown-toggle {
|
|
@include border-right-radius(0);
|
|
}
|
|
}
|
|
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
|
@include border-left-radius(0);
|
|
}
|
|
|
|
// On active and open, don't show outline
|
|
.btn-group .dropdown-toggle:active,
|
|
.btn-group.open .dropdown-toggle {
|
|
outline: 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-left: $btn-padding-x * .75;
|
|
padding-right: $btn-padding-x * .75;
|
|
|
|
&::after {
|
|
margin-left: 0;
|
|
}
|
|
}
|
|
|
|
.btn-sm + .dropdown-toggle-split {
|
|
padding-left: $btn-padding-x-sm * .75;
|
|
padding-right: $btn-padding-x-sm * .75;
|
|
}
|
|
|
|
.btn-lg + .dropdown-toggle-split {
|
|
padding-left: $btn-padding-x-lg * .75;
|
|
padding-right: $btn-padding-x-lg * .75;
|
|
}
|
|
|
|
|
|
// The clickable button for toggling the menu
|
|
// Remove the gradient and set the same inset shadow as the :active state
|
|
.btn-group.open .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);
|
|
}
|
|
}
|
|
|
|
|
|
// Reposition the caret
|
|
.btn .caret {
|
|
margin-left: 0;
|
|
}
|
|
// Carets in other button sizes
|
|
.btn-lg .caret {
|
|
border-width: $caret-width-lg $caret-width-lg 0;
|
|
border-bottom-width: 0;
|
|
}
|
|
// Upside down carets for .dropup
|
|
.dropup .btn-lg .caret {
|
|
border-width: 0 $caret-width-lg $caret-width-lg;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Vertical button groups
|
|
//
|
|
|
|
.btn-group-vertical {
|
|
> .btn,
|
|
> .btn-group,
|
|
> .btn-group > .btn {
|
|
display: block;
|
|
float: none;
|
|
width: 100%;
|
|
max-width: 100%;
|
|
}
|
|
|
|
// Clear floats so dropdown menus can be properly placed
|
|
> .btn-group {
|
|
@include clearfix();
|
|
|
|
> .btn {
|
|
float: none;
|
|
}
|
|
}
|
|
|
|
> .btn + .btn,
|
|
> .btn + .btn-group,
|
|
> .btn-group + .btn,
|
|
> .btn-group + .btn-group {
|
|
margin-top: -$input-btn-border-width;
|
|
margin-left: 0;
|
|
}
|
|
}
|
|
|
|
.btn-group-vertical > .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-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
|
|
border-radius: 0;
|
|
}
|
|
.btn-group-vertical > .btn-group:first-child:not(:last-child) {
|
|
> .btn:last-child,
|
|
> .dropdown-toggle {
|
|
@include border-bottom-radius(0);
|
|
}
|
|
}
|
|
.btn-group-vertical > .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 {
|
|
input[type="radio"],
|
|
input[type="checkbox"] {
|
|
position: absolute;
|
|
clip: rect(0,0,0,0);
|
|
pointer-events: none;
|
|
}
|
|
}
|
|
}
|