@use "@core-scss/base/placeholders" as *; @use "@core-scss/template/placeholders" as *; @use "@layouts/styles/mixins" as layoutsMixins; @use "@configured-variables" as variables; @use "@core-scss/base/mixins" as mixins; @use "vuetify/lib/styles/tools/states" as vuetifyStates; .layout-nav-type-vertical { // 👉 Layout Vertical nav .layout-vertical-nav { $sl-layout-nav-type-vertical: &; @extend %nav; @at-root { // â„šī¸ Add styles for collapsed vertical nav .layout-vertical-nav-collapsed#{$sl-layout-nav-type-vertical}.hovered { @include mixins.elevation(6); } } background-color: variables.$vertical-nav-background-color; // 👉 Nav header .nav-header { overflow: hidden; padding: variables.$vertical-nav-header-padding; margin-inline: variables.$vertical-nav-header-inline-spacing; min-block-size: variables.$vertical-nav-header-height; // TEMPLATE: Check if we need to move this to master .app-logo { flex-shrink: 0; transition: transform 0.25s ease-in-out; @at-root { // Move logo a bit to align center with the icons in vertical nav mini variant .layout-vertical-nav-collapsed#{$sl-layout-nav-type-vertical}:not(.hovered) .nav-header .app-logo { transform: translateX(variables.$vertical-nav-header-logo-translate-x-when-vertical-nav-mini); @include layoutsMixins.rtl { transform: translateX(-(variables.$vertical-nav-header-logo-translate-x-when-vertical-nav-mini)); } } } } .app-title { margin-inline-start: variables.$vertical-nav-header-logo-title-spacing; } .header-action { @extend %nav-header-action; } } // 👉 Nav items shadow .vertical-nav-items-shadow { position: absolute; z-index: 1; background: linear-gradient( rgb(#{variables.$vertical-nav-background-color-rgb}) 5%, rgba(#{variables.$vertical-nav-background-color-rgb}, 75%) 45%, rgba(#{variables.$vertical-nav-background-color-rgb}, 20%) 80%, transparent ); block-size: 55px; inline-size: 100%; inset-block-start: calc(#{variables.$vertical-nav-header-height} - 2px); opacity: 0; pointer-events: none; transition: opacity 0.15s ease-in-out; will-change: opacity; @include layoutsMixins.rtl { transform: translateX(8px); } } &.scrolled { .vertical-nav-items-shadow { opacity: 1; } } .ps__rail-y { // â„šī¸ Setting z-index: 1 will make perfect scrollbar thumb appear on top of vertical nav items shadow z-index: 1; } // 👉 Nav section title .nav-section-title { @extend %vertical-nav-item; @extend %vertical-nav-section-title; margin-block-end: variables.$vertical-nav-section-title-mb; &:not(:first-child) { margin-block-start: variables.$vertical-nav-section-title-mt; } .placeholder-icon { margin-inline: auto; } } // Nav item badge .nav-item-badge { @extend %vertical-nav-item-badge; } // 👉 Nav group & Link .nav-link, .nav-group { overflow: hidden; > :first-child { @extend %vertical-nav-item; @extend %vertical-nav-item-interactive; } .nav-item-icon { @extend %vertical-nav-items-icon; } &.disabled { opacity: var(--v-disabled-opacity); pointer-events: none; } } // 👉 Vertical nav link .nav-link { @extend %nav-link; > .router-link-exact-active { @extend %nav-link-active; } > a { // Adds before psudo element to style hover state @include mixins.before-pseudo; // Adds vuetify states @include vuetifyStates.states($active: false); } } // 👉 Vertical nav group .nav-group { // Reduce the size of icon if link/group is inside group .nav-group, .nav-link { .nav-item-icon { @extend %vertical-nav-items-nested-icon; } } // Hide icons after 2nd level & .nav-group { .nav-link, .nav-group { .nav-item-icon { @extend %vertical-nav-items-icon-after-2nd-level; } } } .nav-group-arrow { flex-shrink: 0; transform-origin: center; transition: transform variables.$vertical-nav-nav-group-arrow-transition-duration variables.$vertical-nav-nav-group-arrow-transition-timing-function; will-change: transform; } // Rotate arrow icon if group is opened &.open { > .nav-group-label .nav-group-arrow { transform: rotateZ(90deg); } } // Nav group label > :first-child { // Adds before psudo element to style hover state @include mixins.before-pseudo; // Adds vuetify states @include vuetifyStates.states($active: false); } // Active & open states for nav group label &.active, &.open { > :first-child { @extend %vertical-nav-group-open-active; } } } } } // SECTION: Transitions .vertical-nav-section-title-enter-active, .vertical-nav-section-title-leave-active { transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; } .vertical-nav-section-title-enter-from, .vertical-nav-section-title-leave-to { opacity: 0; transform: translateX(15px); @include layoutsMixins.rtl { transform: translateX(-15px); } } .transition-slide-x-enter-active, .transition-slide-x-leave-active { transition: opacity 0.1s ease-in-out, transform 0.12s ease-in-out; } .transition-slide-x-enter-from, .transition-slide-x-leave-to { opacity: 0; transform: translateX(-15px); @include layoutsMixins.rtl { transform: translateX(15px); } } .vertical-nav-app-title-enter-active, .vertical-nav-app-title-leave-active { transition: opacity 0.1s ease-in-out, transform 0.12s ease-in-out; } .vertical-nav-app-title-enter-from, .vertical-nav-app-title-leave-to { opacity: 0; transform: translateX(-15px); @include layoutsMixins.rtl { transform: translateX(15px); } } // !SECTION