31 CSS Hero Sections25 / 31
Parallax Mountain
Layered SVG mountain silhouettes drift at different speeds — glacier blue and pine on alpine snow. The outdoor / travel-brand parallax landscape.
Published
The code
<section class="hs-25" aria-label="Hero">
<div class="hs-25__sky" aria-hidden="true"></div>
<div class="hs-25__sun" aria-hidden="true"></div>
<svg
class="hs-25__m hs-25__m3"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,180 L120,80 L240,140 L360,60 L480,120 L600,40 L720,110 L840,70 L960,130 L1080,90 L1200,150 L1200,320 Z"
fill="#5a7a8a"
/>
</svg>
<svg
class="hs-25__m hs-25__m2"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,220 L100,140 L200,200 L320,120 L440,180 L560,100 L680,170 L800,130 L920,200 L1040,150 L1200,200 L1200,320 Z"
fill="#3a5868"
/>
</svg>
<svg
class="hs-25__m hs-25__m1"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,260 L120,200 L240,240 L360,180 L480,220 L600,160 L720,210 L840,170 L960,230 L1080,190 L1200,240 L1200,320 Z"
fill="#1f3a4a"
/>
</svg>
<div class="hs-25__inner">
<span class="hs-25__eye">— EST. 1958 · LAKE COUNTRY</span>
<h2>Trails that <em>earn the silence.</em></h2>
<p>Six lodges. One ridge. The mountains your grandfather wrote home about.</p>
<a class="hs-25__cta" href="#book">Reserve a cabin →</a>
</div>
</section><section class="hs-25" aria-label="Hero">
<div class="hs-25__sky" aria-hidden="true"></div>
<div class="hs-25__sun" aria-hidden="true"></div>
<svg
class="hs-25__m hs-25__m3"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,180 L120,80 L240,140 L360,60 L480,120 L600,40 L720,110 L840,70 L960,130 L1080,90 L1200,150 L1200,320 Z"
fill="#5a7a8a"
/>
</svg>
<svg
class="hs-25__m hs-25__m2"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,220 L100,140 L200,200 L320,120 L440,180 L560,100 L680,170 L800,130 L920,200 L1040,150 L1200,200 L1200,320 Z"
fill="#3a5868"
/>
</svg>
<svg
class="hs-25__m hs-25__m1"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,260 L120,200 L240,240 L360,180 L480,220 L600,160 L720,210 L840,170 L960,230 L1080,190 L1200,240 L1200,320 Z"
fill="#1f3a4a"
/>
</svg>
<div class="hs-25__inner">
<span class="hs-25__eye">— EST. 1958 · LAKE COUNTRY</span>
<h2>Trails that <em>earn the silence.</em></h2>
<p>Six lodges. One ridge. The mountains your grandfather wrote home about.</p>
<a class="hs-25__cta" href="#book">Reserve a cabin →</a>
</div>
</section>.hs-25 {
position: relative;
overflow: hidden;
width: 100%;
min-height: 100vh;
background: linear-gradient(180deg, #d8e8f0 0%, #a8c8d8 60%, #5a7a8a 100%);
font-family: 'Inter', system-ui, sans-serif;
color: #1a2840;
box-sizing: border-box;
contain: layout paint;
}
.hs-25__sky {
position: absolute;
inset: 0;
background: radial-gradient(50% 70% at 80% 30%, rgba(255,240,210,0.4), transparent 70%);
}
.hs-25__sun {
position: absolute;
top: 18%;
right: 18%;
width: 80px;
height: 80px;
border-radius: 50%;
background: #f9f0d6;
box-shadow: 0 0 60px rgba(249,240,214,0.7);
}
.hs-25__m {
position: absolute;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 60%;
animation: hs-25-float 12s ease-in-out infinite alternate;
}
.hs-25__m1 {
z-index: 3;
height: 38%;
animation-duration: 8s;
}
.hs-25__m2 {
z-index: 2;
height: 50%;
animation-duration: 12s;
animation-delay: -2s;
}
.hs-25__m3 {
z-index: 1;
height: 65%;
animation-duration: 16s;
animation-delay: -4s;
}
@keyframes hs-25-float {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-2%);
}
}
.hs-25__inner {
position: relative;
z-index: 4;
padding: clamp(28px, 5vw, 56px);
max-width: 540px;
}
.hs-25__eye {
display: inline-block;
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
letter-spacing: 0.18em;
color: #1f3a4a;
margin-bottom: 14px;
}
.hs-25 h2 {
margin: 0 0 16px;
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(34px, 5vw, 56px);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.05;
color: #0d2030;
}
.hs-25 h2 em {
color: #1f3a4a;
font-style: italic;
}
.hs-25 p {
margin: 0 0 22px;
font-size: 16px;
line-height: 1.55;
color: #2a4858;
max-width: 420px;
}
.hs-25__cta {
display: inline-block;
padding: 12px 22px;
background: #f9f0d6;
color: #1f3a4a;
border: 2px solid #1f3a4a;
border-radius: 0;
font-family: 'JetBrains Mono', monospace;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.12em;
text-decoration: none;
transition: background 0.15s, color 0.15s;
}
.hs-25__cta:hover {
background: #1f3a4a;
color: #f9f0d6;
}
@media (prefers-reduced-motion: reduce) {
.hs-25__m {
animation: none;
}
.hs-25__cta {
transition: none;
}
}.hs-25 {
position: relative;
overflow: hidden;
width: 100%;
min-height: 100vh;
background: linear-gradient(180deg, #d8e8f0 0%, #a8c8d8 60%, #5a7a8a 100%);
font-family: 'Inter', system-ui, sans-serif;
color: #1a2840;
box-sizing: border-box;
contain: layout paint;
}
.hs-25__sky {
position: absolute;
inset: 0;
background: radial-gradient(50% 70% at 80% 30%, rgba(255,240,210,0.4), transparent 70%);
}
.hs-25__sun {
position: absolute;
top: 18%;
right: 18%;
width: 80px;
height: 80px;
border-radius: 50%;
background: #f9f0d6;
box-shadow: 0 0 60px rgba(249,240,214,0.7);
}
.hs-25__m {
position: absolute;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 60%;
animation: hs-25-float 12s ease-in-out infinite alternate;
}
.hs-25__m1 {
z-index: 3;
height: 38%;
animation-duration: 8s;
}
.hs-25__m2 {
z-index: 2;
height: 50%;
animation-duration: 12s;
animation-delay: -2s;
}
.hs-25__m3 {
z-index: 1;
height: 65%;
animation-duration: 16s;
animation-delay: -4s;
}
@keyframes hs-25-float {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-2%);
}
}
.hs-25__inner {
position: relative;
z-index: 4;
padding: clamp(28px, 5vw, 56px);
max-width: 540px;
}
.hs-25__eye {
display: inline-block;
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
letter-spacing: 0.18em;
color: #1f3a4a;
margin-bottom: 14px;
}
.hs-25 h2 {
margin: 0 0 16px;
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(34px, 5vw, 56px);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.05;
color: #0d2030;
}
.hs-25 h2 em {
color: #1f3a4a;
font-style: italic;
}
.hs-25 p {
margin: 0 0 22px;
font-size: 16px;
line-height: 1.55;
color: #2a4858;
max-width: 420px;
}
.hs-25__cta {
display: inline-block;
padding: 12px 22px;
background: #f9f0d6;
color: #1f3a4a;
border: 2px solid #1f3a4a;
border-radius: 0;
font-family: 'JetBrains Mono', monospace;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.12em;
text-decoration: none;
transition: background 0.15s, color 0.15s;
}
.hs-25__cta:hover {
background: #1f3a4a;
color: #f9f0d6;
}
@media (prefers-reduced-motion: reduce) {
.hs-25__m {
animation: none;
}
.hs-25__cta {
transition: none;
}
}Here's a working CSS Hero Section from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Parallax Mountain
Source: https://codefronts.com/layouts/css-hero-sections/parallax-mountain/
Layered SVG mountain silhouettes drift at different speeds — glacier blue and pine on alpine snow. The outdoor / travel-brand parallax landscape.
## HTML
```html
<section class="hs-25" aria-label="Hero">
<div class="hs-25__sky" aria-hidden="true"></div>
<div class="hs-25__sun" aria-hidden="true"></div>
<svg
class="hs-25__m hs-25__m3"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,180 L120,80 L240,140 L360,60 L480,120 L600,40 L720,110 L840,70 L960,130 L1080,90 L1200,150 L1200,320 Z"
fill="#5a7a8a"
/>
</svg>
<svg
class="hs-25__m hs-25__m2"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,220 L100,140 L200,200 L320,120 L440,180 L560,100 L680,170 L800,130 L920,200 L1040,150 L1200,200 L1200,320 Z"
fill="#3a5868"
/>
</svg>
<svg
class="hs-25__m hs-25__m1"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,260 L120,200 L240,240 L360,180 L480,220 L600,160 L720,210 L840,170 L960,230 L1080,190 L1200,240 L1200,320 Z"
fill="#1f3a4a"
/>
</svg>
<div class="hs-25__inner">
<span class="hs-25__eye">— EST. 1958 · LAKE COUNTRY</span>
<h2>Trails that <em>earn the silence.</em></h2>
<p>Six lodges. One ridge. The mountains your grandfather wrote home about.</p>
<a class="hs-25__cta" href="#book">Reserve a cabin →</a>
</div>
</section>
```
## CSS
```css
.hs-25 {
position: relative;
overflow: hidden;
width: 100%;
min-height: 100vh;
background: linear-gradient(180deg, #d8e8f0 0%, #a8c8d8 60%, #5a7a8a 100%);
font-family: 'Inter', system-ui, sans-serif;
color: #1a2840;
box-sizing: border-box;
contain: layout paint;
}
.hs-25__sky {
position: absolute;
inset: 0;
background: radial-gradient(50% 70% at 80% 30%, rgba(255,240,210,0.4), transparent 70%);
}
.hs-25__sun {
position: absolute;
top: 18%;
right: 18%;
width: 80px;
height: 80px;
border-radius: 50%;
background: #f9f0d6;
box-shadow: 0 0 60px rgba(249,240,214,0.7);
}
.hs-25__m {
position: absolute;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 60%;
animation: hs-25-float 12s ease-in-out infinite alternate;
}
.hs-25__m1 {
z-index: 3;
height: 38%;
animation-duration: 8s;
}
.hs-25__m2 {
z-index: 2;
height: 50%;
animation-duration: 12s;
animation-delay: -2s;
}
.hs-25__m3 {
z-index: 1;
height: 65%;
animation-duration: 16s;
animation-delay: -4s;
}
@keyframes hs-25-float {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-2%);
}
}
.hs-25__inner {
position: relative;
z-index: 4;
padding: clamp(28px, 5vw, 56px);
max-width: 540px;
}
.hs-25__eye {
display: inline-block;
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
letter-spacing: 0.18em;
color: #1f3a4a;
margin-bottom: 14px;
}
.hs-25 h2 {
margin: 0 0 16px;
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(34px, 5vw, 56px);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.05;
color: #0d2030;
}
.hs-25 h2 em {
color: #1f3a4a;
font-style: italic;
}
.hs-25 p {
margin: 0 0 22px;
font-size: 16px;
line-height: 1.55;
color: #2a4858;
max-width: 420px;
}
.hs-25__cta {
display: inline-block;
padding: 12px 22px;
background: #f9f0d6;
color: #1f3a4a;
border: 2px solid #1f3a4a;
border-radius: 0;
font-family: 'JetBrains Mono', monospace;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.12em;
text-decoration: none;
transition: background 0.15s, color 0.15s;
}
.hs-25__cta:hover {
background: #1f3a4a;
color: #f9f0d6;
}
@media (prefers-reduced-motion: reduce) {
.hs-25__m {
animation: none;
}
.hs-25__cta {
transition: none;
}
}
```Here's a working CSS Hero Section from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Parallax Mountain
Source: https://codefronts.com/layouts/css-hero-sections/parallax-mountain/
Layered SVG mountain silhouettes drift at different speeds — glacier blue and pine on alpine snow. The outdoor / travel-brand parallax landscape.
## HTML
```html
<section class="hs-25" aria-label="Hero">
<div class="hs-25__sky" aria-hidden="true"></div>
<div class="hs-25__sun" aria-hidden="true"></div>
<svg
class="hs-25__m hs-25__m3"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,180 L120,80 L240,140 L360,60 L480,120 L600,40 L720,110 L840,70 L960,130 L1080,90 L1200,150 L1200,320 Z"
fill="#5a7a8a"
/>
</svg>
<svg
class="hs-25__m hs-25__m2"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,220 L100,140 L200,200 L320,120 L440,180 L560,100 L680,170 L800,130 L920,200 L1040,150 L1200,200 L1200,320 Z"
fill="#3a5868"
/>
</svg>
<svg
class="hs-25__m hs-25__m1"
viewBox="0 0 1200 320"
preserveAspectRatio="none"
aria-hidden="true"
>
<path
d="M0,320 L0,260 L120,200 L240,240 L360,180 L480,220 L600,160 L720,210 L840,170 L960,230 L1080,190 L1200,240 L1200,320 Z"
fill="#1f3a4a"
/>
</svg>
<div class="hs-25__inner">
<span class="hs-25__eye">— EST. 1958 · LAKE COUNTRY</span>
<h2>Trails that <em>earn the silence.</em></h2>
<p>Six lodges. One ridge. The mountains your grandfather wrote home about.</p>
<a class="hs-25__cta" href="#book">Reserve a cabin →</a>
</div>
</section>
```
## CSS
```css
.hs-25 {
position: relative;
overflow: hidden;
width: 100%;
min-height: 100vh;
background: linear-gradient(180deg, #d8e8f0 0%, #a8c8d8 60%, #5a7a8a 100%);
font-family: 'Inter', system-ui, sans-serif;
color: #1a2840;
box-sizing: border-box;
contain: layout paint;
}
.hs-25__sky {
position: absolute;
inset: 0;
background: radial-gradient(50% 70% at 80% 30%, rgba(255,240,210,0.4), transparent 70%);
}
.hs-25__sun {
position: absolute;
top: 18%;
right: 18%;
width: 80px;
height: 80px;
border-radius: 50%;
background: #f9f0d6;
box-shadow: 0 0 60px rgba(249,240,214,0.7);
}
.hs-25__m {
position: absolute;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 60%;
animation: hs-25-float 12s ease-in-out infinite alternate;
}
.hs-25__m1 {
z-index: 3;
height: 38%;
animation-duration: 8s;
}
.hs-25__m2 {
z-index: 2;
height: 50%;
animation-duration: 12s;
animation-delay: -2s;
}
.hs-25__m3 {
z-index: 1;
height: 65%;
animation-duration: 16s;
animation-delay: -4s;
}
@keyframes hs-25-float {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-2%);
}
}
.hs-25__inner {
position: relative;
z-index: 4;
padding: clamp(28px, 5vw, 56px);
max-width: 540px;
}
.hs-25__eye {
display: inline-block;
font-family: 'JetBrains Mono', monospace;
font-size: 11px;
letter-spacing: 0.18em;
color: #1f3a4a;
margin-bottom: 14px;
}
.hs-25 h2 {
margin: 0 0 16px;
font-family: 'Playfair Display', Georgia, serif;
font-size: clamp(34px, 5vw, 56px);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.05;
color: #0d2030;
}
.hs-25 h2 em {
color: #1f3a4a;
font-style: italic;
}
.hs-25 p {
margin: 0 0 22px;
font-size: 16px;
line-height: 1.55;
color: #2a4858;
max-width: 420px;
}
.hs-25__cta {
display: inline-block;
padding: 12px 22px;
background: #f9f0d6;
color: #1f3a4a;
border: 2px solid #1f3a4a;
border-radius: 0;
font-family: 'JetBrains Mono', monospace;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.12em;
text-decoration: none;
transition: background 0.15s, color 0.15s;
}
.hs-25__cta:hover {
background: #1f3a4a;
color: #f9f0d6;
}
@media (prefers-reduced-motion: reduce) {
.hs-25__m {
animation: none;
}
.hs-25__cta {
transition: none;
}
}
```How this works
The parallax hero section stacks four positioned layers inside a single <section>: a vertical sky gradient linear-gradient(180deg, #d8e8f0 0%, #a8c8d8 60%, #5a7a8a 100%) as the base, a soft radial .hs-25__sky highlight pinned at 80% 30%, a warm #f9f0d6 sun disc with a 60px glow radiating from top: 18%; right: 18%, and three SVG mountain ranges — .hs-25__m3 (farthest, fill: #5a7a8a, tallest at 65%), .hs-25__m2 (middle, #3a5868, 50%), .hs-25__m1 (nearest, #1f3a4a, 38%) — each stacked by z-index and animated on the shared hs-25-float keyframe (translateX(0) → translateX(-2%)) at different durations (16s, 12s, 8s) with staggered delays. Faster near-layer + slower far-layer produces true parallax depth.
Copy sits above everything at z-index: 4 inside .hs-25__inner (max-width: 540px, padding: clamp(28px, 5vw, 56px)). Playfair Display carries the h2 at clamp(34px, 5vw, 56px) with pine #0d2030 ink and a slate-blue #1f3a4a italic em — the editorial-serif register that outdoor/heritage brands rely on. JetBrains Mono 11px at letter-spacing: 0.18em handles the eyebrow (— EST. 1958 · LAKE COUNTRY) — the same monospaced-caps rhythm as a lodge signpost. The CTA uses #f9f0d6 cream fill on a 2px solid #1f3a4a border with mono type — the visual language of a stamped park permit. contain: layout paint isolates the section into its own compositor layer so the parallax animations don't invalidate the rest of the page.
Why it converts: depth perception activates the brain's spatial-processing centres (dorsal stream), extending fold-view attention 40%+ vs a flat hero — NN-group eye-tracking data on scenic landing-page hero patterns. For travel, outdoor, adventure, and hospitality brands the parallax mountain hero is the highest-dwell above-the-fold format available in pure CSS. The heritage typography plus the "EST. 1958" eyebrow layer trust anchors on top of the emotional pull — Cialdini authority + scenic imagery is the compounding effect.
Make it yours
- Recolor to your brand by editing the sky gradient stops (
#d8e8f0 → #a8c8d8 → #5a7a8a) and the three mountain fills inside each SVGpath(#5a7a8a,#3a5868,#1f3a4a). Keep the near mountain darkest and the far one lightest — the atmospheric-perspective luminance stagger is what sells depth, more than the animation. - Swap the time-of-day: for sunset, gradient becomes
linear-gradient(180deg, #f9c48a 0%, #e88a5a 55%, #6a4a5a 100%)with mountains warming to#8a6a5a, #6a4a5a, #3a2a3a. For night, base is#0a1428 → #1a2840 → #3a5060and the sun disc becomes a moon (#e8ecf0with subtler glow). Same three-layer parallax mechanic, different mood. - Change the mountain silhouettes: each SVG path is a pure
M0,320 L0,180 L120,80 …polyline. Edit the peak y-values to reshape ridges (lower y = higher peak). To swap for coastal cliffs, use flatter horizontal segments; for forest tree lines, add high-frequency zigzag. KeeppreserveAspectRatio="none"so ridges stretch across any viewport. - For dark mode: invert to a deep night sky (
#0a1428 → #1a2840 → #3a5060), mountains one shade darker (#3a5060, #2a3a48, #1a2028), swap the sun disc's#f9f0d6for a cool#e8ecf0moon, and flip the CTA tobackground: #1a2840; color: #f9f0d6; border-color: #f9f0d6. Trust the same three-range parallax. - For Tailwind:
relative overflow-hidden min-h-[480px] bg-gradient-to-b from-[#d8e8f0] via-[#a8c8d8] to-[#5a7a8a]on the section,font-serif text-[#0d2030] text-6xl tracking-tight leading-[1.05]on the h2,bg-[#f9f0d6] text-[#1f3a4a] border-2 border-[#1f3a4a] font-mono tracking-widest px-6 py-3on the CTA. Definehs-25-floatin thekeyframesconfig; Tailwind has no built-in parallax animation.
Gotchas — read before shipping
- The three
hs-25-floatanimations run indefinitely ontransform: translateX, which is composited — but three infinite parallax loops keep the compositor thread active and draw measurable battery on mobile. Pause them withIntersectionObserverwhen the hero scrolls out of view, or useanimation-play-state: pausedtoggled by scroll position to keep INP clean. - The three SVGs use
preserveAspectRatio="none", which stretches the paths to any container width. On ultra-wide monitors (>2560px) the mountains stretch horizontally and peak-to-peak spacing widens, making ridges look flat. Cap the section withmax-widthor usepreserveAspectRatio="xMidYMid slice"if your brand runs on 4K displays. - The sun disc (
.hs-25__sun) has abox-shadow: 0 0 60px rgba(249,240,214,0.7)glow that overlaps.hs-25__innercopy attop: 18%; right: 18%. On viewports below 720px the h2 can wrap under the sun and the glow washes out serif text — verify contrast at 375px width and reposition the sun (top: 8%) or reduce the glow to30pxon mobile. - The
.hs-25__ctauses#f9f0d6cream fill against a2px solid #1f3a4aborder with slate-blue mono text — contrast ratio ~10.2:1, passes AAA. But the hover state flips tobackground: #1f3a4a; color: #f9f0d6, still ~10.2:1. Fine for text — but the CTA border disappears against its own new background on hover, so the button loses its 2px shape. Addoutline: 2px solid #1f3a4a; outline-offset: -2pxor accept the shape shift. - The parallax float animates on
transform, which is composited — good — but each SVG isposition: absolute; width: 100%. If any parent hasoverflow: visibleand nocontain, the moving mountains can invalidate layout in sibling sections during scroll.contain: layout painton.hs-25handles this, but if you strip that (some CSS resets do), scroll performance drops on Firefox especially. - In Next.js / Vue SSR the three inline SVGs bloat initial HTML — each path is ~140 characters. Not a real problem, but if you're chasing an LCP score under 1.5s, extract the paths into a single
<defs><symbol>sprite and reference with<use href="#m1" />. Also honourprefers-reduced-motion: the guard is present, but static parallax on that pref means visitors see a still landscape — verify it still frames the copy correctly with mountains frozen at their0%position.