@use 'sass:map';
// The dropdown wrapper (`
`)
@use '../config' as *;
.dropup,
.dropend,
.dropdown,
.dropstart,
.dropup-center,
.dropdown-center {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
// Generate the caret automatically
@include caret();
}
// The dropdown menu
.dropdown-menu {
// scss-docs-start dropdown-css-vars
--dropdown-zindex: #{$zindex-dropdown};
--dropdown-min-width: #{$dropdown-min-width};
--dropdown-padding-x: #{$dropdown-padding-x};
--dropdown-padding-y: #{$dropdown-padding-y};
--dropdown-spacer: #{$dropdown-spacer};
@include rfs($dropdown-font-size, --dropdown-font-size);
--dropdown-color: #{$dropdown-color};
--dropdown-bg: #{$dropdown-bg};
--dropdown-border-color: #{$dropdown-border-color};
--dropdown-border-radius: #{$dropdown-border-radius};
--dropdown-border-width: #{$dropdown-border-width};
--dropdown-inner-border-radius: #{$dropdown-inner-border-radius};
--dropdown-divider-bg: #{$dropdown-divider-bg};
--dropdown-divider-margin-y: #{$dropdown-divider-margin-y};
--dropdown-box-shadow: #{$dropdown-box-shadow};
--dropdown-link-color: #{$dropdown-link-color};
--dropdown-link-hover-color: #{$dropdown-link-hover-color};
--dropdown-link-hover-bg: #{$dropdown-link-hover-bg};
--dropdown-link-active-color: #{$dropdown-link-active-color};
--dropdown-link-active-bg: #{$dropdown-link-active-bg};
--dropdown-link-disabled-color: #{$dropdown-link-disabled-color};
--dropdown-item-padding-x: #{$dropdown-item-padding-x};
--dropdown-item-padding-y: #{$dropdown-item-padding-y};
--dropdown-header-color: #{$dropdown-header-color};
--dropdown-header-padding-x: #{$dropdown-header-padding-x};
--dropdown-header-padding-y: #{$dropdown-header-padding-y};
// scss-docs-end dropdown-css-vars
position: absolute;
z-index: var(--dropdown-zindex);
display: none; // none by default, but block on "open" of the menu
min-width: var(--dropdown-min-width);
padding: var(--dropdown-padding-y) var(--dropdown-padding-x);
margin: 0; // Override default margin of ul
@include font-size(var(--dropdown-font-size));
color: var(--dropdown-color);
text-align: start; // Ensures proper alignment if parent has it changed (e.g., modal footer)
list-style: none;
background-color: var(--dropdown-bg);
background-clip: padding-box;
@include border-radius(var(--dropdown-border-radius));
@include box-shadow(var(--dropdown-box-shadow));
&[data-bs-popper],
&[data-tblr-popper] {
top: 100%;
inset-inline-start: 0;
margin-top: var(--dropdown-spacer);
}
@if $dropdown-padding-y == 0 {
> .dropdown-item:first-child,
> li:first-child .dropdown-item {
@include border-top-radius(var(--dropdown-inner-border-radius));
}
> .dropdown-item:last-child,
> li:last-child .dropdown-item {
@include border-bottom-radius(var(--dropdown-inner-border-radius));
}
}
}
// scss-docs-start responsive-breakpoints
// We deliberately hardcode the `bs-` prefix because we check
// this custom property in JS to determine Popper's positioning
@each $breakpoint in map.keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-start {
--bs-position: start;
&[data-bs-popper],
&[data-tblr-popper] {
inset-inline-end: auto;
inset-inline-start: 0;
}
}
.dropdown-menu#{$infix}-end {
--bs-position: end;
&[data-bs-popper],
&[data-tblr-popper] {
inset-inline-end: 0;
inset-inline-start: auto;
}
}
}
}
// scss-docs-end responsive-breakpoints
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// Just add .dropup after the standard .dropdown class and you're set.
.dropup {
.dropdown-menu[data-bs-popper],
.dropdown-menu[data-tblr-popper] {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: var(--dropdown-spacer);
}
.dropdown-toggle {
@include caret(up);
}
}
.dropend {
.dropdown-menu[data-bs-popper],
.dropdown-menu[data-tblr-popper] {
top: 0;
inset-inline-end: auto;
inset-inline-start: 100%;
margin-top: 0;
margin-inline-start: var(--dropdown-spacer);
}
.dropdown-toggle {
@include caret(end);
&::after {
vertical-align: 0;
}
}
}
.dropstart {
.dropdown-menu[data-bs-popper],
.dropdown-menu[data-tblr-popper] {
top: 0;
inset-inline-end: 100%;
inset-inline-start: auto;
margin-top: 0;
margin-inline-end: var(--dropdown-spacer);
}
.dropdown-toggle {
@include caret(start);
&::before {
vertical-align: 0;
}
}
}
// Dividers (basically an `
`) within the dropdown
.dropdown-divider {
height: 0;
margin: var(--dropdown-divider-margin-y) 0;
overflow: hidden;
border-top: 1px solid var(--dropdown-divider-bg);
opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element
}
// Links, buttons, and more within the dropdown menu
//
// `