Files
2026-04-29 19:04:20 +08:00

193 lines
3.7 KiB
SCSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// =============================================================================
// 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;
}
}