bootstrap-less-port
Version:
A Less port of Bootstrap v4
476 lines (413 loc) • 13.8 kB
text/less
// Contents
//
// Navbar
// Navbar brand
// Navbar nav
// Navbar text
// Navbar divider
// Responsive navbar
// Navbar position
// Navbar themes
// Navbar
//
// Provide a static navbar from which we expand to create full-width, fixed, and
// other navbar variations.
// LESS PORT: Because of the way `:extend()` works in Less (and the workaround we’re using to
// emulate Sass’ placeholder selectors) we need to include the selectors that extend the
// placeholders at the root. Then `&:extend(<placeholder> all)` will attach the selectors to every
// instance of the placeholder.
.container,
.container-fluid {
&:extend(\%container-flex-properties all);
}
.navbar {
position: relative;
display: flex;
flex-wrap: wrap; // allow us to do the line break for collapsing content
align-items: center;
justify-content: space-between; // space out brand from logo
padding: @navbar-padding-y @navbar-padding-x;
// Because flex properties aren't inherited, we need to redeclare these first
// few properties so that content nested within behave properly.
// LESS PORT: Unfortunately we have to use an actual selector here in order to be able to
// `:extend()` it later. This means that the selector is output in the compiled CSS, creating a
// small disparity between the Less and Sass versions.
// LESS PORT: The `-@{breakpoint}` suffix is omitted from the selector here since it’s not needed
// with the `:extend()` workaround we’re using.
\%container-flex-properties {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
}
// LESS PORT: Because of the way `:extend()` works in Less (and the workaround we’re using to
// emulate Sass’ placeholder selectors) we include this selector at the root, instead. (We also
// omit the `-@{breakpoint}` suffix since it’s not needed.)
// .container,
// .container-fluid {
// &:extend(\%container-flex-properties);
// }
// LESS PORT: Since we `&:extend(.container-fluid all)` in `_grid.less` we don’t need to output
// the container-max-width selectors here. Using the `all` means the container-max-width
// selectors will already be attached to all instances of `.container-fluid`.
// each(@container-max-widths, #(@container-max-width, @breakpoint) {
// // LESS PORT: A variable is required here to do the selector interpolation, since an
// // expression cannot be interpolated like in the Sass version.
// @infix: breakpoint-infix(@breakpoint, @container-max-widths);
// // LESS PORT: The Sass version actually uses `> .container` here but that doesn’t seem to
// // match the output CSS, so we‘re omitting it.
// .container@{infix} {
// &:extend(.navbar \%container-flex-properties);
// }
// });
}
// Navbar brand
//
// Used for brand, project, or site names.
.navbar-brand {
display: inline-block;
padding-top: @navbar-brand-padding-y;
padding-bottom: @navbar-brand-padding-y;
margin-right: @navbar-padding-x;
#font-size(@navbar-brand-font-size);
line-height: inherit;
white-space: nowrap;
#hover-focus({
text-decoration: none;
});
}
// Navbar nav
//
// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
.navbar-nav {
display: flex;
flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
padding-left: 0;
margin-bottom: 0;
list-style: none;
.nav-link {
padding-right: 0;
padding-left: 0;
}
.dropdown-menu {
position: static;
float: none;
}
}
// Navbar text
//
//
.navbar-text {
display: inline-block;
padding-top: @nav-link-padding-y;
padding-bottom: @nav-link-padding-y;
}
// Responsive navbar
//
// Custom styles for responsive collapsing and toggling of navbar contents.
// Powered by the collapse Bootstrap JavaScript plugin.
// When collapsed, prevent the toggleable navbar contents from appearing in
// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
// on the `.navbar` parent.
.navbar-collapse {
flex-basis: 100%;
flex-grow: 1;
// For always expanded or extra full navbars, ensure content aligns itself
// properly vertically. Can be easily overridden with flex utilities.
align-items: center;
}
// Button for toggling the navbar when in its collapsed state
.navbar-toggler {
padding: @navbar-toggler-padding-y @navbar-toggler-padding-x;
#font-size(@navbar-toggler-font-size);
line-height: 1;
background-color: transparent; // remove default button style
border: @border-width solid transparent; // remove default button style
#border-radius(@navbar-toggler-border-radius);
#hover-focus({
text-decoration: none;
});
}
// Keep as a separate element so folks can easily override it with another icon
// or image file as needed.
.navbar-toggler-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
content: "";
background: 50% ~"/" 100% 100% no-repeat;
}
.navbar-nav-scroll {
max-height: @navbar-nav-scroll-max-height;
overflow-y: auto;
}
// Generate series of `.navbar-expand-*` responsive classes for configuring
// where your navbar collapses.
//.navbar-expand {
// @each $breakpoint in map-keys($grid-breakpoints) {
// $next: breakpoint-next($breakpoint, $grid-breakpoints);
// $infix: breakpoint-infix($next, $grid-breakpoints);
//
// &#{$infix} {
// @include media-breakpoint-down($breakpoint) {
// %container-navbar-expand-#{$breakpoint} {
// padding-right: 0;
// padding-left: 0;
// }
//
// > .container,
// > .container-fluid {
// @extend %container-navbar-expand-#{$breakpoint};
// }
//
// @each $size, $container-max-width in $container-max-widths {
// > .container#{breakpoint-infix($size, $container-max-widths)} {
// @extend %container-navbar-expand-#{$breakpoint};
// }
// }
// }
//
// @include media-breakpoint-up($next) {
// flex-flow: row nowrap;
// justify-content: flex-start;
//
// .navbar-nav {
// flex-direction: row;
//
// .dropdown-menu {
// position: absolute;
// }
//
// .nav-link {
// padding-right: $navbar-nav-link-padding-x;
// padding-left: $navbar-nav-link-padding-x;
// }
// }
//
// // For nesting containers, have to redeclare for alignment purposes
// %container-nesting-#{$breakpoint} {
// flex-wrap: nowrap;
// }
//
// > .container,
// > .container-fluid {
// @extend %container-nesting-#{$breakpoint};
// }
//
// @each $size, $container-max-width in $container-max-widths {
// > .container#{breakpoint-infix($size, $container-max-widths)} {
// @extend %container-nesting-#{$breakpoint};
// }
// }
//
// .navbar-nav-scroll {
// overflow: visible;
// }
//
// .navbar-collapse {
// display: flex !important; // stylelint-disable-line declaration-no-important
//
// // Changes flex-bases to auto because of an IE10 bug
// flex-basis: auto;
// }
//
// .navbar-toggler {
// display: none;
// }
// }
// }
// }
//}
// LESS PORT: Because of the way `:extend()` works in Less (and the workaround we’re using to
// emulate Sass’ placeholder selectors) we need to include the selectors that extend the
// placeholders at the root. Then `&:extend(<placeholder> all)` will attach the selectors to every
// instance of the placeholder.
> .container,
> .container-fluid {
&:extend(\%container-navbar-expand all);
&:extend(\%container-nesting all);
}
each(map-keys(@grid-breakpoints), #(@breakpoint) {
.navbar-expand {
@next: breakpoint-next(@breakpoint, @grid-breakpoints);
@infix: breakpoint-infix(@next, @grid-breakpoints);
&@{infix} {
#media-breakpoint-down(@breakpoint, {
// LESS PORT: Unfortunately we have to use an actual selector here in order to be able
// to `:extend()` it later. This means that the selector is output in the compiled CSS,
// creating a small disparity between the Less and Sass versions.
// LESS PORT: The `-@{breakpoint}` suffix is omitted from the selector here since it’s
// not needed with the `:extend()` workaround we’re using.
> \%container-navbar-expand {
padding-right: 0;
padding-left: 0;
}
// LESS PORT: Because of the way `:extend()` works in Less (and the workaround we’re
// using to emulate Sass’ placeholder selectors) we include this selector at the root,
// instead. (We also omit the `-@{breakpoint}` suffix since it’s not needed.)
// > .container,
// > .container-fluid {
// &:extend(\%container-navbar-expand-@{breakpoint});
// }
// LESS PORT: Since we `&:extend(.container-fluid all)` in `_grid.less` we don’t need to
// output the container-max-width selectors here. Using the `all` means the
// container-max-width selectors will already be attached to all instances of
// `.container-fluid`.
// each(@container-max-widths, #(@container-max-width, @size) {
// // LESS PORT: A variable is required here to do the selector interpolation, since an
// // expression cannot be interpolated like in the Sass version.
// @infix: breakpoint-infix(@size, @container-max-widths);
// > .container@{infix} {
// &:extend(\%container-navbar-expand-@{breakpoint});
// }
// });
});
#media-breakpoint-up(@next, {
flex-flow: row nowrap;
justify-content: flex-start;
.navbar-nav {
flex-direction: row;
.dropdown-menu {
position: absolute;
}
.nav-link {
padding-right: @navbar-nav-link-padding-x;
padding-left: @navbar-nav-link-padding-x;
}
}
// For nesting containers, have to redeclare for alignment purposes
// LESS PORT: Unfortunately we have to use an actual selector here in order to be able
// to `:extend()` it later. This means that the selector is output in the compiled CSS,
// creating a small disparity between the Less and Sass versions.
// LESS PORT: The `-@{breakpoint}` suffix is omitted from the selector here since it’s
// not needed with the `:extend()` workaround we’re using. We also have to prefix with
// a `>` so that the immediate decendant selector will be included when we `:extend()`.
> \%container-nesting {
flex-wrap: nowrap;
}
// LESS PORT: The `-@{breakpoint}` suffix is omitted from the since the
// \%container-nesting-@{breakpoint} {
// flex-wrap: nowrap;
// }
// LESS PORT: Because of the way `:extend()` works in Less (and the workaround we’re
// using to emulate Sass’ placeholder selectors) we include this selector at the root,
// instead. (We also omit the `-@{breakpoint}` suffix since it’s not needed.)
// > .container,
// > .container-fluid {
// &:extend(\%container-nesting-@{breakpoint});
// }
// LESS PORT: Since we `&:extend(.container-fluid all)` in `_grid.less` we don’t need to
// output the container-max-width selectors here. Using the `all` means the
// container-max-width selectors will already be attached to all instances of
// `.container-fluid`.
// each(@container-max-widths, #(@container-max-width, @size) {
// // LESS PORT: A variable is required here to do the selector interpolation, since an
// // expression cannot be interpolated like in the Sass version.
// @infix: breakpoint-infix(@size, @container-max-widths);
// > .container@{infix} {
// &:extend(\%container-nesting-@{breakpoint});
// }
// });
.navbar-nav-scroll {
overflow: visible;
}
.navbar-collapse {
display: flex ;
// Changes flex-bases to auto because of an IE10 bug
flex-basis: auto;
}
.navbar-toggler {
display: none;
}
});
}
}
});
// Navbar themes
//
// Styles for switching between navbars with light or dark background.
// Dark links against a light background
.navbar-light {
.navbar-brand {
color: @navbar-light-brand-color;
#hover-focus({
color: @navbar-light-brand-hover-color;
});
}
.navbar-nav {
.nav-link {
color: @navbar-light-color;
#hover-focus({
color: @navbar-light-hover-color;
});
&.disabled {
color: @navbar-light-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: @navbar-light-active-color;
}
}
.navbar-toggler {
color: @navbar-light-color;
border-color: @navbar-light-toggler-border-color;
}
.navbar-toggler-icon {
background-image: escape-svg(@navbar-light-toggler-icon-bg);
}
.navbar-text {
color: @navbar-light-color;
a {
color: @navbar-light-active-color;
#hover-focus({
color: @navbar-light-active-color;
});
}
}
}
// White links against a dark background
.navbar-dark {
.navbar-brand {
color: @navbar-dark-brand-color;
#hover-focus({
color: @navbar-dark-brand-hover-color;
});
}
.navbar-nav {
.nav-link {
color: @navbar-dark-color;
#hover-focus({
color: @navbar-dark-hover-color;
});
&.disabled {
color: @navbar-dark-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: @navbar-dark-active-color;
}
}
.navbar-toggler {
color: @navbar-dark-color;
border-color: @navbar-dark-toggler-border-color;
}
.navbar-toggler-icon {
background-image: escape-svg(@navbar-dark-toggler-icon-bg);
}
.navbar-text {
color: @navbar-dark-color;
a {
color: @navbar-dark-active-color;
#hover-focus({
color: @navbar-dark-active-color;
});
}
}
}