stacked-menu
Version:
A flexible stacked navigation menu.
435 lines (413 loc) • 16.1 kB
CSS
/** The root StackedMenu */
.stacked-menu {
position: relative;
background-color: #15191d;
padding: .25rem 0;
/* global state */
/* nav child */
/* nav level 1 */
/* disabled state */ }
.stacked-menu ul.menu {
display: block;
margin-bottom: 0;
padding-left: 0;
list-style: none; }
.stacked-menu ul.menu + .menu {
margin-top: 1em; }
.stacked-menu .menu-header {
margin: .5em 0 0;
padding: 0.5rem 1rem;
color: #555;
font-size: 0.8125rem;
font-weight: bold;
letter-spacing: 1px;
text-transform: uppercase; }
.stacked-menu .menu-header > .badge,
.stacked-menu .menu-header > .label {
position: absolute;
right: 0.75rem;
z-index: 2; }
.stacked-menu .menu-subhead {
display: none;
padding: 0.5rem 1rem;
overflow: hidden;
color: #fff;
font-size: 0.875rem;
line-height: 1.75em; }
.stacked-menu .menu-link {
display: block;
position: relative;
outline: 0;
padding: 0.5rem 1rem;
overflow: hidden;
color: #999;
font-size: 0.875rem;
line-height: 1.75em;
text-decoration: none; }
.stacked-menu .menu-link > .menu-icon {
margin-right: .5em;
width: 1.25em;
color: #999;
font-size: 1rem;
text-align: center; }
.stacked-menu .menu-link > .badge,
.stacked-menu .menu-link > .label {
position: absolute;
right: 0.75rem;
z-index: 2;
margin-top: .25em; }
.stacked-menu .menu-link:focus {
background-color: transparent;
overflow: visible;
color: #5d67ad;
text-decoration: none; }
.stacked-menu .menu-link:focus .menu-icon {
color: #eee; }
.stacked-menu .menu-link:hover {
background-color: transparent;
overflow: visible;
color: #5d67ad;
text-decoration: none; }
.stacked-menu .menu-link:hover .menu-icon {
color: #eee; }
.stacked-menu .menu-item + .menu-item {
margin-top: 0; }
.stacked-menu .menu-item.has-open:not(.has-active) > .menu-link {
background-color: transparent;
color: #5d67ad; }
.stacked-menu .menu-item.has-open:not(.has-active) > .menu-link .menu-icon {
color: #eee; }
.stacked-menu .menu-item.has-active > .menu-link {
background-color: transparent;
color: #fff; }
.stacked-menu .menu-item.has-active > .menu-link .menu-icon {
color: #eee; }
.stacked-menu .has-child {
position: relative; }
.stacked-menu .has-child > .menu {
visibility: hidden;
opacity: 0;
background-color: #1b2126;
height: 0; }
.stacked-menu .has-child.has-active:hover > .menu,
.stacked-menu .has-child.has-open > .menu {
overflow: visible; }
.stacked-menu .has-child.has-active > .menu {
visibility: visible;
opacity: 1;
height: auto; }
.stacked-menu > .menu > .menu-item {
/* level 1 */ }
.stacked-menu > .menu > .menu-item > .menu-link {
color: #ccc; }
.stacked-menu > .menu > .menu-item > .menu-link:focus {
background-color: #0f1114;
color: #eee; }
.stacked-menu > .menu > .menu-item > .menu-link:hover {
background-color: #0f1114;
color: #eee; }
.stacked-menu > .menu > .menu-item.has-open > .menu-link {
background-color: #0f1114;
color: #eee; }
.stacked-menu > .menu > .menu-item.has-active > .menu-link {
-webkit-box-shadow: inset 3px 0 0 #5d67ad;
box-shadow: inset 3px 0 0 #5d67ad;
background-color: #20262c;
color: #eee; }
.stacked-menu > .menu > .menu-item > .menu {
/* level 2 */ }
.stacked-menu > .menu > .menu-item > .menu .menu-link {
padding-left: 3rem; }
.stacked-menu > .menu > .menu-item > .menu .menu {
/* level 3 */ }
.stacked-menu > .menu > .menu-item > .menu .menu .menu-link {
padding-left: 4rem; }
.stacked-menu > .menu > .menu-item > .menu .menu .menu .menu-link {
padding-left: 5rem; }
.stacked-menu .menu-item.disabled > .menu-link,
.stacked-menu .menu-item > .menu-link.disabled {
color: #555; }
.stacked-menu .menu-item.disabled > .menu-link .menu-icon,
.stacked-menu .menu-item > .menu-link.disabled .menu-icon {
color: #555; }
.stacked-menu .menu-item.disabled > .menu-link:focus,
.stacked-menu .menu-item.disabled > .menu-link:focus .menu-icon,
.stacked-menu .menu-item > .menu-link.disabled:focus,
.stacked-menu .menu-item > .menu-link.disabled:focus .menu-icon {
background-color: transparent;
color: #555; }
.stacked-menu .menu-item.disabled > .menu-link:hover,
.stacked-menu .menu-item.disabled > .menu-link:hover .menu-icon,
.stacked-menu .menu-item > .menu-link.disabled:hover,
.stacked-menu .menu-item > .menu-link.disabled:hover .menu-icon {
background-color: transparent;
color: #555; }
/* Compact */
.stacked-menu-has-compact .has-child.has-active > .menu {
visibility: hidden;
opacity: 0;
height: 0; }
.stacked-menu-has-compact .has-child.has-active .menu-subhead {
background-color: #20262c; }
.stacked-menu-has-compact .has-child .menu-subhead {
display: block; }
.stacked-menu-has-compact > .menu > .menu-item > .menu-link {
padding-right: 0;
padding-left: 0;
max-height: 40px;
text-align: center; }
.stacked-menu-has-compact > .menu > .menu-item > .menu-link > .badge,
.stacked-menu-has-compact > .menu > .menu-item > .menu-link > .label {
top: 0;
right: 0.25rem; }
.stacked-menu-has-compact > .menu > .menu-item > .menu-link .menu-icon {
margin: 0;
font-size: 1.25em;
line-height: 1.5em; }
.stacked-menu-has-compact > .menu > .menu-item.has-child > .menu-link .menu-text {
display: none; }
.stacked-menu-has-compact > .menu > .menu-header {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
visibility: hidden;
opacity: 0;
margin: 0;
height: 0;
overflow: hidden;
user-select: none; }
.stacked-menu-has-compact > .menu > .menu-item:not(.has-child) > .menu-link .menu-text {
-webkit-transition: opacity 150ms linear;
-o-transition: opacity 150ms linear;
display: block;
position: absolute;
top: 0;
left: 100%;
visibility: hidden;
opacity: 0;
transition: opacity 150ms linear;
border-radius: 0 0 0 0;
background-color: #0f1114;
padding: 0.5rem 0.75rem 0.5rem 0;
width: 0;
height: 0;
line-height: 1.75em;
white-space: nowrap; }
.stacked-menu-has-compact > .menu > .menu-item:not(.has-child) > .menu-link:hover .menu-text {
visibility: visible;
opacity: 1;
width: auto;
height: auto; }
.stacked-menu-has-compact > .menu > .menu-item.has-active > .menu-link .menu-text {
background-color: #20262c; }
.stacked-menu-has-compact > .menu > .menu-item.disabled > .menu-link .menu-text,
.stacked-menu-has-compact > .menu > .menu-item > .menu-link.disabled .menu-text {
background-color: #15191d; }
.stacked-menu-has-compact > .menu > .menu-item.has-child > .menu-link:before {
content: none; }
.stacked-menu-has-compact > .menu > .menu-item.has-child > .menu-link .menu-text {
padding: 0.5rem 1rem;
width: 200px;
text-align: left; }
/* Behavior */
.stacked-menu-has-collapsible {
/** caret angle, Only show on collapsible mode */ }
.stacked-menu-has-collapsible .has-child > .menu-link::after {
-webkit-transform: translateY(-0.5em);
-ms-transform: translateY(-0.5em);
-o-transform: translateY(-0.5em);
display: inline-block;
position: absolute;
top: 50%;
right: 0.75rem;
transform: translateY(-0.5em);
width: 1em;
height: 1em;
line-height: 1em;
text-align: center;
content: '+'; }
.stacked-menu-has-collapsible .has-child.has-active > .menu-link::after,
.stacked-menu-has-collapsible .has-child.has-open > .menu-link::after {
content: '-'; }
.stacked-menu-has-collapsible .has-child > .menu {
visibility: visible;
opacity: 1;
overflow: hidden; }
.stacked-menu-has-collapsible .has-child.has-open:not(.has-active) > .menu {
height: auto; }
/** collapsible on compact mode */
.stacked-menu-has-collapsible.stacked-menu-has-compact {
/** hide caret on level 1 */
/** child level 2 up */ }
.stacked-menu-has-collapsible.stacked-menu-has-compact > .menu > .has-child > .menu {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
-o-transform-origin: 0 0;
-webkit-transform: scale(0.6);
-ms-transform: scale(0.6);
-o-transform: scale(0.6);
-webkit-transition: opacity 150ms linear, -webkit-transform 150ms linear;
-o-transition: opacity 150ms linear, -o-transform 150ms linear;
transform: scale(0.6);
transform-origin: 0 0;
transition: opacity 150ms linear, -webkit-transform 150ms linear;
transition: opacity 150ms linear, transform 150ms linear;
transition: opacity 150ms linear, transform 150ms linear, -webkit-transform 150ms linear, -o-transform 150ms linear; }
.stacked-menu-has-collapsible.stacked-menu-has-compact > .menu > .has-child.has-open > .menu {
-webkit-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
transform: scale(1); }
.stacked-menu-has-collapsible.stacked-menu-has-compact > .menu > .has-child > .menu-link:after {
display: none; }
.stacked-menu-has-collapsible.stacked-menu-has-compact .has-child.has-open > .menu {
position: absolute;
top: 0;
left: 100%;
visibility: visible;
opacity: 1;
border-radius: 0 0 0 0;
width: 200px;
height: auto; }
.stacked-menu-has-collapsible.stacked-menu-has-compact .has-child > .menu .menu-link {
padding-left: 1rem; }
.stacked-menu-has-collapsible.stacked-menu-has-compact .menu .menu .has-child.has-open > .menu {
position: static;
top: auto;
left: auto;
width: auto; }
.stacked-menu-has-collapsible.stacked-menu-has-compact .menu .menu .has-child > .menu .menu-link {
padding-left: 2rem; }
.stacked-menu-has-collapsible.stacked-menu-has-compact .menu .menu .has-child > .menu .menu .menu-link {
padding-left: 3rem; }
/* Give a transition */
.stacked-menu-has-hoverable {
/** except level 1 .has-active */ }
.stacked-menu-has-hoverable .has-child > .menu {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
-o-transform-origin: 0 0;
-webkit-transition: opacity 150ms linear, -webkit-transform 150ms linear;
-o-transition: opacity 150ms linear, -o-transform 150ms linear;
transform-origin: 0 0;
transition: opacity 150ms linear, -webkit-transform 150ms linear;
transition: opacity 150ms linear, transform 150ms linear;
transition: opacity 150ms linear, transform 150ms linear, -webkit-transform 150ms linear, -o-transform 150ms linear; }
.stacked-menu-has-hoverable .has-child:not(.has-active) > .menu {
-webkit-transform: scale(0.6);
-ms-transform: scale(0.6);
-o-transform: scale(0.6);
transform: scale(0.6); }
.stacked-menu-has-hoverable.stacked-menu-has-compact {
/** level 1 */
/** overwrite for all */ }
.stacked-menu-has-hoverable.stacked-menu-has-compact > .menu > .has-child > .menu {
-webkit-transition: opacity 150ms linear, -webkit-transform 150ms linear;
-o-transition: opacity 150ms linear, -o-transform 150ms linear;
transition: opacity 150ms linear, -webkit-transform 150ms linear;
transition: opacity 150ms linear, transform 150ms linear;
transition: opacity 150ms linear, transform 150ms linear, -webkit-transform 150ms linear, -o-transform 150ms linear; }
.stacked-menu-has-hoverable.stacked-menu-has-compact .has-child > .menu {
-webkit-transform: scale(0.6);
-ms-transform: scale(0.6);
-o-transform: scale(0.6);
transform: scale(0.6); }
/* Behavior */
.stacked-menu-has-hoverable,
.stacked-menu-has-compact {
/** except level 1 .has-active */ }
.stacked-menu-has-hoverable .has-child,
.stacked-menu-has-compact .has-child {
/** caret */ }
.stacked-menu-has-hoverable .has-child.has-open:not(.has-active) > .menu,
.stacked-menu-has-compact .has-child.has-open:not(.has-active) > .menu {
-webkit-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
position: absolute;
top: 0;
left: 100%;
transform: scale(1);
visibility: visible;
opacity: 1;
width: 200px;
height: auto; }
.stacked-menu-has-hoverable .has-child > .menu .menu-item > .menu .menu-link,
.stacked-menu-has-hoverable .has-child > .menu .menu-item > .menu .menu .menu-link,
.stacked-menu-has-compact .has-child > .menu .menu-item > .menu .menu-link,
.stacked-menu-has-compact .has-child > .menu .menu-item > .menu .menu .menu-link {
padding-left: 1rem; }
.stacked-menu-has-hoverable .has-child > .menu-link:before,
.stacked-menu-has-compact .has-child > .menu-link:before {
-webkit-transform: translateY(-8px);
-ms-transform: translateY(-8px);
-o-transform: translateY(-8px);
position: absolute;
top: 50%;
right: 0;
transform: translateY(-8px);
border-top: 8px solid transparent;
/** the caret */
border-right: 8px solid #1b2126;
border-bottom: 8px solid transparent;
width: 0;
height: 0;
content: ''; }
/** hoverable on compact mode */
.stacked-menu-has-hoverable.stacked-menu-has-compact {
/** overwrite for all */ }
.stacked-menu-has-hoverable.stacked-menu-has-compact .has-child.has-open > .menu {
-webkit-transform: scale(1);
-ms-transform: scale(1);
-o-transform: scale(1);
position: absolute;
top: 0;
left: 100%;
transform: scale(1);
visibility: visible;
opacity: 1;
border-radius: 0 0 0 0;
width: 200px;
height: auto; }
.stacked-menu-has-hoverable.stacked-menu-has-compact .has-child.has-open > .menu .menu-item > .menu-link {
padding-left: 1rem; }
/** open menu to left direction */
/** Core */
.stacked-menu-has-left {
/** compact */ }
.stacked-menu-has-left > .menu > .menu-item.has-active > .menu-link {
-webkit-box-shadow: inset -3px 0 0 #5d67ad;
box-shadow: inset -3px 0 0 #5d67ad; }
.stacked-menu-has-left.stacked-menu-has-compact > .menu > .menu-item > .menu-link > .badge {
right: auto;
left: 0.25rem; }
.stacked-menu-has-left.stacked-menu-has-compact > .menu > .menu-item:not(.has-child) > .menu-link .menu-text {
right: 100%;
left: auto;
border-radius: 0 0 0 0;
padding: 0.5rem 0 0.5rem 0.75rem; }
/** Behavior */
.stacked-menu-has-left {
/** both hoverable & collapsible on compact mode */ }
.stacked-menu-has-left.stacked-menu-has-hoverable .has-child > .menu {
-webkit-transform-origin: 100% 0;
-ms-transform-origin: 100% 0;
-o-transform-origin: 100% 0;
transform-origin: 100% 0; }
.stacked-menu-has-left.stacked-menu-has-collapsible.stacked-menu-has-compact > .menu > .has-child > .menu {
-webkit-transform-origin: 100% 0;
-ms-transform-origin: 100% 0;
-o-transform-origin: 100% 0;
transform-origin: 100% 0; }
.stacked-menu-has-left.stacked-menu-has-hoverable .has-child.has-open:not(.has-active) > .menu, .stacked-menu-has-left.stacked-menu-has-compact .has-child.has-open:not(.has-active) > .menu {
right: 100%;
left: auto; }
.stacked-menu-has-left.stacked-menu-has-hoverable .has-child.has-open:not(.has-active) > .menu-link:before, .stacked-menu-has-left.stacked-menu-has-compact .has-child.has-open:not(.has-active) > .menu-link:before {
right: auto;
left: 0;
border-right: 0 solid transparent;
border-left: 8px solid #1b2126; }
.stacked-menu-has-left.stacked-menu-has-hoverable.stacked-menu-has-compact .has-child.has-open > .menu, .stacked-menu-has-left.stacked-menu-has-collapsible.stacked-menu-has-compact .has-child.has-open > .menu {
right: 100%;
left: auto; }
/*# sourceMappingURL=stacked-menu.css.map */