Responsive layout with advanced sidebar menu built with SCSS and vanilla Javascript
A Pen by Mohamed Azouaoui on CodePen.
<div class="layout has-sidebar fixed-sidebar fixed-header"> | |
<aside id="sidebar" class="sidebar break-point-sm has-bg-image"> | |
<a id="btn-collapse" class="sidebar-collapser"><i class="ri-arrow-left-s-line"></i></a> | |
<div class="image-wrapper"> | |
<img src="assets/images/sidebar-bg.jpg" alt="sidebar background" /> | |
</div> | |
<div class="sidebar-layout"> | |
<div class="sidebar-header"> | |
<div class="pro-sidebar-logo"> | |
<div>P</div> | |
<h5>Pro Sidebar</h5> | |
</div> | |
</div> | |
<div class="sidebar-content"> | |
<nav class="menu open-current-submenu"> | |
<ul> | |
<li class="menu-header"><span> GENERAL </span></li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-vip-diamond-fill"></i> | |
</span> | |
<span class="menu-title">Components</span> | |
<span class="menu-suffix"> | |
<span class="badge primary">Hot</span> | |
</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Grid</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Layout</span> | |
</a> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-title">Forms</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Input</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Select</span> | |
</a> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-title">More</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">CheckBox</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Radio</span> | |
</a> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-title">Want more ?</span> | |
<span class="menu-suffix">🤔</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-prefix">🎉</span> | |
<span class="menu-title">You made it </span> | |
</a> | |
</li> | |
</ul> | |
</div> | |
</li> | |
</ul> | |
</div> | |
</li> | |
</ul> | |
</div> | |
</li> | |
</ul> | |
</div> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-bar-chart-2-fill"></i> | |
</span> | |
<span class="menu-title">Charts</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Pie chart</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Line chart</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Bar chart</span> | |
</a> | |
</li> | |
</ul> | |
</div> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-shopping-cart-fill"></i> | |
</span> | |
<span class="menu-title">E-commerce</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Products</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Orders</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">credit card</span> | |
</a> | |
</li> | |
</ul> | |
</div> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-global-fill"></i> | |
</span> | |
<span class="menu-title">Maps</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Google maps</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Open street map</span> | |
</a> | |
</li> | |
</ul> | |
</div> | |
</li> | |
<li class="menu-item sub-menu"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-paint-brush-fill"></i> | |
</span> | |
<span class="menu-title">Theme</span> | |
</a> | |
<div class="sub-menu-list"> | |
<ul> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Dark</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-title">Light</span> | |
</a> | |
</li> | |
</ul> | |
</div> | |
</li> | |
<li class="menu-header" style="padding-top: 20px"><span> EXTRA </span></li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-book-2-fill"></i> | |
</span> | |
<span class="menu-title">Documentation</span> | |
<span class="menu-suffix"> | |
<span class="badge secondary">Beta</span> | |
</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-calendar-fill"></i> | |
</span> | |
<span class="menu-title">Calendar</span> | |
</a> | |
</li> | |
<li class="menu-item"> | |
<a href="#"> | |
<span class="menu-icon"> | |
<i class="ri-service-fill"></i> | |
</span> | |
<span class="menu-title">Examples</span> | |
</a> | |
</li> | |
</ul> | |
</nav> | |
</div> | |
<div class="sidebar-footer"> | |
<div class="footer-box"> | |
<div> | |
<img | |
class="react-logo" | |
src="https://user-images.githubusercontent.com/25878302/213938106-ca8f0485-3f30-4861-9188-2920ed7ab284.png" | |
alt="react" | |
/> | |
</div> | |
<div style="padding: 0 10px"> | |
<span style="display: block; margin-bottom: 10px" | |
>Pro sidebar is also available as a react package | |
</span> | |
<div style="margin-bottom: 15px"> | |
<img | |
alt="preview badge" | |
src="https://img.shields.io/github/stars/azouaoui-med/react-pro-sidebar?style=social" | |
/> | |
</div> | |
<div> | |
<a href="https://github.com/azouaoui-med/react-pro-sidebar" target="_blank" | |
>Check it out!</a | |
> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
</aside> | |
<div id="overlay" class="overlay"></div> | |
<div class="layout"> | |
<main class="content"> | |
<div> | |
<a id="btn-toggle" href="#" class="sidebar-toggler break-point-sm"> | |
<i class="ri-menu-line ri-xl"></i> | |
</a> | |
<h1 style="margin-bottom: 0">Pro Sidebar</h1> | |
<span style="display: inline-block"> | |
Responsive layout with advanced sidebar menu built with SCSS and vanilla Javascript | |
</span> | |
<br /> | |
<span> | |
Full Code and documentation available on | |
<a href="https://github.com/azouaoui-med/pro-sidebar-template" target="_blank" | |
>Github</a | |
> | |
</span> | |
<div style="margin-top: 10px"> | |
<a href="https://github.com/azouaoui-med/pro-sidebar-template" target="_blank"> | |
<img | |
alt="GitHub stars" | |
src="https://img.shields.io/github/stars/azouaoui-med/pro-sidebar-template?style=social" | |
/> | |
</a> | |
<a href="https://github.com/azouaoui-med/pro-sidebar-template" target="_blank"> | |
<img | |
alt="GitHub forks" | |
src="https://img.shields.io/github/forks/azouaoui-med/pro-sidebar-template?style=social" | |
/> | |
</a> | |
</div> | |
</div> | |
<div> | |
<h2>Features</h2> | |
<ul> | |
<li>Fully responsive</li> | |
<li>Collapsable sidebar</li> | |
<li>Multi level menu</li> | |
<li>RTL support</li> | |
<li>Customizable</li> | |
</ul> | |
</div> | |
<div> | |
<h2>Resources</h2> | |
<ul> | |
<li> | |
<a target="_blank" href="https://github.com/azouaoui-med/css-pro-layout"> | |
Css Pro Layout</a | |
> | |
</li> | |
<li> | |
<a target="_blank" href="https://github.com/popperjs/popper-core"> Popper Core</a> | |
</li> | |
<li> | |
<a target="_blank" href="https://remixicon.com/"> Remix Icons</a> | |
</li> | |
</ul> | |
</div> | |
<footer class="footer"> | |
<small style="margin-bottom: 20px; display: inline-block"> | |
© 2023 made with | |
<span style="color: red; font-size: 18px">❤</span> by - | |
<a target="_blank" href="https://azouaoui.netlify.com"> Mohamed Azouaoui </a> | |
</small> | |
<br /> | |
<div class="social-links"> | |
<a href="https://github.com/azouaoui-med" target="_blank"> | |
<i class="ri-github-fill ri-xl"></i> | |
</a> | |
<a href="https://twitter.com/azouaoui_med" target="_blank"> | |
<i class="ri-twitter-fill ri-xl"></i> | |
</a> | |
<a href="https://codepen.io/azouaoui-med" target="_blank"> | |
<i class="ri-codepen-fill ri-xl"></i> | |
</a> | |
<a href="https://www.linkedin.com/in/mohamed-azouaoui/" target="_blank"> | |
<i class="ri-linkedin-box-fill ri-xl"></i> | |
</a> | |
</div> | |
</footer> | |
</main> | |
<div class="overlay"></div> | |
</div> | |
</div> |
const ANIMATION_DURATION = 300; | |
const SIDEBAR_EL = document.getElementById("sidebar"); | |
const SUB_MENU_ELS = document.querySelectorAll( | |
".menu > ul > .menu-item.sub-menu" | |
); | |
const FIRST_SUB_MENUS_BTN = document.querySelectorAll( | |
".menu > ul > .menu-item.sub-menu > a" | |
); | |
const INNER_SUB_MENUS_BTN = document.querySelectorAll( | |
".menu > ul > .menu-item.sub-menu .menu-item.sub-menu > a" | |
); | |
class PopperObject { | |
instance = null; | |
reference = null; | |
popperTarget = null; | |
constructor(reference, popperTarget) { | |
this.init(reference, popperTarget); | |
} | |
init(reference, popperTarget) { | |
this.reference = reference; | |
this.popperTarget = popperTarget; | |
this.instance = Popper.createPopper(this.reference, this.popperTarget, { | |
placement: "right", | |
strategy: "fixed", | |
resize: true, | |
modifiers: [ | |
{ | |
name: "computeStyles", | |
options: { | |
adaptive: false | |
} | |
}, | |
{ | |
name: "flip", | |
options: { | |
fallbackPlacements: ["left", "right"] | |
} | |
} | |
] | |
}); | |
document.addEventListener( | |
"click", | |
(e) => this.clicker(e, this.popperTarget, this.reference), | |
false | |
); | |
const ro = new ResizeObserver(() => { | |
this.instance.update(); | |
}); | |
ro.observe(this.popperTarget); | |
ro.observe(this.reference); | |
} | |
clicker(event, popperTarget, reference) { | |
if ( | |
SIDEBAR_EL.classList.contains("collapsed") && | |
!popperTarget.contains(event.target) && | |
!reference.contains(event.target) | |
) { | |
this.hide(); | |
} | |
} | |
hide() { | |
this.instance.state.elements.popper.style.visibility = "hidden"; | |
} | |
} | |
class Poppers { | |
subMenuPoppers = []; | |
constructor() { | |
this.init(); | |
} | |
init() { | |
SUB_MENU_ELS.forEach((element) => { | |
this.subMenuPoppers.push( | |
new PopperObject(element, element.lastElementChild) | |
); | |
this.closePoppers(); | |
}); | |
} | |
togglePopper(target) { | |
if (window.getComputedStyle(target).visibility === "hidden") | |
target.style.visibility = "visible"; | |
else target.style.visibility = "hidden"; | |
} | |
updatePoppers() { | |
this.subMenuPoppers.forEach((element) => { | |
element.instance.state.elements.popper.style.display = "none"; | |
element.instance.update(); | |
}); | |
} | |
closePoppers() { | |
this.subMenuPoppers.forEach((element) => { | |
element.hide(); | |
}); | |
} | |
} | |
const slideUp = (target, duration = ANIMATION_DURATION) => { | |
const { parentElement } = target; | |
parentElement.classList.remove("open"); | |
target.style.transitionProperty = "height, margin, padding"; | |
target.style.transitionDuration = `${duration}ms`; | |
target.style.boxSizing = "border-box"; | |
target.style.height = `${target.offsetHeight}px`; | |
target.offsetHeight; | |
target.style.overflow = "hidden"; | |
target.style.height = 0; | |
target.style.paddingTop = 0; | |
target.style.paddingBottom = 0; | |
target.style.marginTop = 0; | |
target.style.marginBottom = 0; | |
window.setTimeout(() => { | |
target.style.display = "none"; | |
target.style.removeProperty("height"); | |
target.style.removeProperty("padding-top"); | |
target.style.removeProperty("padding-bottom"); | |
target.style.removeProperty("margin-top"); | |
target.style.removeProperty("margin-bottom"); | |
target.style.removeProperty("overflow"); | |
target.style.removeProperty("transition-duration"); | |
target.style.removeProperty("transition-property"); | |
}, duration); | |
}; | |
const slideDown = (target, duration = ANIMATION_DURATION) => { | |
const { parentElement } = target; | |
parentElement.classList.add("open"); | |
target.style.removeProperty("display"); | |
let { display } = window.getComputedStyle(target); | |
if (display === "none") display = "block"; | |
target.style.display = display; | |
const height = target.offsetHeight; | |
target.style.overflow = "hidden"; | |
target.style.height = 0; | |
target.style.paddingTop = 0; | |
target.style.paddingBottom = 0; | |
target.style.marginTop = 0; | |
target.style.marginBottom = 0; | |
target.offsetHeight; | |
target.style.boxSizing = "border-box"; | |
target.style.transitionProperty = "height, margin, padding"; | |
target.style.transitionDuration = `${duration}ms`; | |
target.style.height = `${height}px`; | |
target.style.removeProperty("padding-top"); | |
target.style.removeProperty("padding-bottom"); | |
target.style.removeProperty("margin-top"); | |
target.style.removeProperty("margin-bottom"); | |
window.setTimeout(() => { | |
target.style.removeProperty("height"); | |
target.style.removeProperty("overflow"); | |
target.style.removeProperty("transition-duration"); | |
target.style.removeProperty("transition-property"); | |
}, duration); | |
}; | |
const slideToggle = (target, duration = ANIMATION_DURATION) => { | |
if (window.getComputedStyle(target).display === "none") | |
return slideDown(target, duration); | |
return slideUp(target, duration); | |
}; | |
const PoppersInstance = new Poppers(); | |
/** | |
* wait for the current animation to finish and update poppers position | |
*/ | |
const updatePoppersTimeout = () => { | |
setTimeout(() => { | |
PoppersInstance.updatePoppers(); | |
}, ANIMATION_DURATION); | |
}; | |
/** | |
* sidebar collapse handler | |
*/ | |
document.getElementById("btn-collapse").addEventListener("click", () => { | |
SIDEBAR_EL.classList.toggle("collapsed"); | |
PoppersInstance.closePoppers(); | |
if (SIDEBAR_EL.classList.contains("collapsed")) | |
FIRST_SUB_MENUS_BTN.forEach((element) => { | |
element.parentElement.classList.remove("open"); | |
}); | |
updatePoppersTimeout(); | |
}); | |
/** | |
* sidebar toggle handler (on break point ) | |
*/ | |
document.getElementById("btn-toggle").addEventListener("click", () => { | |
SIDEBAR_EL.classList.toggle("toggled"); | |
updatePoppersTimeout(); | |
}); | |
/** | |
* toggle sidebar on overlay click | |
*/ | |
document.getElementById("overlay").addEventListener("click", () => { | |
SIDEBAR_EL.classList.toggle("toggled"); | |
}); | |
const defaultOpenMenus = document.querySelectorAll(".menu-item.sub-menu.open"); | |
defaultOpenMenus.forEach((element) => { | |
element.lastElementChild.style.display = "block"; | |
}); | |
/** | |
* handle top level submenu click | |
*/ | |
FIRST_SUB_MENUS_BTN.forEach((element) => { | |
element.addEventListener("click", () => { | |
if (SIDEBAR_EL.classList.contains("collapsed")) | |
PoppersInstance.togglePopper(element.nextElementSibling); | |
else { | |
const parentMenu = element.closest(".menu.open-current-submenu"); | |
if (parentMenu) | |
parentMenu | |
.querySelectorAll(":scope > ul > .menu-item.sub-menu > a") | |
.forEach( | |
(el) => | |
window.getComputedStyle(el.nextElementSibling).display !== | |
"none" && slideUp(el.nextElementSibling) | |
); | |
slideToggle(element.nextElementSibling); | |
} | |
}); | |
}); | |
/** | |
* handle inner submenu click | |
*/ | |
INNER_SUB_MENUS_BTN.forEach((element) => { | |
element.addEventListener("click", () => { | |
slideToggle(element.nextElementSibling); | |
}); | |
}); |
<script src="https://unpkg.com/@popperjs/core@2"></script> |
$text-color: #7d84ab; | |
$secondary-text-color: #dee2ec; | |
$bg-color: #0c1e35; | |
$secondary-bg-color: #0b1a2c; | |
$border-color: rgba(#535d7d, 0.3); | |
$sidebar-header-height: 100px; | |
$sidebar-footer-height: 230px; | |
.layout { | |
z-index: 1; | |
.header { | |
display: flex; | |
align-items: center; | |
padding: 20px; | |
} | |
.content { | |
padding: 12px 50px; | |
display: flex; | |
flex-direction: column; | |
} | |
.footer { | |
text-align: center; | |
margin-top: auto; | |
margin-bottom: 20px; | |
padding: 20px; | |
} | |
} | |
.sidebar { | |
color: $text-color; | |
overflow-x: hidden !important; | |
position: relative; | |
&::-webkit-scrollbar-thumb { | |
border-radius: 4px; | |
} | |
&:hover { | |
&::-webkit-scrollbar-thumb { | |
background-color: lighten($bg-color, 15); | |
} | |
} | |
&::-webkit-scrollbar { | |
width: 6px; | |
background-color: $bg-color; | |
} | |
.image-wrapper { | |
overflow: hidden; | |
position: absolute; | |
top: 0; | |
right: 0; | |
bottom: 0; | |
left: 0; | |
z-index: 1; | |
display: none; | |
> img { | |
width: 100%; | |
height: 100%; | |
object-fit: cover; | |
object-position: center; | |
} | |
} | |
&.has-bg-image .image-wrapper { | |
display: block; | |
} | |
.sidebar-layout { | |
height: auto; | |
min-height: 100%; | |
display: flex; | |
flex-direction: column; | |
position: relative; | |
background-color: $bg-color; | |
z-index: 2; | |
.sidebar-header { | |
height: $sidebar-header-height; | |
min-height: $sidebar-header-height; | |
display: flex; | |
align-items: center; | |
padding: 0 20px; | |
> span { | |
overflow: hidden; | |
white-space: nowrap; | |
text-overflow: ellipsis; | |
} | |
} | |
.sidebar-content { | |
flex-grow: 1; | |
padding: 10px 0; | |
} | |
.sidebar-footer { | |
height: $sidebar-footer-height; | |
min-height: $sidebar-footer-height; | |
display: flex; | |
align-items: center; | |
padding: 0 20px; | |
> span { | |
overflow: hidden; | |
white-space: nowrap; | |
text-overflow: ellipsis; | |
} | |
} | |
} | |
} | |
@keyframes swing { | |
0%, | |
30%, | |
50%, | |
70%, | |
100% { | |
transform: rotate(0deg); | |
} | |
10% { | |
transform: rotate(10deg); | |
} | |
40% { | |
transform: rotate(-10deg); | |
} | |
60% { | |
transform: rotate(5deg); | |
} | |
80% { | |
transform: rotate(-5deg); | |
} | |
} | |
.layout { | |
.sidebar { | |
.menu { | |
ul { | |
list-style-type: none; | |
padding: 0; | |
margin: 0; | |
} | |
.menu-header { | |
font-weight: 600; | |
padding: 10px 25px; | |
font-size: 0.8em; | |
letter-spacing: 2px; | |
transition: opacity 0.3s; | |
opacity: 0.5; | |
} | |
.menu-item { | |
a { | |
display: flex; | |
align-items: center; | |
height: 50px; | |
padding: 0 20px; | |
color: $text-color; | |
.menu-icon { | |
font-size: 1.2rem; | |
width: 35px; | |
min-width: 35px; | |
height: 35px; | |
line-height: 35px; | |
text-align: center; | |
display: inline-block; | |
margin-right: 10px; | |
border-radius: 2px; | |
transition: color 0.3s; | |
i { | |
display: inline-block; | |
} | |
} | |
.menu-title { | |
font-size: 0.9em; | |
overflow: hidden; | |
text-overflow: ellipsis; | |
white-space: nowrap; | |
flex-grow: 1; | |
transition: color 0.3s; | |
} | |
.menu-prefix, | |
.menu-suffix { | |
display: inline-block; | |
padding: 5px; | |
opacity: 1; | |
transition: opacity 0.3s; | |
} | |
&:hover { | |
.menu-title { | |
color: $secondary-text-color; | |
} | |
.menu-icon { | |
color: $secondary-text-color; | |
i { | |
animation: swing ease-in-out 0.5s 1 alternate; | |
} | |
} | |
&::after { | |
border-color: $secondary-text-color !important; | |
} | |
} | |
} | |
&.sub-menu { | |
position: relative; | |
> a { | |
&::after { | |
content: ''; | |
transition: transform 0.3s; | |
border-right: 2px solid currentcolor; | |
border-bottom: 2px solid currentcolor; | |
width: 5px; | |
height: 5px; | |
transform: rotate(-45deg); | |
} | |
} | |
> .sub-menu-list { | |
padding-left: 20px; | |
display: none; | |
overflow: hidden; | |
z-index: 999; | |
} | |
&.open { | |
> a { | |
color: $secondary-text-color; | |
&::after { | |
transform: rotate(45deg); | |
} | |
} | |
} | |
} | |
&.active { | |
> a { | |
.menu-title { | |
color: $secondary-text-color; | |
} | |
&::after { | |
border-color: $secondary-text-color; | |
} | |
.menu-icon { | |
color: $secondary-text-color; | |
} | |
} | |
} | |
} | |
> ul > .sub-menu > .sub-menu-list { | |
background-color: $secondary-bg-color; | |
} | |
&.icon-shape-circle, | |
&.icon-shape-rounded, | |
&.icon-shape-square { | |
.menu-item a .menu-icon { | |
background-color: $secondary-bg-color; | |
} | |
} | |
&.icon-shape-circle .menu-item a .menu-icon { | |
border-radius: 50%; | |
} | |
&.icon-shape-rounded .menu-item a .menu-icon { | |
border-radius: 4px; | |
} | |
&.icon-shape-square .menu-item a .menu-icon { | |
border-radius: 0; | |
} | |
} | |
&:not(.collapsed) { | |
.menu > ul { | |
> .menu-item { | |
&.sub-menu { | |
> .sub-menu-list { | |
visibility: visible !important; | |
position: static !important; | |
transform: translate(0, 0) !important; | |
} | |
} | |
} | |
} | |
} | |
&.collapsed { | |
.menu > ul { | |
> .menu-header { | |
opacity: 0; | |
} | |
> .menu-item { | |
> a { | |
.menu-prefix, | |
.menu-suffix { | |
opacity: 0; | |
} | |
} | |
&.sub-menu { | |
> a { | |
&::after { | |
content: ''; | |
width: 5px; | |
height: 5px; | |
background-color: currentcolor; | |
border-radius: 50%; | |
display: inline-block; | |
position: absolute; | |
right: 10px; | |
top: 50%; | |
border: none; | |
transform: translateY(-50%); | |
} | |
&:hover { | |
&::after { | |
background-color: $secondary-text-color; | |
} | |
} | |
} | |
> .sub-menu-list { | |
transition: none !important; | |
width: 200px; | |
margin-left: 3px !important; | |
border-radius: 4px; | |
display: block !important; | |
} | |
} | |
&.active { | |
> a { | |
&::after { | |
background-color: $secondary-text-color; | |
} | |
} | |
} | |
} | |
} | |
} | |
&.has-bg-image { | |
.menu { | |
&.icon-shape-circle, | |
&.icon-shape-rounded, | |
&.icon-shape-square { | |
.menu-item a .menu-icon { | |
background-color: rgba($secondary-bg-color, 0.6); | |
} | |
} | |
} | |
&:not(.collapsed) { | |
.menu { | |
> ul > .sub-menu > .sub-menu-list { | |
background-color: rgba($secondary-bg-color, 0.6); | |
} | |
} | |
} | |
} | |
} | |
&.rtl { | |
.sidebar { | |
.menu { | |
.menu-item { | |
a { | |
.menu-icon { | |
margin-left: 10px; | |
margin-right: 0; | |
} | |
} | |
&.sub-menu { | |
> a { | |
&::after { | |
transform: rotate(135deg); | |
} | |
} | |
> .sub-menu-list { | |
padding-left: 0; | |
padding-right: 20px; | |
} | |
&.open { | |
> a { | |
&::after { | |
transform: rotate(45deg); | |
} | |
} | |
} | |
} | |
} | |
} | |
&.collapsed { | |
.menu > ul { | |
> .menu-item { | |
&.sub-menu { | |
a::after { | |
right: auto; | |
left: 10px; | |
} | |
> .sub-menu-list { | |
margin-left: -3px !important; | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
* { | |
box-sizing: border-box; | |
} | |
body { | |
margin: 0; | |
height: 100vh; | |
font-family: 'Poppins', sans-serif; | |
color: #3f4750; | |
font-size: 0.9rem; | |
} | |
a { | |
text-decoration: none; | |
} | |
@media (max-width: 992px) { | |
#btn-collapse { | |
display: none; | |
} | |
} | |
.layout { | |
.sidebar { | |
.pro-sidebar-logo { | |
display: flex; | |
align-items: center; | |
> div { | |
width: 35px; | |
min-width: 35px; | |
height: 35px; | |
min-height: 35px; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
border-radius: 8px; | |
color: white; | |
font-size: 24px; | |
font-weight: 700; | |
background-color: #ff8100; | |
margin-right: 10px; | |
} | |
> h5 { | |
overflow: hidden; | |
white-space: nowrap; | |
text-overflow: ellipsis; | |
font-size: 20px; | |
line-height: 30px; | |
transition: opacity 0.3s; | |
opacity: 1; | |
} | |
} | |
.footer-box { | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
justify-content: center; | |
text-align: center; | |
font-size: 0.8em; | |
padding: 20px 0; | |
border-radius: 8px; | |
width: 180px; | |
min-width: 190px; | |
margin: 0 auto; | |
background-color: #162d4a; | |
img.react-logo { | |
width: 40px; | |
height: 40px; | |
margin-bottom: 10px; | |
} | |
a { | |
color: #fff; | |
font-weight: 600; | |
margin-bottom: 10px; | |
} | |
} | |
.sidebar-collapser { | |
transition: left, right, 0.3s; | |
position: fixed; | |
left: 260px; | |
top: 40px; | |
width: 20px; | |
height: 20px; | |
border-radius: 50%; | |
background-color: #00829f; | |
display: -webkit-box; | |
display: -ms-flexbox; | |
display: flex; | |
-ms-flex-align: center; | |
align-items: center; | |
justify-content: center; | |
font-size: 1.2em; | |
transform: translateX(50%); | |
z-index: 111; | |
cursor: pointer; | |
color: white; | |
box-shadow: 1px 1px 4px $bg-color; | |
} | |
&.collapsed { | |
.pro-sidebar-logo { | |
> h5 { | |
opacity: 0; | |
} | |
} | |
.footer-box { | |
display: none; | |
} | |
.sidebar-collapser { | |
left: 60px; | |
i { | |
transform: rotate(180deg); | |
} | |
} | |
} | |
} | |
} | |
.badge { | |
display: inline-block; | |
padding: 0.25em 0.4em; | |
font-size: 75%; | |
font-weight: 700; | |
line-height: 1; | |
text-align: center; | |
white-space: nowrap; | |
vertical-align: baseline; | |
border-radius: 0.25rem; | |
color: #fff; | |
background-color: #6c757d; | |
&.primary { | |
background-color: #ab2dff; | |
} | |
&.secondary { | |
background-color: #079b0b; | |
} | |
} | |
.sidebar-toggler { | |
position: fixed; | |
right: 20px; | |
top: 20px; | |
} | |
.social-links { | |
a { | |
margin: 0 10px; | |
color: #3f4750; | |
} | |
} |
<link href="https://cdn.jsdelivr.net/npm/remixicon@2.2.0/fonts/remixicon.css" rel="stylesheet" /> | |
<link href="https://unpkg.com/css-pro-layout@1.1.0/dist/css/css-pro-layout.css" rel="stylesheet" /> | |
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet" /> |