193 lines
3.7 KiB
SCSS
193 lines
3.7 KiB
SCSS
// =============================================================================
|
||
// layout/_header.scss
|
||
// =============================================================================
|
||
|
||
.site-navbar {
|
||
position: sticky;
|
||
top: 0;
|
||
z-index: 100;
|
||
background-color: var(--navbar-bg);
|
||
box-shadow: var(--navbar-shadow);
|
||
backdrop-filter: blur(10px);
|
||
-webkit-backdrop-filter: blur(10px);
|
||
transition: box-shadow var(--transition-base), background-color var(--transition-base);
|
||
|
||
&.is-scrolled {
|
||
box-shadow: 0 4px 12px var(--color-shadow);
|
||
}
|
||
}
|
||
|
||
// Logo area.
|
||
.navbar-logo {
|
||
padding: 0.5rem 0.75rem;
|
||
|
||
img {
|
||
max-height: 2.5rem;
|
||
width: auto;
|
||
}
|
||
}
|
||
|
||
.navbar-site-name {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
font-weight: 700;
|
||
color: var(--color-dark) !important;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.site-title-initial {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 2rem;
|
||
height: 2rem;
|
||
border-radius: 50%;
|
||
background-color: var(--color-primary);
|
||
color: #fff;
|
||
font-weight: 700;
|
||
font-size: 1rem;
|
||
}
|
||
|
||
// Hamburger burger – three-line → X animation.
|
||
.navbar-burger {
|
||
background: transparent;
|
||
border: none;
|
||
padding: 0.5rem;
|
||
transition: opacity var(--transition-base);
|
||
|
||
span {
|
||
display: block;
|
||
width: 1.25rem;
|
||
height: 2px;
|
||
background: var(--color-text);
|
||
margin: 4px 0;
|
||
transition:
|
||
transform 0.3s ease,
|
||
opacity 0.3s ease;
|
||
transform-origin: center;
|
||
}
|
||
|
||
&.is-active span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
|
||
&.is-active span:nth-child(2) { opacity: 0; }
|
||
&.is-active span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
|
||
}
|
||
|
||
// Search widget.
|
||
.navbar-search-wrap {
|
||
position: relative;
|
||
}
|
||
|
||
.navbar-search-toggle {
|
||
background: transparent;
|
||
border: none;
|
||
color: var(--color-text);
|
||
font-size: 1rem;
|
||
padding: 0.25rem 0.5rem;
|
||
transition: color var(--transition-base);
|
||
|
||
&:hover {
|
||
color: var(--color-primary);
|
||
}
|
||
|
||
@include focus-ring;
|
||
}
|
||
|
||
.navbar-search-form {
|
||
position: absolute;
|
||
top: 110%;
|
||
right: 0;
|
||
background: var(--color-background);
|
||
border: 1px solid var(--color-border);
|
||
border-radius: 6px;
|
||
padding: 0.5rem;
|
||
box-shadow: var(--card-shadow);
|
||
min-width: 200px;
|
||
|
||
.input {
|
||
border-color: var(--color-border);
|
||
background: var(--color-background);
|
||
color: var(--color-text);
|
||
}
|
||
}
|
||
|
||
// Dark-mode toggle.
|
||
.theme-toggle {
|
||
background: transparent;
|
||
border: none;
|
||
font-size: 1rem;
|
||
color: var(--color-text);
|
||
padding: 0.25rem 0.5rem;
|
||
transition: color var(--transition-base);
|
||
line-height: 1;
|
||
|
||
&:hover {
|
||
color: var(--color-primary);
|
||
}
|
||
|
||
@include focus-ring;
|
||
}
|
||
|
||
// Show only the relevant icon.
|
||
body:not([data-theme='dark']) .theme-toggle__light-icon { display: none; }
|
||
[data-theme='dark'] .theme-toggle__dark-icon { display: none; }
|
||
|
||
// Back-to-top button.
|
||
.back-to-top {
|
||
position: fixed;
|
||
bottom: 2rem;
|
||
right: 2rem;
|
||
z-index: 200;
|
||
width: 3rem;
|
||
height: 3rem;
|
||
border-radius: 50%;
|
||
background-color: var(--color-primary);
|
||
color: #fff;
|
||
border: none;
|
||
font-size: 1.25rem;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
box-shadow: var(--card-shadow);
|
||
transition:
|
||
opacity var(--transition-base),
|
||
transform var(--transition-base),
|
||
box-shadow var(--transition-base);
|
||
opacity: 0;
|
||
transform: translateY(1rem);
|
||
pointer-events: none;
|
||
|
||
&.is-visible {
|
||
opacity: 1;
|
||
transform: translateY(0);
|
||
pointer-events: auto;
|
||
}
|
||
|
||
&:hover {
|
||
box-shadow: var(--card-shadow-hover);
|
||
}
|
||
|
||
@include focus-ring;
|
||
}
|
||
|
||
// Skip link.
|
||
.skip-link {
|
||
@include visually-hidden;
|
||
|
||
&:focus {
|
||
position: fixed;
|
||
top: var(--space-2);
|
||
left: var(--space-2);
|
||
z-index: 9999;
|
||
background: var(--color-primary);
|
||
color: #fff;
|
||
padding: var(--space-2) var(--space-3);
|
||
border-radius: 4px;
|
||
clip: auto;
|
||
height: auto;
|
||
width: auto;
|
||
font-weight: 700;
|
||
text-decoration: none;
|
||
}
|
||
}
|