155 lines
4.1 KiB
SCSS
Raw Normal View History

2025-01-12 00:52:51 +08:00
$navbar-expand-breakpoint: if($bootstrap-version>=5, lg, sm) !default;
// bs4 navbars require .navbar-expand[-sm|-md|-lg|-xl], but bs3 navbars
// don't have them. This selector matches .navbar without .navbar-expand
// and defaults it to .navbar-expand-sm.
.navbar:not(.navbar-expand):not(.navbar-expand-sm):not(.navbar-expand-md):not(.navbar-expand-lg):not(.navbar-expand-xl) {
@extend .navbar-expand-#{$navbar-expand-breakpoint};
}
// Unfortunately the @extend above, combined with the @extend .nav-link below
// results in .navbar-expand's padding rules taking precedence over
// .nav-underline's padding rules (and unfortunately :where()/css-layers doesn't
// help here, so just re-apply the padding rules)
.navbar .nav.nav-underline {
--#{$prefix}navbar-nav-link-padding-x: 0;
}
.navbar:not(.fixed-bottom):not(.navbar-fixed-bottom) {
// Instead of exactly re-doing bs3's .navbar { margin-bottom }, set
// margin-top on each pane (so 'fill' panes can be flush with navbar)
& + div > .tab-content > .tab-pane {
--bslib-navbar-margin: #{$navbar-margin-bottom};
margin-top: var(--bslib-navbar-margin);
}
}
// Map BS3 navbar positioning to general utilities
.navbar-fixed-top {
@extend .fixed-top;
}
.navbar-fixed-bottom {
@extend .fixed-bottom;
}
.navbar-sticky-top {
@extend .sticky-top;
}
ul.nav.navbar-nav {
flex: 1;
-webkit-flex: 1;
&.navbar-right {
flex: unset;
-webkit-flex: unset;
display: flex;
display: -webkit-flex;
justify-content: flex-end;
-webkit-justify-content: flex-end;
}
}
// :where() lowers the specificity of the eventually @extend selector, which is
// important to make sure those selectors don't get an artificial specificity
// boost (e.g., we don't want `ul.nav.navbar-nav>li>a` to be more specific than
// `.nav-underline .nav-link`)
:where(ul.nav.navbar-nav > li) {
&:not(.dropdown) {
@extend .nav-item;
}
> a {
@extend .nav-link;
}
&.active, &.show {
> a {
color: var(--#{$prefix}navbar-active-color);
}
}
&.bslib-nav-item {
color: var(--#{$prefix}navbar-active-color);
}
}
.navbar {
// Defaults to null (and in that case, we don't want to define the CSS var)
@if $navbar-light-bg {
--bslib-navbar-default-bg: #{$navbar-light-bg};
}
@if $navbar-dark-bg {
--bslib-navbar-inverse-bg: #{$navbar-dark-bg};
}
// BS3 .navbar-default -> BS4 .navbar-light
&.navbar-default {
// Sets a variety of fg colors which are configurable via $navbar-light-* options
@extend .navbar-light;
background-color: var(--bslib-navbar-default-bg, var(--#{$prefix}light)) !important;
}
// BS3 .navbar-inverse -> BS4 .navbar-dark
&.navbar-inverse {
// Sets a variety of fg colors which are configurable via $navbar-dark-* options
@extend .navbar-dark;
background-color: var(--bslib-navbar-inverse-bg, var(--#{$prefix}dark)) !important;
// For BS5+ lean on emphasis-color
--bs-emphasis-color: white;
--bs-emphasis-color-rgb: 255, 255, 255;
}
}
$enable-dark-mode: false !default;
@if $enable-dark-mode {
@include color-mode(dark) {
.navbar.navbar-default {
background-color: var(--bslib-navbar-default-bg, var(--#{$prefix}dark)) !important;
}
}
}
// Implement bs3 navbar toggler; used in Rmd websites, i.e.
// https://github.com/rstudio/rmarkdown-website/blob/453e1802b32b5baf1c8a67f80947adcc53e49b7f/_navbar.html
.navbar-toggle {
@extend .navbar-toggler;
}
.navbar-toggle {
> .icon-bar {
display: none;
&:last-child {
@extend .navbar-toggler-icon;
}
}
}
// Make sure .navbar-toggle is right and center aligned when navbar is collapsed
@if $bootstrap-version>=5 {
@include media-breakpoint-down($navbar-expand-breakpoint) {
.navbar-header {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.navbar-toggle {
order: 2;
}
}
}
} @else {
// In BS4, media-breakpoint-down() does the _next_ breakpoint (xs->sm)
@include media-breakpoint-down(xs) {
.navbar-header {
width: 100%;
.navbar-toggle {
float: right;
}
}
}
}