svarog-ui-core
Version:
Core components of Svarog UI without themes
288 lines (246 loc) • 7.13 kB
JavaScript
import { css } from '../../utils/styleInjection.js';
export const navigationStyles = css`
/**
* Navigation component styles
*/
.nav {
position: relative;
font-size: var(--nav-font-size);
line-height: var(--nav-line-height);
display: flex;
flex-direction: column;
}
/* Horizontal layout */
.nav--horizontal {
flex-direction: row;
align-items: center;
}
/* Navigation List */
.nav__list {
list-style: none;
margin: 0;
padding: 0;
align-items: center;
display: flex;
flex-direction: row;
gap: var(--nav-item-spacing);
}
.nav--vertical .nav__list {
flex-direction: column;
align-items: stretch;
gap: var(--nav-item-spacing-vertical);
}
/* Navigation Items */
.nav__item {
position: relative;
padding: 0;
}
.nav--vertical .nav__item {
width: 100%;
}
/* Navigation Links */
.nav__link {
display: flex; /* Change from inline-flex to flex */
align-items: center;
color: var(--nav-link-color);
text-decoration: none;
border: none;
background: transparent;
cursor: pointer;
font-size: inherit;
font-family: inherit;
transition:
color 0.3s ease,
border-color 0.3s ease;
white-space: nowrap;
position: relative;
width: 100%;
text-align: left;
padding: var(--space-2) 0;
margin-bottom: 0;
border-bottom: 2px solid transparent;
box-sizing: border-box;
height: 40px;
line-height: 1.5;
}
.nav__link:hover {
color: var(--nav-link-hover-color, var(--color-primary));
}
/* Active state with border-bottom */
.nav__item--active > .nav__link {
color: var(--nav-link-active-color, var(--color-primary));
border-bottom: 2px solid var(--nav-link-active-color, var(--color-primary));
}
/* Disabled state */
.nav__item--disabled > .nav__link {
opacity: var(--disabled-opacity, 0.6);
cursor: not-allowed;
pointer-events: none;
}
/* Submenus */
.nav__submenu {
list-style: none;
margin: 0;
padding: 0;
}
/* Dropdown styling for horizontal nav */
.nav:not(.nav--vertical):not(.nav--open) .nav__submenu {
position: absolute;
top: calc(100% + var(--space-4)); /* Add space without using margin */
left: 0; /* Aligned with the start of parent item */
z-index: var(--z-index-dropdown, 1000);
min-width: 200px;
background-color: var(--nav-dropdown-bg);
display: none;
padding: 0; /* Add some padding to the submenu */
}
/* Submenu shadow option - only applied when the prop is true */
.nav--submenu-shadow:not(.nav--vertical):not(.nav--open) .nav__submenu {
box-shadow: var(--nav-dropdown-shadow);
}
.nav:not(.nav--vertical):not(.nav--open)
.nav__item--expanded
> .nav__submenu {
display: block;
}
.nav:not(.nav--vertical):not(.nav--open) .nav__submenu .nav__link {
width: 100%;
padding: 0;
font-size: var(
--font-size-sm,
0.875rem
); /* Smaller font size for submenu items */
}
/* Vertical navigation submenus - align with parent text */
.nav--vertical .nav__submenu {
padding-left: var(--nav-submenu-indent);
height: 0;
overflow: hidden;
transition: height 0.3s ease;
}
.nav--vertical .nav__item--expanded > .nav__submenu {
height: auto; /* Auto height to properly calculate */
}
.nav--vertical .nav__submenu .nav__link {
padding-left: var(--nav-link-padding);
font-size: var(--font-size-sm); /* Smaller font size for submenu items */
border-bottom: none; /* No border for submenu items in vertical navigation */
}
/* Reset border for submenu items to avoid stacking borders */
.nav__submenu .nav__link {
border-bottom: none;
}
.nav__submenu .nav__item--active > .nav__link {
border-bottom: none;
background-color: rgba(
0,
0,
0,
0.03
); /* Subtle background for active submenu items */
}
/* Burger button */
.nav__burger {
display: none;
flex-direction: column;
justify-content: space-between;
width: var(--nav-burger-size);
height: calc(var(--nav-burger-size) - 6px);
padding: 0;
border: none;
background: transparent;
cursor: pointer;
position: relative;
z-index: var(--z-index-sticky);
}
.nav__burger-line {
width: 100%;
height: 2px;
background-color: var(--nav-burger-color, var(--color-text));
transition: all 0.3s ease;
transform-origin: center;
}
/* Burger positioning */
.nav--burger-left .nav__burger {
margin-right: auto;
order: -1;
}
.nav--burger-right .nav__burger {
margin-left: auto;
order: 1;
}
/* Mobile Navigation */
@media (max-width: 768px) {
.nav--responsive {
flex-wrap: wrap;
}
.nav--responsive .nav__burger {
display: flex;
}
.nav--responsive .nav__list {
display: none;
flex-direction: column;
align-items: flex-start; /* Align items to the left */
background-color: var(--nav-mobile-bg);
padding: var(--nav-mobile-padding);
width: 100%;
order: 3; /* Make sure it appears below any logo */
flex-basis: 100%; /* Take full width */
gap: var(--nav-item-spacing-vertical);
}
.nav--responsive.nav--open .nav__list {
display: flex;
}
.nav--responsive .nav__item {
margin-right: 0;
width: 100%;
}
.nav--responsive .nav__item:last-child {
margin-bottom: 0;
}
.nav--responsive .nav__link {
width: 100%;
padding: var(--nav-mobile-link-padding);
font-size: var(--font-size-base);
border-bottom: none; /* Remove bottom border in mobile view */
}
.nav--responsive .nav__link:hover {
background-color: var(--nav-mobile-hover-bg);
}
/* Replace underline with background in mobile */
.nav--responsive .nav__item--active > .nav__link {
background-color: var(--nav-mobile-active-bg);
border-bottom: none; /* Remove border in mobile and use background instead */
}
/* Mobile submenus */
.nav--responsive .nav__submenu {
height: 0;
overflow: hidden;
transition: height 0.3s ease;
background-color: var(--nav-mobile-submenu-bg);
width: 100%;
will-change: height; /* Optimizes animation */
}
.nav--responsive .nav__item--expanded > .nav__submenu {
height: auto; /* Auto height to properly calculate */
}
.nav--responsive .nav__submenu .nav__item {
margin-bottom: 0;
}
/* Align submenu with parent in mobile */
.nav--responsive .nav__submenu .nav__link {
font-size: var(--font-size-sm); /* Smaller font size */
padding: 0; /* Match the parent padding */
}
/* Improved burger animation to X when open */
.nav--responsive.nav--open .nav__burger-line:nth-child(1) {
transform: translateY(8px) rotate(45deg);
}
.nav--responsive.nav--open .nav__burger-line:nth-child(2) {
opacity: 0;
}
.nav--responsive.nav--open .nav__burger-line:nth-child(3) {
transform: translateY(-8px) rotate(-45deg);
}
}
`;