mirror of
https://github.com/myronblair/parkerslingshotrentals
synced 2026-06-30 17:50:31 -05:00
Add mobile hamburger nav with animated drawer
Hamburger button appears on screens ≤768px. Tapping opens a full-screen drawer with all nav links + Book Now CTA. Closes on link tap, Escape key, or toggling the button. Body scroll locks while drawer is open. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+118
-1
@@ -420,9 +420,90 @@
|
|||||||
.footer-links a { color: rgba(255,255,255,0.4); text-decoration: none; font-size: 0.85rem; transition: color 0.2s; }
|
.footer-links a { color: rgba(255,255,255,0.4); text-decoration: none; font-size: 0.85rem; transition: color 0.2s; }
|
||||||
.footer-links a:hover { color: var(--orange); }
|
.footer-links a:hover { color: var(--orange); }
|
||||||
|
|
||||||
/* RESPONSIVE NAV */
|
/* HAMBURGER / MOBILE NAV */
|
||||||
|
.nav-hamburger {
|
||||||
|
display: none;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 5px;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 6px;
|
||||||
|
border-radius: 6px;
|
||||||
|
transition: background 0.2s;
|
||||||
|
z-index: 101;
|
||||||
|
}
|
||||||
|
.nav-hamburger:hover { background: rgba(255,255,255,0.07); }
|
||||||
|
.nav-hamburger span {
|
||||||
|
display: block;
|
||||||
|
width: 24px;
|
||||||
|
height: 2px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: transform 0.25s, opacity 0.25s;
|
||||||
|
transform-origin: center;
|
||||||
|
}
|
||||||
|
.nav-hamburger.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
|
||||||
|
.nav-hamburger.open span:nth-child(2) { opacity: 0; transform: scaleX(0); }
|
||||||
|
.nav-hamburger.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
|
||||||
|
|
||||||
|
.nav-drawer {
|
||||||
|
display: none;
|
||||||
|
position: fixed;
|
||||||
|
top: 0; left: 0; right: 0; bottom: 0;
|
||||||
|
z-index: 99;
|
||||||
|
flex-direction: column;
|
||||||
|
padding-top: 72px;
|
||||||
|
background: rgba(13,13,13,0.97);
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
animation: drawerIn 0.22s ease;
|
||||||
|
}
|
||||||
|
@keyframes drawerIn {
|
||||||
|
from { opacity: 0; transform: translateY(-8px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
.nav-drawer.open { display: flex; }
|
||||||
|
.nav-drawer ul {
|
||||||
|
list-style: none;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 1.5rem 2rem;
|
||||||
|
gap: 0;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.nav-drawer ul li a {
|
||||||
|
display: block;
|
||||||
|
padding: 1rem 0;
|
||||||
|
color: rgba(255,255,255,0.85);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
font-weight: 600;
|
||||||
|
border-bottom: 1px solid rgba(255,255,255,0.07);
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
.nav-drawer ul li:last-child a { border-bottom: none; }
|
||||||
|
.nav-drawer ul li a:hover { color: var(--orange); }
|
||||||
|
.nav-drawer .drawer-cta {
|
||||||
|
margin: 1rem 2rem 2.5rem;
|
||||||
|
}
|
||||||
|
.nav-drawer .drawer-cta a {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
background: var(--orange);
|
||||||
|
color: white;
|
||||||
|
padding: 1rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.nav-drawer .drawer-cta a:hover { background: var(--orange-dark); }
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.nav-links { display: none; }
|
.nav-links { display: none; }
|
||||||
|
.nav-cta { display: none; }
|
||||||
|
.nav-hamburger { display: flex; }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@@ -439,8 +520,24 @@
|
|||||||
<li><a href="#faq">FAQ</a></li>
|
<li><a href="#faq">FAQ</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="#contact" class="nav-cta">Book Now</a>
|
<a href="#contact" class="nav-cta">Book Now</a>
|
||||||
|
<button class="nav-hamburger" id="navToggle" aria-label="Toggle menu" aria-expanded="false" aria-controls="navDrawer">
|
||||||
|
<span></span><span></span><span></span>
|
||||||
|
</button>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
<!-- Mobile Drawer -->
|
||||||
|
<div class="nav-drawer" id="navDrawer" role="dialog" aria-label="Mobile navigation">
|
||||||
|
<ul>
|
||||||
|
<li><a href="#why">Why Us</a></li>
|
||||||
|
<li><a href="#pricing">Pricing</a></li>
|
||||||
|
<li><a href="#how">How It Works</a></li>
|
||||||
|
<li><a href="#routes">Routes</a></li>
|
||||||
|
<li><a href="#faq">FAQ</a></li>
|
||||||
|
<li><a href="#contact">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="drawer-cta"><a href="#contact">Book Now</a></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Hero -->
|
<!-- Hero -->
|
||||||
<header class="hero" role="banner">
|
<header class="hero" role="banner">
|
||||||
<div style="position:relative;z-index:1;">
|
<div style="position:relative;z-index:1;">
|
||||||
@@ -733,6 +830,26 @@
|
|||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
// ── Mobile nav ───────────────────────────────────────────────────────────────
|
||||||
|
const navToggle = document.getElementById('navToggle');
|
||||||
|
const navDrawer = document.getElementById('navDrawer');
|
||||||
|
function closeDrawer() {
|
||||||
|
navToggle.classList.remove('open');
|
||||||
|
navDrawer.classList.remove('open');
|
||||||
|
navToggle.setAttribute('aria-expanded', 'false');
|
||||||
|
document.body.style.overflow = '';
|
||||||
|
}
|
||||||
|
navToggle.addEventListener('click', () => {
|
||||||
|
const isOpen = navDrawer.classList.toggle('open');
|
||||||
|
navToggle.classList.toggle('open', isOpen);
|
||||||
|
navToggle.setAttribute('aria-expanded', String(isOpen));
|
||||||
|
document.body.style.overflow = isOpen ? 'hidden' : '';
|
||||||
|
});
|
||||||
|
// Close on any link click inside drawer
|
||||||
|
navDrawer.querySelectorAll('a').forEach(a => a.addEventListener('click', closeDrawer));
|
||||||
|
// Close on Escape key
|
||||||
|
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeDrawer(); });
|
||||||
|
|
||||||
// ── Availability Calendar ────────────────────────────────────────────────────
|
// ── Availability Calendar ────────────────────────────────────────────────────
|
||||||
const dateInput = document.querySelector('input[type="date"]');
|
const dateInput = document.querySelector('input[type="date"]');
|
||||||
const calGrid = document.getElementById('calGrid');
|
const calGrid = document.getElementById('calGrid');
|
||||||
|
|||||||
Reference in New Issue
Block a user