mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
449 lines
8.7 KiB
SCSS
449 lines
8.7 KiB
SCSS
@use 'sass:map';
|
|
@use 'sass:math';
|
|
|
|
@mixin parent-link {
|
|
.navbar-nav .nav-item .nav-link[data-bs-toggle] {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
@mixin child-link {
|
|
.collapse .nav .nav-item .nav-link {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
@mixin sidenav-open {
|
|
body[data-sidenav-show],
|
|
body[data-sidenav-pinned] {
|
|
.sidenav {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin sidenav-closed {
|
|
body[data-sidenav-hide],
|
|
body[data-sidenav-hidden] {
|
|
.sidenav {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin sidenav-pinned {
|
|
body[data-sidenav-pinned] {
|
|
.sidenav {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin sidenav-show {
|
|
body[data-sidenav-show] {
|
|
.sidenav {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin sidenav-hide {
|
|
body[data-sidenav-hide] {
|
|
.sidenav {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin sidenav-peek {
|
|
.g-sidenav-show:not(.g-sidenav-pinned) {
|
|
.sidenav {
|
|
@content;
|
|
}
|
|
}
|
|
}
|
|
|
|
.sidenav {
|
|
position: fixed;
|
|
top: 0;
|
|
bottom: 0;
|
|
left: 0;
|
|
z-index: 1050;
|
|
display: block;
|
|
width: 100%;
|
|
max-width: $sidenav-width-closed;
|
|
padding-top: 0;
|
|
padding-right: 0;
|
|
padding-left: 0;
|
|
background-color: var(--nbx-sidebar-bg);
|
|
border-right: 1px solid $border-color;
|
|
transition: $transition-100ms-ease-in-out;
|
|
|
|
// Media fixes for mobile resolutions.
|
|
@include media-breakpoint-down(lg) {
|
|
transform: translateX(-$sidenav-width-closed);
|
|
|
|
+ .content-container[class] {
|
|
margin-left: 0;
|
|
}
|
|
|
|
.profile-button-container[class] {
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
.profile-button-container {
|
|
display: none;
|
|
padding: $sidenav-link-spacing-y $sidenav-link-spacing-x;
|
|
}
|
|
|
|
+ .content-container {
|
|
margin-left: $sidenav-width-closed;
|
|
transition: $transition-100ms-ease-in-out;
|
|
}
|
|
|
|
// Navbar brand
|
|
.sidenav-brand {
|
|
margin-right: 0;
|
|
transition: opacity 0.1s ease-in-out;
|
|
}
|
|
|
|
.sidenav-brand-icon {
|
|
transition: opacity 0.1s ease-in-out;
|
|
}
|
|
|
|
.sidenav-inner {
|
|
padding-right: $sidenav-spacing-x;
|
|
padding-left: $sidenav-spacing-x;
|
|
@include media-breakpoint-up(md) {
|
|
padding-right: 0;
|
|
padding-left: 0;
|
|
}
|
|
}
|
|
|
|
.sidenav-brand-img,
|
|
.sidenav-brand > img {
|
|
max-width: 100%;
|
|
max-height: calc(#{$sidenav-width-open} - 1rem);
|
|
}
|
|
|
|
.navbar-heading {
|
|
padding-top: $nav-link-padding-y;
|
|
padding-bottom: $nav-link-padding-y;
|
|
font-size: $font-size-xs;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.04em;
|
|
}
|
|
|
|
.sidenav-header {
|
|
position: relative;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
height: 78px;
|
|
padding: $spacer;
|
|
transition: $transition-100ms-ease-in-out;
|
|
}
|
|
|
|
.sidenav-toggle {
|
|
// The sidenav toggle's default state is "hidden". Because modifying the `display` property
|
|
// isn't ideal for smooth transitions, combine opacity 0 (transparent) and position absolute
|
|
// to yield a similar result.
|
|
position: absolute;
|
|
display: inline-block;
|
|
opacity: 0;
|
|
// The transition itself is largely irrelevant, but CSS needs *something* to transition in
|
|
// order to apply a delay.
|
|
transition: opacity 10ms ease-in-out;
|
|
// Offset the transition delay so the icon isn't visible during the logo transition.
|
|
transition-delay: 0.1s;
|
|
}
|
|
|
|
.sidenav-collapse {
|
|
display: flex;
|
|
flex: 1;
|
|
flex-direction: column;
|
|
align-items: stretch;
|
|
padding-right: $sidenav-spacing-x;
|
|
padding-left: $sidenav-spacing-x;
|
|
margin-right: -$sidenav-spacing-x;
|
|
margin-left: -$sidenav-spacing-x;
|
|
|
|
> * {
|
|
min-width: 100%;
|
|
}
|
|
|
|
@include media-breakpoint-up(md) {
|
|
margin-right: 0;
|
|
margin-left: 0;
|
|
}
|
|
}
|
|
|
|
.nav-group-header {
|
|
padding: math.div($sidenav-link-spacing-y, 2) $sidenav-link-spacing-x;
|
|
margin-top: 0.5rem;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
// Child Link nav-item
|
|
.nav .nav-item {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
|
|
&.no-buttons {
|
|
// When there are no buttons, don't extend to the full width of the sidenav.
|
|
padding-right: $spacer * 5;
|
|
}
|
|
}
|
|
|
|
@include child-link() {
|
|
width: 100%;
|
|
padding-top: math.div($sidenav-link-spacing-y, 2);
|
|
padding-right: map.get($spacers, 1);
|
|
padding-bottom: math.div($sidenav-link-spacing-y, 2);
|
|
padding-left: $sidenav-link-spacing-x;
|
|
margin-top: 0;
|
|
margin-bottom: 0;
|
|
border-top-right-radius: $border-radius;
|
|
border-bottom-right-radius: $border-radius;
|
|
|
|
.sidenav-mini-icon {
|
|
width: $sidenav-link-spacing-x;
|
|
text-align: center;
|
|
transition: $transition-100ms-ease-in-out;
|
|
}
|
|
}
|
|
|
|
@include parent-link() {
|
|
width: unset;
|
|
height: 100%;
|
|
padding-left: math.div($sidenav-link-spacing-x, 2);
|
|
font-weight: $font-weight-bold;
|
|
color: var(--nbx-sidenav-parent-color);
|
|
|
|
&:after {
|
|
display: inline-block;
|
|
margin-left: auto;
|
|
/* stylelint-disable */
|
|
font-family: 'Material Design Icons';
|
|
/* stylelint-enable */
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
font-variant: normal;
|
|
color: $text-muted;
|
|
text-rendering: auto;
|
|
-webkit-font-smoothing: antialiased;
|
|
content: '\f0142';
|
|
transition: $transition-100ms-ease-in-out;
|
|
}
|
|
|
|
// Expanded
|
|
&[aria-expanded='true'] {
|
|
&.active:after {
|
|
color: $accordion-button-active-color;
|
|
}
|
|
&:after {
|
|
color: $primary;
|
|
transform: rotate(90deg);
|
|
}
|
|
}
|
|
|
|
.nav-link-text {
|
|
padding-left: 0.25rem;
|
|
transition: $transition-100ms-ease-in-out;
|
|
}
|
|
}
|
|
|
|
.navbar-nav {
|
|
flex-direction: column;
|
|
margin-right: -$sidenav-spacing-x;
|
|
margin-left: -$sidenav-spacing-x;
|
|
|
|
.nav-item {
|
|
margin-top: 2px;
|
|
|
|
&.disabled {
|
|
cursor: not-allowed;
|
|
opacity: 0.8;
|
|
}
|
|
|
|
// All Links
|
|
.nav-link {
|
|
position: relative;
|
|
display: flex;
|
|
align-items: center;
|
|
width: 100%;
|
|
padding: $sidenav-link-spacing-y $sidenav-link-spacing-x;
|
|
font-size: $font-size-sm;
|
|
color: var(--nbx-sidenav-link-color);
|
|
white-space: nowrap;
|
|
transition-duration: 0ms;
|
|
|
|
&.active {
|
|
background-color: var(--nbx-sidebar-link-active-bg);
|
|
}
|
|
|
|
&:hover:not(.active) {
|
|
color: var(--nbx-body-color);
|
|
background-color: var(--nbx-sidebar-link-hover-bg);
|
|
}
|
|
|
|
// Icon
|
|
> i {
|
|
min-width: $sidenav-icon-width;
|
|
font-size: calc(45px / 2);
|
|
text-align: center;
|
|
}
|
|
}
|
|
}
|
|
|
|
.nav-group-label {
|
|
display: block;
|
|
font-size: $font-size-xs;
|
|
font-weight: $font-weight-bold;
|
|
// color: $secondary;
|
|
color: var(--nbx-sidenav-group-color);
|
|
text-transform: uppercase;
|
|
white-space: nowrap;
|
|
}
|
|
}
|
|
}
|
|
|
|
@include sidenav-pinned() {
|
|
.sidenav-toggle-icon {
|
|
color: var(--nbx-sidenav-pin-color);
|
|
transform: rotate(90deg);
|
|
}
|
|
@include media-breakpoint-up(xl) {
|
|
+ .content-container {
|
|
margin-left: $sidenav-width-open;
|
|
}
|
|
}
|
|
}
|
|
|
|
@include sidenav-peek() {
|
|
.sidenav-toggle-icon {
|
|
transform: rotate(0deg);
|
|
}
|
|
}
|
|
|
|
@include sidenav-open() {
|
|
max-width: $sidenav-width-open;
|
|
|
|
.sidenav-brand,
|
|
.navbar-heading {
|
|
display: block;
|
|
}
|
|
|
|
.sidenav-brand {
|
|
opacity: 1;
|
|
transform: translateX(0);
|
|
}
|
|
|
|
.sidenav-brand-icon {
|
|
position: absolute;
|
|
opacity: 0;
|
|
}
|
|
|
|
@include media-breakpoint-down(lg) {
|
|
transform: translateX(0);
|
|
}
|
|
}
|
|
|
|
@include sidenav-closed() {
|
|
.sidenav-header {
|
|
padding: $spacer * 0.5;
|
|
}
|
|
|
|
.sidenav-brand {
|
|
position: absolute;
|
|
opacity: 0;
|
|
}
|
|
|
|
.sidenav-brand-icon {
|
|
opacity: 1;
|
|
}
|
|
|
|
.sidenav-toggle {
|
|
// Immediately hide the toggle when the sidenav is closed, so it doesn't linger and overlap
|
|
// with the logo elements.
|
|
opacity: 0;
|
|
position: absolute;
|
|
transition: unset;
|
|
transition-delay: 0ms;
|
|
}
|
|
|
|
.navbar-nav > .nav-item {
|
|
> .nav-link {
|
|
&:after {
|
|
content: '';
|
|
}
|
|
}
|
|
}
|
|
|
|
.nav-item .collapse {
|
|
display: none;
|
|
}
|
|
|
|
.nav-link-text {
|
|
opacity: 0;
|
|
}
|
|
|
|
@include parent-link() {
|
|
&.active {
|
|
margin-right: 0;
|
|
margin-left: 0;
|
|
border-radius: unset;
|
|
}
|
|
}
|
|
}
|
|
|
|
@include sidenav-show() {
|
|
.sidenav-brand {
|
|
display: block;
|
|
}
|
|
|
|
.nav-item .collapse {
|
|
height: auto;
|
|
transition: $transition-100ms-ease-in-out;
|
|
}
|
|
|
|
.nav-item .nav-link .nav-link-text {
|
|
opacity: 1;
|
|
}
|
|
|
|
.nav-item .sidenav-mini-icon {
|
|
opacity: 0;
|
|
}
|
|
|
|
@include media-breakpoint-up(lg) {
|
|
.sidenav-toggle {
|
|
position: relative;
|
|
opacity: 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
.simplebar-track.simplebar-vertical {
|
|
right: 0;
|
|
width: 6px;
|
|
background-color: transparent;
|
|
|
|
.simplebar-scrollbar {
|
|
transition: none;
|
|
|
|
&:before {
|
|
right: 0;
|
|
width: 3px;
|
|
background: var(--nbx-sidebar-scroll);
|
|
border-radius: $border-radius;
|
|
}
|
|
}
|
|
|
|
&.simplebar-hover .simplebar-scrollbar:before {
|
|
width: 5px;
|
|
}
|
|
}
|