rsuite
Version:
A suite of react components
355 lines (299 loc) • 6.91 kB
text/less
@import '../../styles/common.less';
@import '../../styles/mixins/menu.less';
@import '../../styles/mixins/combobox.less';
@import 'mixin.less';
@import '../../Button/styles/index.less';
//
// Dropdown menus
// --------------------------------------------------
.rs-dropdown-toggle-caret {
.combobox-indicator-icon();
}
// The dropdown wrapper (div)
.rs-dropdown {
position: relative;
display: inline-block;
vertical-align: middle; // Make sure dropdown vertical alignment with button,button group and so on.
&-disabled &-toggle.rs-btn {
cursor: @cursor-disabled ;
box-shadow: none;
&.rs-btn-subtle {
&,
&:focus,
&:active {
color: var(--rs-btn-subtle-disabled-text);
background: none;
}
}
&.rs-btn-primary {
&,
&:focus,
&:active {
opacity: 0.3;
background-color: var(--rs-btn-primary-bg);
}
}
&.rs-btn-link {
&,
&:focus,
&:active {
opacity: 0.3;
text-decoration: none;
}
}
&.rs-btn-ghost {
&,
&:focus,
&:active {
opacity: 0.3;
}
}
.rs-ripple-pond {
display: none ;
}
}
}
.rs-dropdown-toggle {
.dropdown-toggle-size();
&,
&.rs-btn {
// Force set style even if has `.btn`.
.dropdown-toggle();
display: inline-flex;
align-items: center;
gap: 6px;
}
&.rs-dropdown-toggle-no-caret {
padding-right: @padding-x;
}
}
// The dropdown menu (ul)
.rs-dropdown-menu {
margin: 0; // override default ul
list-style: none;
font-size: @font-size-base;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
background-color: var(--rs-bg-overlay);
border-radius: @dropdown-menu-radius;
padding: @dropdown-menu-padding-y 0;
outline: 0;
&:focus-visible {
.focus-ring();
}
.rs-dropdown & {
position: absolute;
// dropdown-menu zindex value is greater than dropdown-toggle
z-index: @zindex-dropdown + 1;
float: left;
box-shadow: var(--rs-dropdown-shadow);
outline: none;
.high-contrast-mode({
border: 1px solid var(--rs-border-primary);
});
}
&[hidden] {
display: none;
}
}
// Links within the dropdown menu
.rs-dropdown-item {
display: flex;
align-items: center;
width: 100%;
gap: 6px;
padding: @dropdown-item-padding-y @dropdown-item-padding-x;
clear: both;
font-weight: normal;
line-height: @line-height-base;
color: var(--rs-text-primary);
white-space: nowrap; // prevent links from randomly breaking onto new lines
cursor: pointer; //fixed link has not [href] style
.reset-link-text-decoration(none);
&-content {
flex: 1;
}
.rs-dropdown-item-shortcut {
margin-inline-start: 20px;
border: none;
}
> .rs-icon {
width: @font-size-base;
text-align: center;
}
&&-active {
outline: 0;
font-weight: bold;
&,
&:hover,
&:focus {
color: var(--rs-dropdown-item-text-active);
background-color: var(--rs-dropdown-item-bg-active);
.rs-text {
color: var(--rs-dropdown-item-text-active);
}
}
}
// Hover/Focus state
&:focus-visible,
&&-focus {
.menuitem-active();
}
&:focus {
outline: 0;
}
// Disabled state
//
// Gray out text and ensure the hover/focus state remains gray
&-disabled {
color: var(--rs-text-disabled);
cursor: @cursor-disabled;
.rs-text {
color: var(--rs-text-disabled);
}
// Nuke hover/focus effects
&:hover,
&:focus {
text-decoration: none;
background-color: transparent;
background-image: none; // Remove CSS gradient
}
}
}
.rs-dropdown-item-divider {
.nav-divider(var(--rs-dropdown-divider));
}
// The dropdown submenu
.rs-dropdown-item-submenu {
position: relative;
&:hover > .rs-dropdown-item-toggle {
.menuitem-active();
}
&.rs-dropdown-item {
position: relative;
> .rs-dropdown-item-toggle {
.rs-dropdown-menu-toggle-icon {
position: absolute;
top: 11px;
margin: 0;
}
}
> .rs-dropdown-menu {
position: absolute;
top: -@dropdown-menu-padding-y;
}
}
// Set submenu icon
.rs-dropdown-item& {
padding: 0;
.rs-dropdown-item-toggle {
padding: @dropdown-item-padding-y @dropdown-item-padding-x;
padding-right: @dropdown-item-padding-x+ @dropdown-item-submenu-icon-angle-spacing+
@dropdown-item-submenu-icon-angle-width;
}
.rs-dropdown-menu-toggle-icon {
right: @dropdown-caret-icon-padding-horizontal;
}
}
.rs-dropdown-menu {
left: 100%;
&[data-direction='start'] {
left: unset;
right: 100%;
}
}
// Open
&.rs-dropdown-item-open > .rs-dropdown-menu {
//use display table to fix-content
display: table;
animation-name: slideUpIn;
animation-play-state: running;
}
}
// Active state
.rs-dropdown-menu > .rs-dropdown-menu-item-focus {
outline: 0;
background-color: var(--rs-dropdown-item-bg-active);
&:hover,
&:focus {
.menuitem-active();
}
}
// Open state for the dropdown
.rs-dropdown-open {
> .rs-dropdown-menu {
animation-play-state: running;
}
// Show the menu
&.rs-dropdown-placement-top-start,
&.rs-dropdown-placement-top-end {
> .rs-dropdown-menu {
bottom: 100%;
}
}
&.rs-dropdown-placement-left-start,
&.rs-dropdown-placement-left-end {
> .rs-dropdown-menu {
right: 100%;
}
}
&.rs-dropdown-placement-right-start,
&.rs-dropdown-placement-right-end {
> .rs-dropdown-menu {
left: 100%;
}
}
&.rs-dropdown-placement-bottom-start,
&.rs-dropdown-placement-bottom-end {
> .rs-dropdown-menu {
top: 100%;
}
}
&.rs-dropdown-placement-top-start,
&.rs-dropdown-placement-bottom-start {
> .rs-dropdown-menu {
left: 0;
}
}
&.rs-dropdown-placement-top-end,
&.rs-dropdown-placement-bottom-end {
> .rs-dropdown-menu {
right: 0;
}
}
&.rs-dropdown-placement-left-start,
&.rs-dropdown-placement-right-start {
> .rs-dropdown-menu {
top: 0;
}
}
&.rs-dropdown-placement-right-end,
&.rs-dropdown-placement-left-end {
> .rs-dropdown-menu {
bottom: 0;
}
}
// Remove the outline when :focus is triggered
> a {
outline: 0;
}
}
// Dropdown section headers
.rs-dropdown-header {
display: block;
padding: @dropdown-item-padding-y @dropdown-item-padding-x;
line-height: @line-height-base;
color: var(--rs-dropdown-header-text);
border-bottom: 1px solid @dropdown-divider-bg;
white-space: nowrap; // as with > li > a
}
// Opacity not working in Safari,so remove .
@keyframes slideUpIn {
0% {
transform-origin: 0% 0%;
transform: scaleY(0.8);
}
100% {
transform-origin: 0% 0%;
transform: scaleY(1);
}
}